Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] propagate mode through open_bdev_excl/close_bdev_excl

replace open_bdev_excl/close_bdev_excl with variants taking fmode_t.
superblock gets the value used to mount it stored in sb->s_mode

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 30c40d2c 9a1c3542

+31 -24
+2 -2
drivers/mtd/devices/block2mtd.c
··· 224 224 if (dev->blkdev) { 225 225 invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 226 226 0, -1); 227 - close_bdev_excl(dev->blkdev); 227 + close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE); 228 228 } 229 229 230 230 kfree(dev); ··· 246 246 return NULL; 247 247 248 248 /* Get a handle on the device */ 249 - bdev = open_bdev_excl(devname, O_RDWR, NULL); 249 + bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL); 250 250 #ifndef MODULE 251 251 if (IS_ERR(bdev)) { 252 252
+11 -13
fs/block_dev.c
··· 1309 1309 EXPORT_SYMBOL(lookup_bdev); 1310 1310 1311 1311 /** 1312 - * open_bdev_excl - open a block device by name and set it up for use 1312 + * open_bdev_exclusive - open a block device by name and set it up for use 1313 1313 * 1314 1314 * @path: special file representing the block device 1315 - * @flags: %MS_RDONLY for opening read-only 1315 + * @mode: FMODE_... combination to pass be used 1316 1316 * @holder: owner for exclusion 1317 1317 * 1318 1318 * Open the blockdevice described by the special file at @path, claim it 1319 1319 * for the @holder. 1320 1320 */ 1321 - struct block_device *open_bdev_excl(const char *path, int flags, void *holder) 1321 + struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder) 1322 1322 { 1323 1323 struct block_device *bdev; 1324 - fmode_t mode = FMODE_READ; 1325 1324 int error = 0; 1326 1325 1327 1326 bdev = lookup_bdev(path); 1328 1327 if (IS_ERR(bdev)) 1329 1328 return bdev; 1330 1329 1331 - if (!(flags & MS_RDONLY)) 1332 - mode |= FMODE_WRITE; 1333 1330 error = blkdev_get(bdev, mode, 0); 1334 1331 if (error) 1335 1332 return ERR_PTR(error); 1336 1333 error = -EACCES; 1337 - if (!(flags & MS_RDONLY) && bdev_read_only(bdev)) 1334 + if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) 1338 1335 goto blkdev_put; 1339 1336 error = bd_claim(bdev, holder); 1340 1337 if (error) ··· 1344 1347 return ERR_PTR(error); 1345 1348 } 1346 1349 1347 - EXPORT_SYMBOL(open_bdev_excl); 1350 + EXPORT_SYMBOL(open_bdev_exclusive); 1348 1351 1349 1352 /** 1350 - * close_bdev_excl - release a blockdevice openen by open_bdev_excl() 1353 + * close_bdev_exclusive - close a blockdevice opened by open_bdev_exclusive() 1351 1354 * 1352 1355 * @bdev: blockdevice to close 1356 + * @mode: mode, must match that used to open. 1353 1357 * 1354 - * This is the counterpart to open_bdev_excl(). 1358 + * This is the counterpart to open_bdev_exclusive(). 1355 1359 */ 1356 - void close_bdev_excl(struct block_device *bdev) 1360 + void close_bdev_exclusive(struct block_device *bdev, fmode_t mode) 1357 1361 { 1358 1362 bd_release(bdev); 1359 - blkdev_put(bdev, 0); /* move up in the next patches */ 1363 + blkdev_put(bdev, mode); 1360 1364 } 1361 1365 1362 - EXPORT_SYMBOL(close_bdev_excl); 1366 + EXPORT_SYMBOL(close_bdev_exclusive); 1363 1367 1364 1368 int __invalidate_device(struct block_device *bdev) 1365 1369 {
+2 -1
fs/reiserfs/journal.c
··· 2628 2628 return 0; 2629 2629 } 2630 2630 2631 - journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal); 2631 + journal->j_dev_bd = open_bdev_exclusive(jdev_name, 2632 + FMODE_READ|FMODE_WRITE, journal); 2632 2633 if (IS_ERR(journal->j_dev_bd)) { 2633 2634 result = PTR_ERR(journal->j_dev_bd); 2634 2635 journal->j_dev_bd = NULL;
+10 -4
fs/super.c
··· 760 760 { 761 761 struct block_device *bdev; 762 762 struct super_block *s; 763 + fmode_t mode = FMODE_READ; 763 764 int error = 0; 764 765 765 - bdev = open_bdev_excl(dev_name, flags, fs_type); 766 + if (!(flags & MS_RDONLY)) 767 + mode |= FMODE_WRITE; 768 + 769 + bdev = open_bdev_exclusive(dev_name, mode, fs_type); 766 770 if (IS_ERR(bdev)) 767 771 return PTR_ERR(bdev); 768 772 ··· 789 785 goto error_bdev; 790 786 } 791 787 792 - close_bdev_excl(bdev); 788 + close_bdev_exclusive(bdev, mode); 793 789 } else { 794 790 char b[BDEVNAME_SIZE]; 795 791 796 792 s->s_flags = flags; 793 + s->s_mode = mode; 797 794 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); 798 795 sb_set_blocksize(s, block_size(bdev)); 799 796 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); ··· 812 807 error_s: 813 808 error = PTR_ERR(s); 814 809 error_bdev: 815 - close_bdev_excl(bdev); 810 + close_bdev_exclusive(bdev, mode); 816 811 error: 817 812 return error; 818 813 } ··· 822 817 void kill_block_super(struct super_block *sb) 823 818 { 824 819 struct block_device *bdev = sb->s_bdev; 820 + fmode_t mode = sb->s_mode; 825 821 826 822 generic_shutdown_super(sb); 827 823 sync_blockdev(bdev); 828 - close_bdev_excl(bdev); 824 + close_bdev_exclusive(bdev, mode); 829 825 } 830 826 831 827 EXPORT_SYMBOL(kill_block_super);
+2 -2
fs/xfs/linux-2.6/xfs_super.c
··· 589 589 { 590 590 int error = 0; 591 591 592 - *bdevp = open_bdev_excl(name, 0, mp); 592 + *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp); 593 593 if (IS_ERR(*bdevp)) { 594 594 error = PTR_ERR(*bdevp); 595 595 printk("XFS: Invalid device [%s], error=%d\n", name, error); ··· 603 603 struct block_device *bdev) 604 604 { 605 605 if (bdev) 606 - close_bdev_excl(bdev); 606 + close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE); 607 607 } 608 608 609 609 /*
+4 -2
include/linux/fs.h
··· 1157 1157 char s_id[32]; /* Informational name */ 1158 1158 1159 1159 void *s_fs_info; /* Filesystem private info */ 1160 + fmode_t s_mode; 1160 1161 1161 1162 /* 1162 1163 * The next field is for VFS *only*. No filesystems have any business ··· 1754 1753 extern const char *__bdevname(dev_t, char *buffer); 1755 1754 extern const char *bdevname(struct block_device *bdev, char *buffer); 1756 1755 extern struct block_device *lookup_bdev(const char *); 1757 - extern struct block_device *open_bdev_excl(const char *, int, void *); 1758 - extern void close_bdev_excl(struct block_device *); 1756 + extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *); 1757 + extern void close_bdev_exclusive(struct block_device *, fmode_t); 1759 1758 extern void blkdev_show(struct seq_file *,off_t); 1759 + 1760 1760 #else 1761 1761 #define BLKDEV_MAJOR_HASH_SIZE 0 1762 1762 #endif