liubo
2010-Dec-01 10:21 UTC
[RFC PATCH 4/4 v2] Btrfs: deal with filesystem state at mount, umount
Since there is a filesystem state, we should deal with it carefully at mount, umount and remount. - At mount, the FS state should be checked if there is error on these FS. If it does have, btrfsck is recommended. - At umount, the FS state should be saved into disk for consistency. Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com> --- fs/btrfs/disk-io.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 46 insertions(+), 1 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b40dfe4..663d360 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -43,6 +43,8 @@ static struct extent_io_ops btree_extent_io_ops; static void end_workqueue_fn(struct btrfs_work *work); static void free_fs_root(struct btrfs_root *root); +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, + int read_only); /* * end_io_wq structs are used to do processing in task context when an IO is @@ -1700,6 +1702,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, if (!btrfs_super_root(disk_super)) goto fail_iput; + /* check filesystem state */ + fs_info->fs_state |= btrfs_super_flags(disk_super); + + btrfs_check_super_valid(fs_info, sb->s_flags & MS_RDONLY); + ret = btrfs_parse_options(tree_root, options); if (ret) { err = ret; @@ -2405,10 +2412,17 @@ int btrfs_commit_super(struct btrfs_root *root) up_write(&root->fs_info->cleanup_work_sem); trans = btrfs_join_transaction(root, 1); + if (IS_ERR(trans)) + return PTR_ERR(trans); + ret = btrfs_commit_transaction(trans, root); BUG_ON(ret); + /* run commit again to drop the original snapshot */ trans = btrfs_join_transaction(root, 1); + if (IS_ERR(trans)) + return PTR_ERR(trans); + btrfs_commit_transaction(trans, root); ret = btrfs_write_and_wait_transaction(NULL, root); BUG_ON(ret); @@ -2426,8 +2440,28 @@ int close_ctree(struct btrfs_root *root) smp_mb(); btrfs_put_block_group_cache(fs_info); + + /* + * Here come 2 situations when btrfs flips readonly: + * + * 1. when btrfs flips readonly somewhere else before + * btrfs_commit_super, sb->s_flags has MS_RDONLY flag, + * and btrfs will skip to write sb directly to keep + * ERROR state on disk. + * + * 2. when btrfs flips readonly just in btrfs_commit_super, + * and in such case, btrfs cannnot write sb via btrfs_commit_super, + * and since fs_state has been set BTRFS_SUPER_FLAG_ERROR flag, + * btrfs will directly write sb. + */ if (!(fs_info->sb->s_flags & MS_RDONLY)) { - ret = btrfs_commit_super(root); + ret = btrfs_commit_super(root); + if (ret) + printk(KERN_ERR "btrfs: commit super ret %d\n", ret); + } + + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { + ret = write_ctree_super(NULL, root, 0); if (ret) printk(KERN_ERR "btrfs: commit super ret %d\n", ret); } @@ -2603,6 +2637,17 @@ out: return 0; } +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, + int read_only) +{ + if (read_only) + return; + + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) + printk(KERN_WARNING "warning: mount fs with errors, " + "running btfsck is recommended\n"); +} + static struct extent_io_ops btree_extent_io_ops = { .write_cache_pages_lock_hook = btree_lock_page_hook, .readpage_end_io_hook = btree_readpage_end_io_hook, -- 1.7.1 -- 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
Tsutomu Itoh
2010-Dec-02 02:29 UTC
Re: [RFC PATCH 4/4 v2] Btrfs: deal with filesystem state at mount, umount
Hi, I found 1 typo. (2010/12/01 19:21), liubo wrote:> Since there is a filesystem state, we should deal with it carefully at mount, > umount and remount. > > - At mount, the FS state should be checked if there is error on these FS. > If it does have, btrfsck is recommended. > - At umount, the FS state should be saved into disk for consistency. > > Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com> > --- > fs/btrfs/disk-io.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 46 insertions(+), 1 deletions(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index b40dfe4..663d360 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -43,6 +43,8 @@ > static struct extent_io_ops btree_extent_io_ops; > static void end_workqueue_fn(struct btrfs_work *work); > static void free_fs_root(struct btrfs_root *root); > +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, > + int read_only); > > /* > * end_io_wq structs are used to do processing in task context when an IO is > @@ -1700,6 +1702,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, > if (!btrfs_super_root(disk_super)) > goto fail_iput; > > + /* check filesystem state */ > + fs_info->fs_state |= btrfs_super_flags(disk_super); > + > + btrfs_check_super_valid(fs_info, sb->s_flags & MS_RDONLY); > + > ret = btrfs_parse_options(tree_root, options); > if (ret) { > err = ret; > @@ -2405,10 +2412,17 @@ int btrfs_commit_super(struct btrfs_root *root) > up_write(&root->fs_info->cleanup_work_sem); > > trans = btrfs_join_transaction(root, 1); > + if (IS_ERR(trans)) > + return PTR_ERR(trans); > + > ret = btrfs_commit_transaction(trans, root); > BUG_ON(ret); > + > /* run commit again to drop the original snapshot */ > trans = btrfs_join_transaction(root, 1); > + if (IS_ERR(trans)) > + return PTR_ERR(trans); > + > btrfs_commit_transaction(trans, root); > ret = btrfs_write_and_wait_transaction(NULL, root); > BUG_ON(ret); > @@ -2426,8 +2440,28 @@ int close_ctree(struct btrfs_root *root) > smp_mb(); > > btrfs_put_block_group_cache(fs_info); > + > + /* > + * Here come 2 situations when btrfs flips readonly: > + * > + * 1. when btrfs flips readonly somewhere else before > + * btrfs_commit_super, sb->s_flags has MS_RDONLY flag, > + * and btrfs will skip to write sb directly to keep > + * ERROR state on disk. > + * > + * 2. when btrfs flips readonly just in btrfs_commit_super, > + * and in such case, btrfs cannnot write sb via btrfs_commit_super, > + * and since fs_state has been set BTRFS_SUPER_FLAG_ERROR flag, > + * btrfs will directly write sb. > + */ > if (!(fs_info->sb->s_flags & MS_RDONLY)) { > - ret = btrfs_commit_super(root); > + ret = btrfs_commit_super(root); > + if (ret) > + printk(KERN_ERR "btrfs: commit super ret %d\n", ret); > + } > + > + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { > + ret = write_ctree_super(NULL, root, 0); > if (ret) > printk(KERN_ERR "btrfs: commit super ret %d\n", ret); > } > @@ -2603,6 +2637,17 @@ out: > return 0; > } > > +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, > + int read_only) > +{ > + if (read_only) > + return; > + > + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) > + printk(KERN_WARNING "warning: mount fs with errors, " > + "running btfsck is recommended\n");btfsck -> btrfsck> +} > + > static struct extent_io_ops btree_extent_io_ops = { > .write_cache_pages_lock_hook = btree_lock_page_hook, > .readpage_end_io_hook = btree_readpage_end_io_hook,Regards, Itoh -- 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
liubo
2010-Dec-02 02:37 UTC
Re: [RFC PATCH 4/4 v2] Btrfs: deal with filesystem state at mount, umount
On 12/02/2010 10:29 AM, Tsutomu Itoh wrote:> Hi, > > I found 1 typo. > > (2010/12/01 19:21), liubo wrote: >> Since there is a filesystem state, we should deal with it carefully at mount, >> umount and remount. >> >> - At mount, the FS state should be checked if there is error on these FS. >> If it does have, btrfsck is recommended. >> - At umount, the FS state should be saved into disk for consistency. >> >> Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com> >> --- >> fs/btrfs/disk-io.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- >> 1 files changed, 46 insertions(+), 1 deletions(-) >> >> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c >> index b40dfe4..663d360 100644 >> --- a/fs/btrfs/disk-io.c >> +++ b/fs/btrfs/disk-io.c >> @@ -43,6 +43,8 @@ >> static struct extent_io_ops btree_extent_io_ops; >> static void end_workqueue_fn(struct btrfs_work *work); >> static void free_fs_root(struct btrfs_root *root); >> +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, >> + int read_only); >> >> /* >> * end_io_wq structs are used to do processing in task context when an IO is >> @@ -1700,6 +1702,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, >> if (!btrfs_super_root(disk_super)) >> goto fail_iput; >> >> + /* check filesystem state */ >> + fs_info->fs_state |= btrfs_super_flags(disk_super); >> + >> + btrfs_check_super_valid(fs_info, sb->s_flags & MS_RDONLY); >> + >> ret = btrfs_parse_options(tree_root, options); >> if (ret) { >> err = ret; >> @@ -2405,10 +2412,17 @@ int btrfs_commit_super(struct btrfs_root *root) >> up_write(&root->fs_info->cleanup_work_sem); >> >> trans = btrfs_join_transaction(root, 1); >> + if (IS_ERR(trans)) >> + return PTR_ERR(trans); >> + >> ret = btrfs_commit_transaction(trans, root); >> BUG_ON(ret); >> + >> /* run commit again to drop the original snapshot */ >> trans = btrfs_join_transaction(root, 1); >> + if (IS_ERR(trans)) >> + return PTR_ERR(trans); >> + >> btrfs_commit_transaction(trans, root); >> ret = btrfs_write_and_wait_transaction(NULL, root); >> BUG_ON(ret); >> @@ -2426,8 +2440,28 @@ int close_ctree(struct btrfs_root *root) >> smp_mb(); >> >> btrfs_put_block_group_cache(fs_info); >> + >> + /* >> + * Here come 2 situations when btrfs flips readonly: >> + * >> + * 1. when btrfs flips readonly somewhere else before >> + * btrfs_commit_super, sb->s_flags has MS_RDONLY flag, >> + * and btrfs will skip to write sb directly to keep >> + * ERROR state on disk. >> + * >> + * 2. when btrfs flips readonly just in btrfs_commit_super, >> + * and in such case, btrfs cannnot write sb via btrfs_commit_super, >> + * and since fs_state has been set BTRFS_SUPER_FLAG_ERROR flag, >> + * btrfs will directly write sb. >> + */ >> if (!(fs_info->sb->s_flags & MS_RDONLY)) { >> - ret = btrfs_commit_super(root); >> + ret = btrfs_commit_super(root); >> + if (ret) >> + printk(KERN_ERR "btrfs: commit super ret %d\n", ret); >> + } >> + >> + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { >> + ret = write_ctree_super(NULL, root, 0); >> if (ret) >> printk(KERN_ERR "btrfs: commit super ret %d\n", ret); >> } >> @@ -2603,6 +2637,17 @@ out: >> return 0; >> } >> >> +static void btrfs_check_super_valid(struct btrfs_fs_info *fs_info, >> + int read_only) >> +{ >> + if (read_only) >> + return; >> + >> + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) >> + printk(KERN_WARNING "warning: mount fs with errors, " >> + "running btfsck is recommended\n"); > > btfsck -> btrfsckahh, my fault, sorry for my carelessness. Thanks a lot for reviewing. thanks, Liu Bo> >> +} >> + >> static struct extent_io_ops btree_extent_io_ops = { >> .write_cache_pages_lock_hook = btree_lock_page_hook, >> .readpage_end_io_hook = btree_readpage_end_io_hook, > > Regards, > Itoh > > -- > 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 >-- 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
Reasonably Related Threads
- [PATCH] Btrfs: fix race condition between writting and scrubing supers
- [PATCH 2/4] Btrfs: fix deadlock on sb->s_umount when doing umount
- [PATCH v2 0/6] btrfs: generic readeahead interface
- [PATCH] Btrfs: fix a deadlock on chunk mutex
- 'umount' of multi-device volume hangs until the device is physically un-plugged