aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r--drivers/block/loop.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 6faca2b7ae37..67d7bc812364 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -652,8 +652,8 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
652 * This can only work if the loop device is used read-only, and if the 652 * This can only work if the loop device is used read-only, and if the
653 * new backing store is the same size and type as the old backing store. 653 * new backing store is the same size and type as the old backing store.
654 */ 654 */
655static int loop_change_fd(struct loop_device *lo, struct file *lo_file, 655static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
656 struct block_device *bdev, unsigned int arg) 656 unsigned int arg)
657{ 657{
658 struct file *file, *old_file; 658 struct file *file, *old_file;
659 struct inode *inode; 659 struct inode *inode;
@@ -712,7 +712,7 @@ static inline int is_loop_device(struct file *file)
712 return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR; 712 return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
713} 713}
714 714
715static int loop_set_fd(struct loop_device *lo, struct file *lo_file, 715static int loop_set_fd(struct loop_device *lo, fmode_t mode,
716 struct block_device *bdev, unsigned int arg) 716 struct block_device *bdev, unsigned int arg)
717{ 717{
718 struct file *file, *f; 718 struct file *file, *f;
@@ -740,7 +740,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
740 while (is_loop_device(f)) { 740 while (is_loop_device(f)) {
741 struct loop_device *l; 741 struct loop_device *l;
742 742
743 if (f->f_mapping->host->i_rdev == lo_file->f_mapping->host->i_rdev) 743 if (f->f_mapping->host->i_bdev == bdev)
744 goto out_putf; 744 goto out_putf;
745 745
746 l = f->f_mapping->host->i_bdev->bd_disk->private_data; 746 l = f->f_mapping->host->i_bdev->bd_disk->private_data;
@@ -786,7 +786,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
786 goto out_putf; 786 goto out_putf;
787 } 787 }
788 788
789 if (!(lo_file->f_mode & FMODE_WRITE)) 789 if (!(mode & FMODE_WRITE))
790 lo_flags |= LO_FLAGS_READ_ONLY; 790 lo_flags |= LO_FLAGS_READ_ONLY;
791 791
792 set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0); 792 set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0);
@@ -918,9 +918,11 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
918 memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); 918 memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
919 memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); 919 memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
920 memset(lo->lo_file_name, 0, LO_NAME_SIZE); 920 memset(lo->lo_file_name, 0, LO_NAME_SIZE);
921 invalidate_bdev(bdev); 921 if (bdev)
922 invalidate_bdev(bdev);
922 set_capacity(lo->lo_disk, 0); 923 set_capacity(lo->lo_disk, 0);
923 bd_set_size(bdev, 0); 924 if (bdev)
925 bd_set_size(bdev, 0);
924 mapping_set_gfp_mask(filp->f_mapping, gfp); 926 mapping_set_gfp_mask(filp->f_mapping, gfp);
925 lo->lo_state = Lo_unbound; 927 lo->lo_state = Lo_unbound;
926 fput(filp); 928 fput(filp);
@@ -1137,22 +1139,22 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) {
1137 return err; 1139 return err;
1138} 1140}
1139 1141
1140static int lo_ioctl(struct inode * inode, struct file * file, 1142static int lo_ioctl(struct block_device *bdev, fmode_t mode,
1141 unsigned int cmd, unsigned long arg) 1143 unsigned int cmd, unsigned long arg)
1142{ 1144{
1143 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1145 struct loop_device *lo = bdev->bd_disk->private_data;
1144 int err; 1146 int err;
1145 1147
1146 mutex_lock(&lo->lo_ctl_mutex); 1148 mutex_lock(&lo->lo_ctl_mutex);
1147 switch (cmd) { 1149 switch (cmd) {
1148 case LOOP_SET_FD: 1150 case LOOP_SET_FD:
1149 err = loop_set_fd(lo, file, inode->i_bdev, arg); 1151 err = loop_set_fd(lo, mode, bdev, arg);
1150 break; 1152 break;
1151 case LOOP_CHANGE_FD: 1153 case LOOP_CHANGE_FD:
1152 err = loop_change_fd(lo, file, inode->i_bdev, arg); 1154 err = loop_change_fd(lo, bdev, arg);
1153 break; 1155 break;
1154 case LOOP_CLR_FD: 1156 case LOOP_CLR_FD:
1155 err = loop_clr_fd(lo, inode->i_bdev); 1157 err = loop_clr_fd(lo, bdev);
1156 break; 1158 break;
1157 case LOOP_SET_STATUS: 1159 case LOOP_SET_STATUS:
1158 err = loop_set_status_old(lo, (struct loop_info __user *) arg); 1160 err = loop_set_status_old(lo, (struct loop_info __user *) arg);
@@ -1292,10 +1294,10 @@ loop_get_status_compat(struct loop_device *lo,
1292 return err; 1294 return err;
1293} 1295}
1294 1296
1295static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 1297static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,
1298 unsigned int cmd, unsigned long arg)
1296{ 1299{
1297 struct inode *inode = file->f_path.dentry->d_inode; 1300 struct loop_device *lo = bdev->bd_disk->private_data;
1298 struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
1299 int err; 1301 int err;
1300 1302
1301 switch(cmd) { 1303 switch(cmd) {
@@ -1317,7 +1319,7 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
1317 arg = (unsigned long) compat_ptr(arg); 1319 arg = (unsigned long) compat_ptr(arg);
1318 case LOOP_SET_FD: 1320 case LOOP_SET_FD:
1319 case LOOP_CHANGE_FD: 1321 case LOOP_CHANGE_FD:
1320 err = lo_ioctl(inode, file, cmd, arg); 1322 err = lo_ioctl(bdev, mode, cmd, arg);
1321 break; 1323 break;
1322 default: 1324 default:
1323 err = -ENOIOCTLCMD; 1325 err = -ENOIOCTLCMD;
@@ -1327,9 +1329,9 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
1327} 1329}
1328#endif 1330#endif
1329 1331
1330static int lo_open(struct inode *inode, struct file *file) 1332static int lo_open(struct block_device *bdev, fmode_t mode)
1331{ 1333{
1332 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1334 struct loop_device *lo = bdev->bd_disk->private_data;
1333 1335
1334 mutex_lock(&lo->lo_ctl_mutex); 1336 mutex_lock(&lo->lo_ctl_mutex);
1335 lo->lo_refcnt++; 1337 lo->lo_refcnt++;
@@ -1338,15 +1340,15 @@ static int lo_open(struct inode *inode, struct file *file)
1338 return 0; 1340 return 0;
1339} 1341}
1340 1342
1341static int lo_release(struct inode *inode, struct file *file) 1343static int lo_release(struct gendisk *disk, fmode_t mode)
1342{ 1344{
1343 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1345 struct loop_device *lo = disk->private_data;
1344 1346
1345 mutex_lock(&lo->lo_ctl_mutex); 1347 mutex_lock(&lo->lo_ctl_mutex);
1346 --lo->lo_refcnt; 1348 --lo->lo_refcnt;
1347 1349
1348 if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt) 1350 if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt)
1349 loop_clr_fd(lo, inode->i_bdev); 1351 loop_clr_fd(lo, NULL);
1350 1352
1351 mutex_unlock(&lo->lo_ctl_mutex); 1353 mutex_unlock(&lo->lo_ctl_mutex);
1352 1354
@@ -1355,11 +1357,11 @@ static int lo_release(struct inode *inode, struct file *file)
1355 1357
1356static struct block_device_operations lo_fops = { 1358static struct block_device_operations lo_fops = {
1357 .owner = THIS_MODULE, 1359 .owner = THIS_MODULE,
1358 .__open = lo_open, 1360 .open = lo_open,
1359 .__release = lo_release, 1361 .release = lo_release,
1360 .__ioctl = lo_ioctl, 1362 .ioctl = lo_ioctl,
1361#ifdef CONFIG_COMPAT 1363#ifdef CONFIG_COMPAT
1362 .__compat_ioctl = lo_compat_ioctl, 1364 .compat_ioctl = lo_compat_ioctl,
1363#endif 1365#endif
1364}; 1366};
1365 1367