msg[num-1].len++;
        }
 
-       status = i2c_transfer(adapter, msg, num);
+       status = __i2c_transfer(adapter, msg, num);
        if (status < 0)
                goto cleanup;
        if (status != num) {
  * This executes an SMBus protocol operation, and returns a negative
  * errno code else zero on success.
  */
-s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
-                  char read_write, u8 command, int protocol,
-                  union i2c_smbus_data *data)
+s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
+                  unsigned short flags, char read_write,
+                  u8 command, int protocol, union i2c_smbus_data *data)
+{
+       s32 res;
+
+       i2c_lock_bus(adapter, I2C_LOCK_SEGMENT);
+       res = __i2c_smbus_xfer(adapter, addr, flags, read_write,
+                              command, protocol, data);
+       i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
+
+       return res;
+}
+EXPORT_SYMBOL(i2c_smbus_xfer);
+
+s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
+                    unsigned short flags, char read_write,
+                    u8 command, int protocol, union i2c_smbus_data *data)
 {
        unsigned long orig_jiffies;
        int try;
        flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
 
        if (adapter->algo->smbus_xfer) {
-               i2c_lock_bus(adapter, I2C_LOCK_SEGMENT);
-
                /* Retry automatically on arbitration loss */
                orig_jiffies = jiffies;
                for (res = 0, try = 0; try <= adapter->retries; try++) {
                                       orig_jiffies + adapter->timeout))
                                break;
                }
-               i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
 
                if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
                        goto trace;
 
        return res;
 }
-EXPORT_SYMBOL(i2c_smbus_xfer);
+EXPORT_SYMBOL(__i2c_smbus_xfer);
 
 /**
  * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
 
    and probably just as fast.
    Note that we use i2c_adapter here, because you do not need a specific
    smbus adapter to call this function. */
-extern s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
-                         unsigned short flags, char read_write, u8 command,
-                         int size, union i2c_smbus_data *data);
+s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
+                  unsigned short flags, char read_write, u8 command,
+                  int protocol, union i2c_smbus_data *data);
+
+/* Unlocked flavor */
+s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
+                    unsigned short flags, char read_write, u8 command,
+                    int protocol, union i2c_smbus_data *data);
 
 /* Now follow the 'nice' access routines. These also document the calling
    conventions of i2c_smbus_xfer. */