]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/loop.c
Merge remote-tracking branch 'block/for-next'
[karo-tx-linux.git] / drivers / block / loop.c
index e5647690a751ef1f1ea6bcd09ee24dc758a1e292..abe147aee19d2b7b3c243a46b38cb3b0c55831a7 100644 (file)
@@ -962,13 +962,6 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
 
        bio_list_init(&lo->lo_bio_list);
 
-       /*
-        * set queue make_request_fn, and add limits based on lower level
-        * device
-        */
-       blk_queue_make_request(lo->lo_queue, loop_make_request);
-       lo->lo_queue->queuedata = lo;
-
        if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync)
                blk_queue_flush(lo->lo_queue, REQ_FLUSH);
 
@@ -1696,6 +1689,8 @@ static int loop_add(struct loop_device **l, int i)
        if (!lo)
                goto out;
 
+       lo->lo_state = Lo_unbound;
+
        /* allocate id, if @id >= 0, we're requesting that specific id */
        if (i >= 0) {
                err = idr_alloc(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
@@ -1711,7 +1706,13 @@ static int loop_add(struct loop_device **l, int i)
        err = -ENOMEM;
        lo->lo_queue = blk_alloc_queue(GFP_KERNEL);
        if (!lo->lo_queue)
-               goto out_free_dev;
+               goto out_free_idr;
+
+       /*
+        * set queue make_request_fn
+        */
+       blk_queue_make_request(lo->lo_queue, loop_make_request);
+       lo->lo_queue->queuedata = lo;
 
        disk = lo->lo_disk = alloc_disk(1 << part_shift);
        if (!disk)
@@ -1756,6 +1757,8 @@ static int loop_add(struct loop_device **l, int i)
 
 out_free_queue:
        blk_cleanup_queue(lo->lo_queue);
+out_free_idr:
+       idr_remove(&loop_index_idr, i);
 out_free_dev:
        kfree(lo);
 out:
@@ -1819,7 +1822,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
        if (err < 0)
                err = loop_add(&lo, MINOR(dev) >> part_shift);
        if (err < 0)
-               kobj = ERR_PTR(err);
+               kobj = NULL;
        else
                kobj = get_disk(lo->lo_disk);
        mutex_unlock(&loop_index_mutex);