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, |
