Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / target / target_core_user.c
index 5831e0e..9704b13 100644 (file)
@@ -1663,7 +1663,7 @@ static void tcmu_dev_kref_release(struct kref *kref)
        WARN_ON(!all_expired);
 
        tcmu_blocks_release(&udev->data_blocks, 0, udev->dbi_max + 1);
-       kfree(udev->data_bitmap);
+       bitmap_free(udev->data_bitmap);
        mutex_unlock(&udev->cmdr_lock);
 
        call_rcu(&dev->rcu_head, tcmu_dev_call_rcu);
@@ -1794,11 +1794,12 @@ static int tcmu_netlink_event_send(struct tcmu_dev *udev,
 
        ret = genlmsg_multicast_allns(&tcmu_genl_family, skb, 0,
                                      TCMU_MCGRP_CONFIG, GFP_KERNEL);
-       /* We don't care if no one is listening */
-       if (ret == -ESRCH)
-               ret = 0;
-       if (!ret)
-               ret = tcmu_wait_genl_cmd_reply(udev);
+
+       /* Wait during an add as the listener may not be up yet */
+       if (ret == 0 ||
+          (ret == -ESRCH && cmd == TCMU_CMD_ADDED_DEVICE))
+               return tcmu_wait_genl_cmd_reply(udev);
+
        return ret;
 }
 
@@ -1870,9 +1871,7 @@ static int tcmu_configure_device(struct se_device *dev)
        info = &udev->uio_info;
 
        mutex_lock(&udev->cmdr_lock);
-       udev->data_bitmap = kcalloc(BITS_TO_LONGS(udev->max_blocks),
-                                   sizeof(unsigned long),
-                                   GFP_KERNEL);
+       udev->data_bitmap = bitmap_zalloc(udev->max_blocks, GFP_KERNEL);
        mutex_unlock(&udev->cmdr_lock);
        if (!udev->data_bitmap) {
                ret = -ENOMEM;
@@ -1959,7 +1958,7 @@ err_register:
        vfree(udev->mb_addr);
        udev->mb_addr = NULL;
 err_vzalloc:
-       kfree(udev->data_bitmap);
+       bitmap_free(udev->data_bitmap);
        udev->data_bitmap = NULL;
 err_bitmap_alloc:
        kfree(info->name);