diff options
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r-- | drivers/block/loop.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index d943e713d5e3..d0c30cbcacbe 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -641,9 +641,7 @@ static void loop_reread_partitions(struct loop_device *lo, { int rc; - mutex_lock(&bdev->bd_mutex); - rc = bdev_disk_changed(bdev, false); - mutex_unlock(&bdev->bd_mutex); + rc = blkdev_reread_part(bdev); if (rc) pr_warn("%s: partition scan of loop%d (%s) failed (rc=%d)\n", __func__, lo->lo_number, lo->lo_file_name, rc); @@ -751,6 +749,24 @@ out_err: return error; } +/* + * for AUFS + * no get/put for file. + */ +struct file *loop_backing_file(struct super_block *sb) +{ + struct file *ret; + struct loop_device *l; + + ret = NULL; + if (MAJOR(sb->s_dev) == LOOP_MAJOR) { + l = sb->s_bdev->bd_disk->private_data; + ret = l->lo_backing_file; + } + return ret; +} +EXPORT_SYMBOL_GPL(loop_backing_file); + /* loop sysfs attributes */ static ssize_t loop_attr_show(struct device *dev, char *page, @@ -1186,11 +1202,10 @@ out_unlock: * must be at least one and it can only become zero when the * current holder is released. */ - if (!release) - mutex_lock(&bdev->bd_mutex); - err = bdev_disk_changed(bdev, false); - if (!release) - mutex_unlock(&bdev->bd_mutex); + if (release) + err = __blkdev_reread_part(bdev); + else + err = blkdev_reread_part(bdev); if (err) pr_warn("%s: partition scan of loop%d failed (rc=%d)\n", __func__, lo_number, err); |