Message ID | 1389618895-24460-1-git-send-email-anand.jain@oracle.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
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 --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;