summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Jain <Anand.Jain@oracle.com>2014-01-13 21:14:55 +0800
committerChris Mason <clm@fb.com>2014-01-31 08:22:26 -0800
commitf920dbce8d8161fff30e3e75ebfc71e978d9bea4 (patch)
tree2ca6561e3cd88062c327281d83c758f588055e60
parentb2e99e1819d967828edf149db5a203e59a40e379 (diff)
btrfs-progs: btrfsck operations should be exclusive
this patch will make btrfsck operations to open disk in exclusive mode, so that mount will fail when btrfsck is running Signed-off-by: Anand Jain <Anand.Jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r--cmds-check.c3
-rw-r--r--disk-io.c10
-rw-r--r--disk-io.h1
-rw-r--r--volumes.c2
4 files changed, 12 insertions, 4 deletions
diff --git a/cmds-check.c b/cmds-check.c
index b518a6b5..2911af08 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -6390,7 +6390,8 @@ int cmd_check(int argc, char **argv)
int option_index = 0;
int init_csum_tree = 0;
int init_extent_tree = 0;
- enum btrfs_open_ctree_flags ctree_flags = OPEN_CTREE_PARTIAL;
+ enum btrfs_open_ctree_flags ctree_flags =
+ OPEN_CTREE_PARTIAL | OPEN_CTREE_EXCLUSIVE;
while(1) {
int c;
diff --git a/disk-io.c b/disk-io.c
index 8009b947..e4550bd4 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1057,6 +1057,7 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
struct btrfs_fs_devices *fs_devices = NULL;
struct extent_buffer *eb;
int ret;
+ int oflags;
if (sb_bytenr == 0)
sb_bytenr = BTRFS_SUPER_INFO_OFFSET;
@@ -1080,9 +1081,14 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
fs_info->fs_devices = fs_devices;
if (flags & OPEN_CTREE_WRITES)
- ret = btrfs_open_devices(fs_devices, O_RDWR);
+ oflags = O_RDWR;
else
- ret = btrfs_open_devices(fs_devices, O_RDONLY);
+ oflags = O_RDONLY;
+
+ if (flags & OPEN_CTREE_EXCLUSIVE)
+ oflags |= O_EXCL;
+
+ ret = btrfs_open_devices(fs_devices, oflags);
if (ret)
goto out_devices;
diff --git a/disk-io.h b/disk-io.h
index ca6af2d8..941a3da6 100644
--- a/disk-io.h
+++ b/disk-io.h
@@ -32,6 +32,7 @@ enum btrfs_open_ctree_flags {
OPEN_CTREE_RECOVER_SUPER = 8,
OPEN_CTREE_RESTORE = 16,
OPEN_CTREE_NO_BLOCK_GROUPS = 32,
+ OPEN_CTREE_EXCLUSIVE = 64,
};
static inline u64 btrfs_sb_offset(int mirror)
diff --git a/volumes.c b/volumes.c
index 65be5f07..8c458517 100644
--- a/volumes.c
+++ b/volumes.c
@@ -214,7 +214,7 @@ int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, int flags)
if (device->devid == fs_devices->lowest_devid)
fs_devices->lowest_bdev = fd;
device->fd = fd;
- if (flags == O_RDWR)
+ if (flags & O_RDWR)
device->writeable = 1;
}
return 0;