diff mbox

[RFC] btrfs-progs: btrfsck operations should be exclusive

Message ID 1389618895-24460-1-git-send-email-anand.jain@oracle.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Anand Jain Jan. 13, 2014, 1:14 p.m. UTC
From: Anand Jain <Anand.Jain@oracle.com>

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>
---
 cmds-check.c |  3 ++-
 disk-io.c    | 10 ++++++++--
 disk-io.h    |  1 +
 volumes.c    |  2 +-
 4 files changed, 12 insertions(+), 4 deletions(-)

Comments

David Sterba Jan. 14, 2014, 4:47 p.m. UTC | #1
On Mon, Jan 13, 2014 at 09:14:55PM +0800, Anand Jain wrote:
> From: Anand Jain <Anand.Jain@oracle.com>
> 
> this patch will make btrfsck operations to open disk in exclusive mode,
> so that mount will fail when btrfsck is running

Makes sense, especially if fsck is in the repair mode, mounting such fs
would be bad.

> --- 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_O_EXCL		= 64,

I'd rather pick a more descriptive name, matching to the others, eg.
OPEN_CTREE_EXCLUSIVE, which would translate to the O_EXCL open mode.

As you've implemented it, the exclusive mode applies to both read-only
and write/repair modes, which is imho right and should prevent
accidental errors, ie. a safe default.


david
--
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
diff mbox

Patch

diff --git a/cmds-check.c b/cmds-check.c
index 1569d6f..ac456bb 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -6382,7 +6382,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_O_EXCL;
 
 	while(1) {
 		int c;
diff --git a/disk-io.c b/disk-io.c
index bd90417..44d6f6f 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -1062,6 +1062,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;
@@ -1085,9 +1086,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_O_EXCL)
+		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 ca6af2d..594deba 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_O_EXCL		= 64,
 };
 
 static inline u64 btrfs_sb_offset(int mirror)
diff --git a/volumes.c b/volumes.c
index 65be5f0..8c45851 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;