diff options
author | Guo Chao <yan@linux.vnet.ibm.com> | 2013-02-21 18:16:47 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2013-02-22 04:43:22 -0500 |
commit | 7b0576a3d835b4d46ed85d817ce016e90bf293a3 (patch) | |
tree | 9c9d9780f3ef794e8d20d2057a722bcab843fad5 /drivers/block/loop.c | |
parent | 541c742a7559eb65f0e36d3e2338c2ca532a3e61 (diff) |
loopdev: move common code into loop_figure_size()
Update block device size in accord with gendisk size and let userspace
know the change in loop_figure_size(). This is a clean up to remove
common code of loop_figure_size()'s two callers.
Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Guo Chao <yan@linux.vnet.ibm.com>
Cc: M. Hindess <hindessm@uk.ibm.com>
Cc: Nikanth Karthikesan <knikanth@suse.de>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r-- | drivers/block/loop.c | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ed850366f22d..6579f69fd7a4 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -190,6 +190,7 @@ figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit) | |||
190 | { | 190 | { |
191 | loff_t size = get_size(offset, sizelimit, lo->lo_backing_file); | 191 | loff_t size = get_size(offset, sizelimit, lo->lo_backing_file); |
192 | sector_t x = (sector_t)size; | 192 | sector_t x = (sector_t)size; |
193 | struct block_device *bdev = lo->lo_device; | ||
193 | 194 | ||
194 | if (unlikely((loff_t)x != size)) | 195 | if (unlikely((loff_t)x != size)) |
195 | return -EFBIG; | 196 | return -EFBIG; |
@@ -198,6 +199,9 @@ figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit) | |||
198 | if (lo->lo_sizelimit != sizelimit) | 199 | if (lo->lo_sizelimit != sizelimit) |
199 | lo->lo_sizelimit = sizelimit; | 200 | lo->lo_sizelimit = sizelimit; |
200 | set_capacity(lo->lo_disk, x); | 201 | set_capacity(lo->lo_disk, x); |
202 | bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9); | ||
203 | /* let user-space know about the new size */ | ||
204 | kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); | ||
201 | return 0; | 205 | return 0; |
202 | } | 206 | } |
203 | 207 | ||
@@ -1091,15 +1095,10 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) | |||
1091 | return err; | 1095 | return err; |
1092 | 1096 | ||
1093 | if (lo->lo_offset != info->lo_offset || | 1097 | if (lo->lo_offset != info->lo_offset || |
1094 | lo->lo_sizelimit != info->lo_sizelimit) { | 1098 | lo->lo_sizelimit != info->lo_sizelimit) |
1095 | struct block_device *bdev = lo->lo_device; | ||
1096 | |||
1097 | if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) | 1099 | if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) |
1098 | return -EFBIG; | 1100 | return -EFBIG; |
1099 | 1101 | ||
1100 | bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9); | ||
1101 | kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); | ||
1102 | } | ||
1103 | loop_config_discard(lo); | 1102 | loop_config_discard(lo); |
1104 | 1103 | ||
1105 | memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE); | 1104 | memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE); |
@@ -1276,26 +1275,10 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) { | |||
1276 | 1275 | ||
1277 | static int loop_set_capacity(struct loop_device *lo, struct block_device *bdev) | 1276 | static int loop_set_capacity(struct loop_device *lo, struct block_device *bdev) |
1278 | { | 1277 | { |
1279 | int err; | ||
1280 | sector_t sec; | ||
1281 | loff_t sz; | ||
1282 | |||
1283 | err = -ENXIO; | ||
1284 | if (unlikely(lo->lo_state != Lo_bound)) | 1278 | if (unlikely(lo->lo_state != Lo_bound)) |
1285 | goto out; | 1279 | return -ENXIO; |
1286 | err = figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit); | ||
1287 | if (unlikely(err)) | ||
1288 | goto out; | ||
1289 | sec = get_capacity(lo->lo_disk); | ||
1290 | /* the width of sector_t may be narrow for bit-shift */ | ||
1291 | sz = sec; | ||
1292 | sz <<= 9; | ||
1293 | bd_set_size(bdev, sz); | ||
1294 | /* let user-space know about the new size */ | ||
1295 | kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); | ||
1296 | 1280 | ||
1297 | out: | 1281 | return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit); |
1298 | return err; | ||
1299 | } | 1282 | } |
1300 | 1283 | ||
1301 | static int lo_ioctl(struct block_device *bdev, fmode_t mode, | 1284 | static int lo_ioctl(struct block_device *bdev, fmode_t mode, |