diff options
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 0a54c588e433..27b71a0b72d0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -342,7 +342,6 @@ struct rbd_device { | |||
342 | 342 | ||
343 | struct list_head rq_queue; /* incoming rq queue */ | 343 | struct list_head rq_queue; /* incoming rq queue */ |
344 | spinlock_t lock; /* queue, flags, open_count */ | 344 | spinlock_t lock; /* queue, flags, open_count */ |
345 | struct workqueue_struct *rq_wq; | ||
346 | struct work_struct rq_work; | 345 | struct work_struct rq_work; |
347 | 346 | ||
348 | struct rbd_image_header header; | 347 | struct rbd_image_header header; |
@@ -402,6 +401,8 @@ static struct kmem_cache *rbd_segment_name_cache; | |||
402 | static int rbd_major; | 401 | static int rbd_major; |
403 | static DEFINE_IDA(rbd_dev_id_ida); | 402 | static DEFINE_IDA(rbd_dev_id_ida); |
404 | 403 | ||
404 | static struct workqueue_struct *rbd_wq; | ||
405 | |||
405 | /* | 406 | /* |
406 | * Default to false for now, as single-major requires >= 0.75 version of | 407 | * Default to false for now, as single-major requires >= 0.75 version of |
407 | * userspace rbd utility. | 408 | * userspace rbd utility. |
@@ -3452,7 +3453,7 @@ static void rbd_request_fn(struct request_queue *q) | |||
3452 | } | 3453 | } |
3453 | 3454 | ||
3454 | if (queued) | 3455 | if (queued) |
3455 | queue_work(rbd_dev->rq_wq, &rbd_dev->rq_work); | 3456 | queue_work(rbd_wq, &rbd_dev->rq_work); |
3456 | } | 3457 | } |
3457 | 3458 | ||
3458 | /* | 3459 | /* |
@@ -3532,7 +3533,7 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, | |||
3532 | page_count = (u32) calc_pages_for(offset, length); | 3533 | page_count = (u32) calc_pages_for(offset, length); |
3533 | pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); | 3534 | pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); |
3534 | if (IS_ERR(pages)) | 3535 | if (IS_ERR(pages)) |
3535 | ret = PTR_ERR(pages); | 3536 | return PTR_ERR(pages); |
3536 | 3537 | ||
3537 | ret = -ENOMEM; | 3538 | ret = -ENOMEM; |
3538 | obj_request = rbd_obj_request_create(object_name, offset, length, | 3539 | obj_request = rbd_obj_request_create(object_name, offset, length, |
@@ -5242,16 +5243,9 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
5242 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); | 5243 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); |
5243 | set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); | 5244 | set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); |
5244 | 5245 | ||
5245 | rbd_dev->rq_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, | ||
5246 | rbd_dev->disk->disk_name); | ||
5247 | if (!rbd_dev->rq_wq) { | ||
5248 | ret = -ENOMEM; | ||
5249 | goto err_out_mapping; | ||
5250 | } | ||
5251 | |||
5252 | ret = rbd_bus_add_dev(rbd_dev); | 5246 | ret = rbd_bus_add_dev(rbd_dev); |
5253 | if (ret) | 5247 | if (ret) |
5254 | goto err_out_workqueue; | 5248 | goto err_out_mapping; |
5255 | 5249 | ||
5256 | /* Everything's ready. Announce the disk to the world. */ | 5250 | /* Everything's ready. Announce the disk to the world. */ |
5257 | 5251 | ||
@@ -5263,9 +5257,6 @@ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) | |||
5263 | 5257 | ||
5264 | return ret; | 5258 | return ret; |
5265 | 5259 | ||
5266 | err_out_workqueue: | ||
5267 | destroy_workqueue(rbd_dev->rq_wq); | ||
5268 | rbd_dev->rq_wq = NULL; | ||
5269 | err_out_mapping: | 5260 | err_out_mapping: |
5270 | rbd_dev_mapping_clear(rbd_dev); | 5261 | rbd_dev_mapping_clear(rbd_dev); |
5271 | err_out_disk: | 5262 | err_out_disk: |
@@ -5512,7 +5503,6 @@ static void rbd_dev_device_release(struct device *dev) | |||
5512 | { | 5503 | { |
5513 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); | 5504 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); |
5514 | 5505 | ||
5515 | destroy_workqueue(rbd_dev->rq_wq); | ||
5516 | rbd_free_disk(rbd_dev); | 5506 | rbd_free_disk(rbd_dev); |
5517 | clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); | 5507 | clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); |
5518 | rbd_dev_mapping_clear(rbd_dev); | 5508 | rbd_dev_mapping_clear(rbd_dev); |
@@ -5716,11 +5706,21 @@ static int __init rbd_init(void) | |||
5716 | if (rc) | 5706 | if (rc) |
5717 | return rc; | 5707 | return rc; |
5718 | 5708 | ||
5709 | /* | ||
5710 | * The number of active work items is limited by the number of | ||
5711 | * rbd devices, so leave @max_active at default. | ||
5712 | */ | ||
5713 | rbd_wq = alloc_workqueue(RBD_DRV_NAME, WQ_MEM_RECLAIM, 0); | ||
5714 | if (!rbd_wq) { | ||
5715 | rc = -ENOMEM; | ||
5716 | goto err_out_slab; | ||
5717 | } | ||
5718 | |||
5719 | if (single_major) { | 5719 | if (single_major) { |
5720 | rbd_major = register_blkdev(0, RBD_DRV_NAME); | 5720 | rbd_major = register_blkdev(0, RBD_DRV_NAME); |
5721 | if (rbd_major < 0) { | 5721 | if (rbd_major < 0) { |
5722 | rc = rbd_major; | 5722 | rc = rbd_major; |
5723 | goto err_out_slab; | 5723 | goto err_out_wq; |
5724 | } | 5724 | } |
5725 | } | 5725 | } |
5726 | 5726 | ||
@@ -5738,6 +5738,8 @@ static int __init rbd_init(void) | |||
5738 | err_out_blkdev: | 5738 | err_out_blkdev: |
5739 | if (single_major) | 5739 | if (single_major) |
5740 | unregister_blkdev(rbd_major, RBD_DRV_NAME); | 5740 | unregister_blkdev(rbd_major, RBD_DRV_NAME); |
5741 | err_out_wq: | ||
5742 | destroy_workqueue(rbd_wq); | ||
5741 | err_out_slab: | 5743 | err_out_slab: |
5742 | rbd_slab_exit(); | 5744 | rbd_slab_exit(); |
5743 | return rc; | 5745 | return rc; |
@@ -5749,6 +5751,7 @@ static void __exit rbd_exit(void) | |||
5749 | rbd_sysfs_cleanup(); | 5751 | rbd_sysfs_cleanup(); |
5750 | if (single_major) | 5752 | if (single_major) |
5751 | unregister_blkdev(rbd_major, RBD_DRV_NAME); | 5753 | unregister_blkdev(rbd_major, RBD_DRV_NAME); |
5754 | destroy_workqueue(rbd_wq); | ||
5752 | rbd_slab_exit(); | 5755 | rbd_slab_exit(); |
5753 | } | 5756 | } |
5754 | 5757 | ||