Commit 30c40d2c authored by Al Viro's avatar Al Viro

[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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 9a1c3542
...@@ -224,7 +224,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) ...@@ -224,7 +224,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev)
if (dev->blkdev) { if (dev->blkdev) {
invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
0, -1); 0, -1);
close_bdev_excl(dev->blkdev); close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
} }
kfree(dev); kfree(dev);
...@@ -246,7 +246,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) ...@@ -246,7 +246,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
return NULL; return NULL;
/* Get a handle on the device */ /* Get a handle on the device */
bdev = open_bdev_excl(devname, O_RDWR, NULL); bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
#ifndef MODULE #ifndef MODULE
if (IS_ERR(bdev)) { if (IS_ERR(bdev)) {
......
...@@ -1309,32 +1309,29 @@ struct block_device *lookup_bdev(const char *path) ...@@ -1309,32 +1309,29 @@ struct block_device *lookup_bdev(const char *path)
EXPORT_SYMBOL(lookup_bdev); EXPORT_SYMBOL(lookup_bdev);
/** /**
* open_bdev_excl - open a block device by name and set it up for use * open_bdev_exclusive - open a block device by name and set it up for use
* *
* @path: special file representing the block device * @path: special file representing the block device
* @flags: %MS_RDONLY for opening read-only * @mode: FMODE_... combination to pass be used
* @holder: owner for exclusion * @holder: owner for exclusion
* *
* Open the blockdevice described by the special file at @path, claim it * Open the blockdevice described by the special file at @path, claim it
* for the @holder. * for the @holder.
*/ */
struct block_device *open_bdev_excl(const char *path, int flags, void *holder) struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder)
{ {
struct block_device *bdev; struct block_device *bdev;
fmode_t mode = FMODE_READ;
int error = 0; int error = 0;
bdev = lookup_bdev(path); bdev = lookup_bdev(path);
if (IS_ERR(bdev)) if (IS_ERR(bdev))
return bdev; return bdev;
if (!(flags & MS_RDONLY))
mode |= FMODE_WRITE;
error = blkdev_get(bdev, mode, 0); error = blkdev_get(bdev, mode, 0);
if (error) if (error)
return ERR_PTR(error); return ERR_PTR(error);
error = -EACCES; error = -EACCES;
if (!(flags & MS_RDONLY) && bdev_read_only(bdev)) if ((mode & FMODE_WRITE) && bdev_read_only(bdev))
goto blkdev_put; goto blkdev_put;
error = bd_claim(bdev, holder); error = bd_claim(bdev, holder);
if (error) if (error)
...@@ -1347,22 +1344,23 @@ struct block_device *open_bdev_excl(const char *path, int flags, void *holder) ...@@ -1347,22 +1344,23 @@ struct block_device *open_bdev_excl(const char *path, int flags, void *holder)
return ERR_PTR(error); return ERR_PTR(error);
} }
EXPORT_SYMBOL(open_bdev_excl); EXPORT_SYMBOL(open_bdev_exclusive);
/** /**
* close_bdev_excl - release a blockdevice openen by open_bdev_excl() * close_bdev_exclusive - close a blockdevice opened by open_bdev_exclusive()
* *
* @bdev: blockdevice to close * @bdev: blockdevice to close
* @mode: mode, must match that used to open.
* *
* This is the counterpart to open_bdev_excl(). * This is the counterpart to open_bdev_exclusive().
*/ */
void close_bdev_excl(struct block_device *bdev) void close_bdev_exclusive(struct block_device *bdev, fmode_t mode)
{ {
bd_release(bdev); bd_release(bdev);
blkdev_put(bdev, 0); /* move up in the next patches */ blkdev_put(bdev, mode);
} }
EXPORT_SYMBOL(close_bdev_excl); EXPORT_SYMBOL(close_bdev_exclusive);
int __invalidate_device(struct block_device *bdev) int __invalidate_device(struct block_device *bdev)
{ {
......
...@@ -2628,7 +2628,8 @@ static int journal_init_dev(struct super_block *super, ...@@ -2628,7 +2628,8 @@ static int journal_init_dev(struct super_block *super,
return 0; return 0;
} }
journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal); journal->j_dev_bd = open_bdev_exclusive(jdev_name,
FMODE_READ|FMODE_WRITE, journal);
if (IS_ERR(journal->j_dev_bd)) { if (IS_ERR(journal->j_dev_bd)) {
result = PTR_ERR(journal->j_dev_bd); result = PTR_ERR(journal->j_dev_bd);
journal->j_dev_bd = NULL; journal->j_dev_bd = NULL;
......
...@@ -760,9 +760,13 @@ int get_sb_bdev(struct file_system_type *fs_type, ...@@ -760,9 +760,13 @@ int get_sb_bdev(struct file_system_type *fs_type,
{ {
struct block_device *bdev; struct block_device *bdev;
struct super_block *s; struct super_block *s;
fmode_t mode = FMODE_READ;
int error = 0; int error = 0;
bdev = open_bdev_excl(dev_name, flags, fs_type); if (!(flags & MS_RDONLY))
mode |= FMODE_WRITE;
bdev = open_bdev_exclusive(dev_name, mode, fs_type);
if (IS_ERR(bdev)) if (IS_ERR(bdev))
return PTR_ERR(bdev); return PTR_ERR(bdev);
...@@ -785,11 +789,12 @@ int get_sb_bdev(struct file_system_type *fs_type, ...@@ -785,11 +789,12 @@ int get_sb_bdev(struct file_system_type *fs_type,
goto error_bdev; goto error_bdev;
} }
close_bdev_excl(bdev); close_bdev_exclusive(bdev, mode);
} else { } else {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
s->s_flags = flags; s->s_flags = flags;
s->s_mode = mode;
strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
sb_set_blocksize(s, block_size(bdev)); sb_set_blocksize(s, block_size(bdev));
error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
...@@ -807,7 +812,7 @@ int get_sb_bdev(struct file_system_type *fs_type, ...@@ -807,7 +812,7 @@ int get_sb_bdev(struct file_system_type *fs_type,
error_s: error_s:
error = PTR_ERR(s); error = PTR_ERR(s);
error_bdev: error_bdev:
close_bdev_excl(bdev); close_bdev_exclusive(bdev, mode);
error: error:
return error; return error;
} }
...@@ -817,10 +822,11 @@ EXPORT_SYMBOL(get_sb_bdev); ...@@ -817,10 +822,11 @@ EXPORT_SYMBOL(get_sb_bdev);
void kill_block_super(struct super_block *sb) void kill_block_super(struct super_block *sb)
{ {
struct block_device *bdev = sb->s_bdev; struct block_device *bdev = sb->s_bdev;
fmode_t mode = sb->s_mode;
generic_shutdown_super(sb); generic_shutdown_super(sb);
sync_blockdev(bdev); sync_blockdev(bdev);
close_bdev_excl(bdev); close_bdev_exclusive(bdev, mode);
} }
EXPORT_SYMBOL(kill_block_super); EXPORT_SYMBOL(kill_block_super);
......
...@@ -589,7 +589,7 @@ xfs_blkdev_get( ...@@ -589,7 +589,7 @@ xfs_blkdev_get(
{ {
int error = 0; int error = 0;
*bdevp = open_bdev_excl(name, 0, mp); *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp);
if (IS_ERR(*bdevp)) { if (IS_ERR(*bdevp)) {
error = PTR_ERR(*bdevp); error = PTR_ERR(*bdevp);
printk("XFS: Invalid device [%s], error=%d\n", name, error); printk("XFS: Invalid device [%s], error=%d\n", name, error);
...@@ -603,7 +603,7 @@ xfs_blkdev_put( ...@@ -603,7 +603,7 @@ xfs_blkdev_put(
struct block_device *bdev) struct block_device *bdev)
{ {
if (bdev) if (bdev)
close_bdev_excl(bdev); close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
} }
/* /*
......
...@@ -1157,6 +1157,7 @@ struct super_block { ...@@ -1157,6 +1157,7 @@ struct super_block {
char s_id[32]; /* Informational name */ char s_id[32]; /* Informational name */
void *s_fs_info; /* Filesystem private info */ void *s_fs_info; /* Filesystem private info */
fmode_t s_mode;
/* /*
* The next field is for VFS *only*. No filesystems have any business * The next field is for VFS *only*. No filesystems have any business
...@@ -1753,9 +1754,10 @@ extern void chrdev_show(struct seq_file *,off_t); ...@@ -1753,9 +1754,10 @@ extern void chrdev_show(struct seq_file *,off_t);
extern const char *__bdevname(dev_t, char *buffer); extern const char *__bdevname(dev_t, char *buffer);
extern const char *bdevname(struct block_device *bdev, char *buffer); extern const char *bdevname(struct block_device *bdev, char *buffer);
extern struct block_device *lookup_bdev(const char *); extern struct block_device *lookup_bdev(const char *);
extern struct block_device *open_bdev_excl(const char *, int, void *); extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *);
extern void close_bdev_excl(struct block_device *); extern void close_bdev_exclusive(struct block_device *, fmode_t);
extern void blkdev_show(struct seq_file *,off_t); extern void blkdev_show(struct seq_file *,off_t);
#else #else
#define BLKDEV_MAJOR_HASH_SIZE 0 #define BLKDEV_MAJOR_HASH_SIZE 0
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment