Make sure to propagate fmode_t properly and use the right constants for
it. Note that the actual constants don''t seem to be quite correct as
we can write to various devices opened FMODE_READ.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Index: btrfs-unstable/fs/btrfs/super.c
==================================================================---
btrfs-unstable.orig/fs/btrfs/super.c 2008-11-20 19:53:40.000000000 +0100
+++ btrfs-unstable/fs/btrfs/super.c 2008-11-20 20:00:21.000000000 +0100
@@ -240,7 +240,7 @@ int btrfs_parse_options(struct btrfs_roo
* All other options will be parsed on much later in the mount process and
* only when we need to allocate a new super block.
*/
-static int btrfs_parse_early_options(const char *options, int flags,
+static int btrfs_parse_early_options(const char *options, fmode_t flags,
void *holder, char **subvol_name,
struct btrfs_fs_devices **fs_devices)
{
@@ -416,18 +416,22 @@ static int btrfs_get_sb(struct file_syst
struct super_block *s;
struct dentry *root;
struct btrfs_fs_devices *fs_devices = NULL;
+ fmode_t mode = FMODE_READ;
int error = 0;
- error = btrfs_parse_early_options(data, flags, fs_type,
+ if (!(flags & MS_RDONLY))
+ mode |= FMODE_WRITE;
+
+ error = btrfs_parse_early_options(data, mode, fs_type,
&subvol_name, &fs_devices);
if (error)
goto error;
- error = btrfs_scan_one_device(dev_name, flags, fs_type, &fs_devices);
+ error = btrfs_scan_one_device(dev_name, mode, fs_type, &fs_devices);
if (error)
goto error_free_subvol_name;
- error = btrfs_open_devices(fs_devices, flags, fs_type);
+ error = btrfs_open_devices(fs_devices, mode, fs_type);
if (error)
goto error_free_subvol_name;
@@ -589,7 +593,7 @@ static long btrfs_control_ioctl(struct f
len = strnlen(vol->name, BTRFS_PATH_NAME_MAX);
switch (cmd) {
case BTRFS_IOC_SCAN_DEV:
- ret = btrfs_scan_one_device(vol->name, MS_RDONLY,
+ ret = btrfs_scan_one_device(vol->name, FMODE_READ,
&btrfs_fs_type, &fs_devices);
break;
}
Index: btrfs-unstable/fs/btrfs/volumes.c
==================================================================---
btrfs-unstable.orig/fs/btrfs/volumes.c 2008-11-20 19:51:20.000000000 +0100
+++ btrfs-unstable/fs/btrfs/volumes.c 2008-11-20 19:57:22.000000000 +0100
@@ -392,7 +392,7 @@ int btrfs_close_devices(struct btrfs_fs_
}
int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
- int flags, void *holder)
+ fmode_t flags, void *holder)
{
struct block_device *bdev;
struct list_head *head = &fs_devices->devices;
@@ -467,7 +467,7 @@ int __btrfs_open_devices(struct btrfs_fs
error_brelse:
brelse(bh);
error_close:
- close_bdev_exclusive(bdev, MS_RDONLY);
+ close_bdev_exclusive(bdev, FMODE_READ);
error:
continue;
}
@@ -486,7 +486,7 @@ out:
}
int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
- int flags, void *holder)
+ fmode_t flags, void *holder)
{
int ret;
@@ -505,7 +505,7 @@ int btrfs_open_devices(struct btrfs_fs_d
return ret;
}
-int btrfs_scan_one_device(const char *path, int flags, void *holder,
+int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
struct btrfs_fs_devices **fs_devices_ret)
{
struct btrfs_super_block *disk_super;
@@ -1006,7 +1006,7 @@ int btrfs_rm_device(struct btrfs_root *r
goto out;
}
} else {
- bdev = open_bdev_exclusive(device_path, MS_RDONLY,
+ bdev = open_bdev_exclusive(device_path, FMODE_READ,
root->fs_info->bdev_holder);
if (IS_ERR(bdev)) {
ret = PTR_ERR(bdev);
@@ -1076,7 +1076,7 @@ int btrfs_rm_device(struct btrfs_root *r
BUG_ON(device->writeable);
brelse(bh);
if (bdev)
- close_bdev_exclusive(bdev, MS_RDONLY);
+ close_bdev_exclusive(bdev, FMODE_READ);
if (device->bdev) {
close_bdev_exclusive(device->bdev, device->mode);
@@ -1119,7 +1119,7 @@ int btrfs_rm_device(struct btrfs_root *r
}
if (bdev) {
/* one close for us */
- close_bdev_exclusive(bdev, MS_RDONLY);
+ close_bdev_exclusive(bdev, FMODE_READ);
}
kfree(device->name);
kfree(device);
@@ -1130,7 +1130,7 @@ error_brelse:
brelse(bh);
error_close:
if (bdev)
- close_bdev_exclusive(bdev, MS_RDONLY);
+ close_bdev_exclusive(bdev, FMODE_READ);
out:
mutex_unlock(&root->fs_info->volume_mutex);
mutex_unlock(&uuid_mutex);
@@ -2911,7 +2911,7 @@ static int open_seed_devices(struct btrf
goto out;
}
- ret = __btrfs_open_devices(fs_devices, MS_RDONLY,
+ ret = __btrfs_open_devices(fs_devices, FMODE_READ,
root->fs_info->bdev_holder);
if (ret)
goto out;
Index: btrfs-unstable/fs/btrfs/volumes.h
==================================================================---
btrfs-unstable.orig/fs/btrfs/volumes.h 2008-11-20 19:54:08.000000000 +0100
+++ btrfs-unstable/fs/btrfs/volumes.h 2008-11-20 19:57:29.000000000 +0100
@@ -135,8 +135,8 @@ int btrfs_map_bio(struct btrfs_root *roo
int mirror_num, int async_submit);
int btrfs_read_super_device(struct btrfs_root *root, struct extent_buffer
*buf);
int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
- int flags, void *holder);
-int btrfs_scan_one_device(const char *path, int flags, void *holder,
+ fmode_t flags, void *holder);
+int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
struct btrfs_fs_devices **fs_devices_ret);
int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
int btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices);
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html