* [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl @ 2017-10-23 22:14 Jaegeuk Kim 2017-10-23 22:14 ` [PATCH 2/2] f2fs: stop all the operations by cp_error flag Jaegeuk Kim ` (2 more replies) 0 siblings, 3 replies; 11+ messages in thread From: Jaegeuk Kim @ 2017-10-23 22:14 UTC (permalink / raw) To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim This patch adds to call quota_intialize in f2fs_set_acl. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/acl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index 436b3a1464d9..f6471f9d707e 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, int error; umode_t mode = inode->i_mode; + error = dquot_initialize(inode); + if (error) + return error; + switch (type) { case ACL_TYPE_ACCESS: name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; -- 2.14.0.rc1.383.gd1ce394fe2-goog ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2] f2fs: stop all the operations by cp_error flag 2017-10-23 22:14 [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Jaegeuk Kim @ 2017-10-23 22:14 ` Jaegeuk Kim 2017-10-24 9:51 ` [f2fs-dev] " Chao Yu 2017-10-24 9:46 ` [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Chao Yu 2017-10-25 5:43 ` [PATCH 1/2 v2] " Jaegeuk Kim 2 siblings, 1 reply; 11+ messages in thread From: Jaegeuk Kim @ 2017-10-23 22:14 UTC (permalink / raw) To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim This patch replaces to use cp_error flag instead of RDONLY for quota off. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/acl.c | 3 +++ fs/f2fs/checkpoint.c | 1 - fs/f2fs/file.c | 23 +++++++++++++++++++++++ fs/f2fs/namei.c | 30 ++++++++++++++++++++++++++++++ fs/f2fs/super.c | 3 +++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index f6471f9d707e..a9bf5151e7c2 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -254,6 +254,9 @@ static int __f2fs_set_acl(struct inode *inode, int type, int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type) { + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + return __f2fs_set_acl(inode, type, acl, NULL); } diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 201608281681..6b52d4b66c7b 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab; void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io) { set_ckpt_flags(sbi, CP_ERROR_FLAG); - sbi->sb->s_flags |= MS_RDONLY; if (!end_io) f2fs_flush_merged_writes(sbi); } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 56232a72d2a3..0e09b9f02dc5 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -53,6 +53,9 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) struct dnode_of_data dn; int err; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + sb_start_pagefault(inode->i_sb); f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); @@ -310,6 +313,8 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) { + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file))))) + return -EIO; return f2fs_do_sync_file(file, start, end, datasync, false); } @@ -446,6 +451,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) struct inode *inode = file_inode(file); int err; + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + /* we don't need to use inline_data strictly */ err = f2fs_convert_inline_inode(inode); if (err) @@ -632,6 +640,9 @@ int f2fs_truncate(struct inode *inode) { int err; + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) return 0; @@ -731,6 +742,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) int err; bool size_changed = false; + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + err = setattr_prepare(dentry, attr); if (err) return err; @@ -1459,6 +1473,9 @@ static long f2fs_fallocate(struct file *file, int mode, struct inode *inode = file_inode(file); long ret = 0; + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + /* f2fs only support ->fallocate for regular file */ if (!S_ISREG(inode->i_mode)) return -EINVAL; @@ -2637,6 +2654,9 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp))))) + return -EIO; + switch (cmd) { case F2FS_IOC_GETFLAGS: return f2fs_ioc_getflags(filp, arg); @@ -2694,6 +2714,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) struct blk_plug plug; ssize_t ret; + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) + return -EIO; + inode_lock(inode); ret = generic_write_checks(iocb, from); if (ret > 0) { diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index e6f86d5d97b9..944f7a6940b6 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -183,6 +183,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode, nid_t ino = 0; int err; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + err = dquot_initialize(dir); if (err) return err; @@ -227,6 +230,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, struct f2fs_sb_info *sbi = F2FS_I_SB(dir); int err; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + if (f2fs_encrypted_inode(dir) && !fscrypt_has_permitted_context(dir, inode)) return -EPERM; @@ -426,6 +432,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) trace_f2fs_unlink_enter(dir, dentry); + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + err = dquot_initialize(dir); if (err) return err; @@ -481,6 +490,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, struct fscrypt_symlink_data *sd = NULL; int err; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + if (f2fs_encrypted_inode(dir)) { err = fscrypt_get_encryption_info(dir); if (err) @@ -587,6 +599,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) struct inode *inode; int err; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + err = dquot_initialize(dir); if (err) return err; @@ -639,6 +654,9 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry, struct inode *inode; int err = 0; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + err = dquot_initialize(dir); if (err) return err; @@ -733,6 +751,9 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry, static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) { + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) + return -EIO; + if (f2fs_encrypted_inode(dir)) { int err = fscrypt_get_encryption_info(dir); if (err) @@ -744,6 +765,9 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout) { + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) + return -EIO; + return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout); } @@ -763,6 +787,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, bool is_old_inline = f2fs_has_inline_dentry(old_dir); int err = -ENOENT; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + if ((f2fs_encrypted_inode(old_dir) && !fscrypt_has_encryption_key(old_dir)) || (f2fs_encrypted_inode(new_dir) && @@ -956,6 +983,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, int old_nlink = 0, new_nlink = 0; int err = -ENOENT; + if (unlikely(f2fs_cp_error(sbi))) + return -EIO; + if ((f2fs_encrypted_inode(old_dir) && !fscrypt_has_encryption_key(old_dir)) || (f2fs_encrypted_inode(new_dir) && diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 7659b348582a..213d2c1e5759 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -885,6 +885,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync) struct f2fs_sb_info *sbi = F2FS_SB(sb); int err = 0; + if (unlikely(f2fs_cp_error(sbi))) + return 0; + trace_f2fs_sync_fs(sb, sync); if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) -- 2.14.0.rc1.383.gd1ce394fe2-goog ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH 2/2] f2fs: stop all the operations by cp_error flag 2017-10-23 22:14 ` [PATCH 2/2] f2fs: stop all the operations by cp_error flag Jaegeuk Kim @ 2017-10-24 9:51 ` Chao Yu 2017-11-05 3:39 ` Chao Yu 0 siblings, 1 reply; 11+ messages in thread From: Chao Yu @ 2017-10-24 9:51 UTC (permalink / raw) To: Jaegeuk Kim, linux-kernel, linux-fsdevel, linux-f2fs-devel On 2017/10/24 6:14, Jaegeuk Kim wrote: > This patch replaces to use cp_error flag instead of RDONLY for quota off. > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Reviewed-by: Chao Yu <yuchao0@huawei.com> Thanks, > --- > fs/f2fs/acl.c | 3 +++ > fs/f2fs/checkpoint.c | 1 - > fs/f2fs/file.c | 23 +++++++++++++++++++++++ > fs/f2fs/namei.c | 30 ++++++++++++++++++++++++++++++ > fs/f2fs/super.c | 3 +++ > 5 files changed, 59 insertions(+), 1 deletion(-) > > diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c > index f6471f9d707e..a9bf5151e7c2 100644 > --- a/fs/f2fs/acl.c > +++ b/fs/f2fs/acl.c > @@ -254,6 +254,9 @@ static int __f2fs_set_acl(struct inode *inode, int type, > > int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type) > { > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > return __f2fs_set_acl(inode, type, acl, NULL); > } > > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > index 201608281681..6b52d4b66c7b 100644 > --- a/fs/f2fs/checkpoint.c > +++ b/fs/f2fs/checkpoint.c > @@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab; > void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io) > { > set_ckpt_flags(sbi, CP_ERROR_FLAG); > - sbi->sb->s_flags |= MS_RDONLY; > if (!end_io) > f2fs_flush_merged_writes(sbi); > } > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 56232a72d2a3..0e09b9f02dc5 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -53,6 +53,9 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) > struct dnode_of_data dn; > int err; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > sb_start_pagefault(inode->i_sb); > > f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); > @@ -310,6 +313,8 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, > > int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) > { > + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file))))) > + return -EIO; > return f2fs_do_sync_file(file, start, end, datasync, false); > } > > @@ -446,6 +451,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) > struct inode *inode = file_inode(file); > int err; > > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > /* we don't need to use inline_data strictly */ > err = f2fs_convert_inline_inode(inode); > if (err) > @@ -632,6 +640,9 @@ int f2fs_truncate(struct inode *inode) > { > int err; > > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || > S_ISLNK(inode->i_mode))) > return 0; > @@ -731,6 +742,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) > int err; > bool size_changed = false; > > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > err = setattr_prepare(dentry, attr); > if (err) > return err; > @@ -1459,6 +1473,9 @@ static long f2fs_fallocate(struct file *file, int mode, > struct inode *inode = file_inode(file); > long ret = 0; > > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > /* f2fs only support ->fallocate for regular file */ > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > @@ -2637,6 +2654,9 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) > > long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) > { > + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp))))) > + return -EIO; > + > switch (cmd) { > case F2FS_IOC_GETFLAGS: > return f2fs_ioc_getflags(filp, arg); > @@ -2694,6 +2714,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > struct blk_plug plug; > ssize_t ret; > > + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > + return -EIO; > + > inode_lock(inode); > ret = generic_write_checks(iocb, from); > if (ret > 0) { > diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c > index e6f86d5d97b9..944f7a6940b6 100644 > --- a/fs/f2fs/namei.c > +++ b/fs/f2fs/namei.c > @@ -183,6 +183,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode, > nid_t ino = 0; > int err; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > err = dquot_initialize(dir); > if (err) > return err; > @@ -227,6 +230,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, > struct f2fs_sb_info *sbi = F2FS_I_SB(dir); > int err; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > if (f2fs_encrypted_inode(dir) && > !fscrypt_has_permitted_context(dir, inode)) > return -EPERM; > @@ -426,6 +432,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) > > trace_f2fs_unlink_enter(dir, dentry); > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > err = dquot_initialize(dir); > if (err) > return err; > @@ -481,6 +490,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, > struct fscrypt_symlink_data *sd = NULL; > int err; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > if (f2fs_encrypted_inode(dir)) { > err = fscrypt_get_encryption_info(dir); > if (err) > @@ -587,6 +599,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) > struct inode *inode; > int err; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > err = dquot_initialize(dir); > if (err) > return err; > @@ -639,6 +654,9 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry, > struct inode *inode; > int err = 0; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > err = dquot_initialize(dir); > if (err) > return err; > @@ -733,6 +751,9 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry, > > static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) > { > + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) > + return -EIO; > + > if (f2fs_encrypted_inode(dir)) { > int err = fscrypt_get_encryption_info(dir); > if (err) > @@ -744,6 +765,9 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) > > static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout) > { > + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) > + return -EIO; > + > return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout); > } > > @@ -763,6 +787,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, > bool is_old_inline = f2fs_has_inline_dentry(old_dir); > int err = -ENOENT; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > if ((f2fs_encrypted_inode(old_dir) && > !fscrypt_has_encryption_key(old_dir)) || > (f2fs_encrypted_inode(new_dir) && > @@ -956,6 +983,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, > int old_nlink = 0, new_nlink = 0; > int err = -ENOENT; > > + if (unlikely(f2fs_cp_error(sbi))) > + return -EIO; > + > if ((f2fs_encrypted_inode(old_dir) && > !fscrypt_has_encryption_key(old_dir)) || > (f2fs_encrypted_inode(new_dir) && > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index 7659b348582a..213d2c1e5759 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -885,6 +885,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync) > struct f2fs_sb_info *sbi = F2FS_SB(sb); > int err = 0; > > + if (unlikely(f2fs_cp_error(sbi))) > + return 0; > + > trace_f2fs_sync_fs(sb, sync); > > if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH 2/2] f2fs: stop all the operations by cp_error flag 2017-10-24 9:51 ` [f2fs-dev] " Chao Yu @ 2017-11-05 3:39 ` Chao Yu 2017-11-06 0:49 ` Jaegeuk Kim 0 siblings, 1 reply; 11+ messages in thread From: Chao Yu @ 2017-11-05 3:39 UTC (permalink / raw) To: Chao Yu, Jaegeuk Kim, linux-kernel, linux-fsdevel, linux-f2fs-devel Hi Jaegeuk, On 2017/10/24 17:51, Chao Yu wrote: > On 2017/10/24 6:14, Jaegeuk Kim wrote: >> This patch replaces to use cp_error flag instead of RDONLY for quota off. We should convert error number with block_page_mkwrite_return in .page_mkwrite, otherwise generic/019 will cause a deadlock issue with below kernel message printed: ============================================ WARNING: possible recursive locking detected 4.14.0-rc1 #35 Tainted: G W O -------------------------------------------- fio/5845 is trying to acquire lock: (&mm->mmap_sem){++++}, at: [<c104be02>] __do_page_fault+0x482/0x510 but task is already holding lock: (&mm->mmap_sem){++++}, at: [<c104ba9e>] __do_page_fault+0x11e/0x510 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&mm->mmap_sem); lock(&mm->mmap_sem); *** DEADLOCK *** May be due to missing lock nesting notation 1 lock held by fio/5845: #0: (&mm->mmap_sem){++++}, at: [<c104ba9e>] __do_page_fault+0x11e/0x510 stack backtrace: CPU: 3 PID: 5845 Comm: fio Tainted: G W O 4.14.0-rc1 #35 Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 Call Trace: dump_stack+0x5f/0x92 __lock_acquire+0x1019/0x12c0 lock_acquire+0xae/0x220 down_read+0x38/0x60 __do_page_fault+0x482/0x510 do_page_fault+0x26/0x290 common_exception+0x64/0x6a --- fs/f2fs/file.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index e67f03546391..0ce1e82591d1 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -53,8 +53,10 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) struct dnode_of_data dn; int err; - if (unlikely(f2fs_cp_error(sbi))) - return -EIO; + if (unlikely(f2fs_cp_error(sbi))) { + err = -EIO; + goto out; + } sb_start_pagefault(inode->i_sb); @@ -66,7 +68,7 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) err = f2fs_reserve_block(&dn, page->index); if (err) { f2fs_unlock_op(sbi); - goto out; + goto out_end; } f2fs_put_dnode(&dn); f2fs_unlock_op(sbi); @@ -114,9 +116,10 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) out_sem: up_read(&F2FS_I(inode)->i_mmap_sem); -out: +out_end: sb_end_pagefault(inode->i_sb); f2fs_update_time(sbi, REQ_TIME); +out: return block_page_mkwrite_return(err); } -- Thanks, >> >> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > Reviewed-by: Chao Yu <yuchao0@huawei.com> > > Thanks, > >> --- >> fs/f2fs/acl.c | 3 +++ >> fs/f2fs/checkpoint.c | 1 - >> fs/f2fs/file.c | 23 +++++++++++++++++++++++ >> fs/f2fs/namei.c | 30 ++++++++++++++++++++++++++++++ >> fs/f2fs/super.c | 3 +++ >> 5 files changed, 59 insertions(+), 1 deletion(-) >> >> diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c >> index f6471f9d707e..a9bf5151e7c2 100644 >> --- a/fs/f2fs/acl.c >> +++ b/fs/f2fs/acl.c >> @@ -254,6 +254,9 @@ static int __f2fs_set_acl(struct inode *inode, int type, >> >> int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type) >> { >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> return __f2fs_set_acl(inode, type, acl, NULL); >> } >> >> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c >> index 201608281681..6b52d4b66c7b 100644 >> --- a/fs/f2fs/checkpoint.c >> +++ b/fs/f2fs/checkpoint.c >> @@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab; >> void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io) >> { >> set_ckpt_flags(sbi, CP_ERROR_FLAG); >> - sbi->sb->s_flags |= MS_RDONLY; >> if (!end_io) >> f2fs_flush_merged_writes(sbi); >> } >> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c >> index 56232a72d2a3..0e09b9f02dc5 100644 >> --- a/fs/f2fs/file.c >> +++ b/fs/f2fs/file.c >> @@ -53,6 +53,9 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) >> struct dnode_of_data dn; >> int err; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> sb_start_pagefault(inode->i_sb); >> >> f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); >> @@ -310,6 +313,8 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, >> >> int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) >> { >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file))))) >> + return -EIO; >> return f2fs_do_sync_file(file, start, end, datasync, false); >> } >> >> @@ -446,6 +451,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) >> struct inode *inode = file_inode(file); >> int err; >> >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> /* we don't need to use inline_data strictly */ >> err = f2fs_convert_inline_inode(inode); >> if (err) >> @@ -632,6 +640,9 @@ int f2fs_truncate(struct inode *inode) >> { >> int err; >> >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || >> S_ISLNK(inode->i_mode))) >> return 0; >> @@ -731,6 +742,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) >> int err; >> bool size_changed = false; >> >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> err = setattr_prepare(dentry, attr); >> if (err) >> return err; >> @@ -1459,6 +1473,9 @@ static long f2fs_fallocate(struct file *file, int mode, >> struct inode *inode = file_inode(file); >> long ret = 0; >> >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> /* f2fs only support ->fallocate for regular file */ >> if (!S_ISREG(inode->i_mode)) >> return -EINVAL; >> @@ -2637,6 +2654,9 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) >> >> long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) >> { >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp))))) >> + return -EIO; >> + >> switch (cmd) { >> case F2FS_IOC_GETFLAGS: >> return f2fs_ioc_getflags(filp, arg); >> @@ -2694,6 +2714,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) >> struct blk_plug plug; >> ssize_t ret; >> >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) >> + return -EIO; >> + >> inode_lock(inode); >> ret = generic_write_checks(iocb, from); >> if (ret > 0) { >> diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c >> index e6f86d5d97b9..944f7a6940b6 100644 >> --- a/fs/f2fs/namei.c >> +++ b/fs/f2fs/namei.c >> @@ -183,6 +183,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode, >> nid_t ino = 0; >> int err; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> err = dquot_initialize(dir); >> if (err) >> return err; >> @@ -227,6 +230,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, >> struct f2fs_sb_info *sbi = F2FS_I_SB(dir); >> int err; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> if (f2fs_encrypted_inode(dir) && >> !fscrypt_has_permitted_context(dir, inode)) >> return -EPERM; >> @@ -426,6 +432,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) >> >> trace_f2fs_unlink_enter(dir, dentry); >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> err = dquot_initialize(dir); >> if (err) >> return err; >> @@ -481,6 +490,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, >> struct fscrypt_symlink_data *sd = NULL; >> int err; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> if (f2fs_encrypted_inode(dir)) { >> err = fscrypt_get_encryption_info(dir); >> if (err) >> @@ -587,6 +599,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) >> struct inode *inode; >> int err; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> err = dquot_initialize(dir); >> if (err) >> return err; >> @@ -639,6 +654,9 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry, >> struct inode *inode; >> int err = 0; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> err = dquot_initialize(dir); >> if (err) >> return err; >> @@ -733,6 +751,9 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry, >> >> static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) >> { >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) >> + return -EIO; >> + >> if (f2fs_encrypted_inode(dir)) { >> int err = fscrypt_get_encryption_info(dir); >> if (err) >> @@ -744,6 +765,9 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) >> >> static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout) >> { >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) >> + return -EIO; >> + >> return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout); >> } >> >> @@ -763,6 +787,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, >> bool is_old_inline = f2fs_has_inline_dentry(old_dir); >> int err = -ENOENT; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> if ((f2fs_encrypted_inode(old_dir) && >> !fscrypt_has_encryption_key(old_dir)) || >> (f2fs_encrypted_inode(new_dir) && >> @@ -956,6 +983,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, >> int old_nlink = 0, new_nlink = 0; >> int err = -ENOENT; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return -EIO; >> + >> if ((f2fs_encrypted_inode(old_dir) && >> !fscrypt_has_encryption_key(old_dir)) || >> (f2fs_encrypted_inode(new_dir) && >> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >> index 7659b348582a..213d2c1e5759 100644 >> --- a/fs/f2fs/super.c >> +++ b/fs/f2fs/super.c >> @@ -885,6 +885,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync) >> struct f2fs_sb_info *sbi = F2FS_SB(sb); >> int err = 0; >> >> + if (unlikely(f2fs_cp_error(sbi))) >> + return 0; >> + >> trace_f2fs_sync_fs(sb, sync); >> >> if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) >> > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH 2/2] f2fs: stop all the operations by cp_error flag 2017-11-05 3:39 ` Chao Yu @ 2017-11-06 0:49 ` Jaegeuk Kim 0 siblings, 0 replies; 11+ messages in thread From: Jaegeuk Kim @ 2017-11-06 0:49 UTC (permalink / raw) To: Chao Yu; +Cc: Chao Yu, linux-kernel, linux-fsdevel, linux-f2fs-devel On 11/05, Chao Yu wrote: > Hi Jaegeuk, > > On 2017/10/24 17:51, Chao Yu wrote: > > On 2017/10/24 6:14, Jaegeuk Kim wrote: > >> This patch replaces to use cp_error flag instead of RDONLY for quota off. > > We should convert error number with block_page_mkwrite_return in .page_mkwrite, > otherwise generic/019 will cause a deadlock issue with below kernel message > printed: Fixed. :) Thanks, > > ============================================ > WARNING: possible recursive locking detected > 4.14.0-rc1 #35 Tainted: G W O > -------------------------------------------- > fio/5845 is trying to acquire lock: > (&mm->mmap_sem){++++}, at: [<c104be02>] __do_page_fault+0x482/0x510 > > but task is already holding lock: > (&mm->mmap_sem){++++}, at: [<c104ba9e>] __do_page_fault+0x11e/0x510 > > other info that might help us debug this: > Possible unsafe locking scenario: > > CPU0 > ---- > lock(&mm->mmap_sem); > lock(&mm->mmap_sem); > > *** DEADLOCK *** > > May be due to missing lock nesting notation > > 1 lock held by fio/5845: > #0: (&mm->mmap_sem){++++}, at: [<c104ba9e>] __do_page_fault+0x11e/0x510 > > stack backtrace: > CPU: 3 PID: 5845 Comm: fio Tainted: G W O 4.14.0-rc1 #35 > Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 > Call Trace: > dump_stack+0x5f/0x92 > __lock_acquire+0x1019/0x12c0 > lock_acquire+0xae/0x220 > down_read+0x38/0x60 > __do_page_fault+0x482/0x510 > do_page_fault+0x26/0x290 > common_exception+0x64/0x6a > > > --- > fs/f2fs/file.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index e67f03546391..0ce1e82591d1 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -53,8 +53,10 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) > struct dnode_of_data dn; > int err; > > - if (unlikely(f2fs_cp_error(sbi))) > - return -EIO; > + if (unlikely(f2fs_cp_error(sbi))) { > + err = -EIO; > + goto out; > + } > > sb_start_pagefault(inode->i_sb); > > @@ -66,7 +68,7 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) > err = f2fs_reserve_block(&dn, page->index); > if (err) { > f2fs_unlock_op(sbi); > - goto out; > + goto out_end; > } > f2fs_put_dnode(&dn); > f2fs_unlock_op(sbi); > @@ -114,9 +116,10 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) > > out_sem: > up_read(&F2FS_I(inode)->i_mmap_sem); > -out: > +out_end: > sb_end_pagefault(inode->i_sb); > f2fs_update_time(sbi, REQ_TIME); > +out: > return block_page_mkwrite_return(err); > } > > -- > > > Thanks, > > >> > >> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > > > Reviewed-by: Chao Yu <yuchao0@huawei.com> > > > > Thanks, > > > >> --- > >> fs/f2fs/acl.c | 3 +++ > >> fs/f2fs/checkpoint.c | 1 - > >> fs/f2fs/file.c | 23 +++++++++++++++++++++++ > >> fs/f2fs/namei.c | 30 ++++++++++++++++++++++++++++++ > >> fs/f2fs/super.c | 3 +++ > >> 5 files changed, 59 insertions(+), 1 deletion(-) > >> > >> diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c > >> index f6471f9d707e..a9bf5151e7c2 100644 > >> --- a/fs/f2fs/acl.c > >> +++ b/fs/f2fs/acl.c > >> @@ -254,6 +254,9 @@ static int __f2fs_set_acl(struct inode *inode, int type, > >> > >> int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type) > >> { > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> return __f2fs_set_acl(inode, type, acl, NULL); > >> } > >> > >> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > >> index 201608281681..6b52d4b66c7b 100644 > >> --- a/fs/f2fs/checkpoint.c > >> +++ b/fs/f2fs/checkpoint.c > >> @@ -29,7 +29,6 @@ struct kmem_cache *inode_entry_slab; > >> void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io) > >> { > >> set_ckpt_flags(sbi, CP_ERROR_FLAG); > >> - sbi->sb->s_flags |= MS_RDONLY; > >> if (!end_io) > >> f2fs_flush_merged_writes(sbi); > >> } > >> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > >> index 56232a72d2a3..0e09b9f02dc5 100644 > >> --- a/fs/f2fs/file.c > >> +++ b/fs/f2fs/file.c > >> @@ -53,6 +53,9 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) > >> struct dnode_of_data dn; > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> sb_start_pagefault(inode->i_sb); > >> > >> f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); > >> @@ -310,6 +313,8 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, > >> > >> int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) > >> { > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file))))) > >> + return -EIO; > >> return f2fs_do_sync_file(file, start, end, datasync, false); > >> } > >> > >> @@ -446,6 +451,9 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) > >> struct inode *inode = file_inode(file); > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> /* we don't need to use inline_data strictly */ > >> err = f2fs_convert_inline_inode(inode); > >> if (err) > >> @@ -632,6 +640,9 @@ int f2fs_truncate(struct inode *inode) > >> { > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || > >> S_ISLNK(inode->i_mode))) > >> return 0; > >> @@ -731,6 +742,9 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) > >> int err; > >> bool size_changed = false; > >> > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> err = setattr_prepare(dentry, attr); > >> if (err) > >> return err; > >> @@ -1459,6 +1473,9 @@ static long f2fs_fallocate(struct file *file, int mode, > >> struct inode *inode = file_inode(file); > >> long ret = 0; > >> > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> /* f2fs only support ->fallocate for regular file */ > >> if (!S_ISREG(inode->i_mode)) > >> return -EINVAL; > >> @@ -2637,6 +2654,9 @@ static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg) > >> > >> long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) > >> { > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp))))) > >> + return -EIO; > >> + > >> switch (cmd) { > >> case F2FS_IOC_GETFLAGS: > >> return f2fs_ioc_getflags(filp, arg); > >> @@ -2694,6 +2714,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > >> struct blk_plug plug; > >> ssize_t ret; > >> > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) > >> + return -EIO; > >> + > >> inode_lock(inode); > >> ret = generic_write_checks(iocb, from); > >> if (ret > 0) { > >> diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c > >> index e6f86d5d97b9..944f7a6940b6 100644 > >> --- a/fs/f2fs/namei.c > >> +++ b/fs/f2fs/namei.c > >> @@ -183,6 +183,9 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode, > >> nid_t ino = 0; > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> err = dquot_initialize(dir); > >> if (err) > >> return err; > >> @@ -227,6 +230,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, > >> struct f2fs_sb_info *sbi = F2FS_I_SB(dir); > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> if (f2fs_encrypted_inode(dir) && > >> !fscrypt_has_permitted_context(dir, inode)) > >> return -EPERM; > >> @@ -426,6 +432,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) > >> > >> trace_f2fs_unlink_enter(dir, dentry); > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> err = dquot_initialize(dir); > >> if (err) > >> return err; > >> @@ -481,6 +490,9 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry, > >> struct fscrypt_symlink_data *sd = NULL; > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> if (f2fs_encrypted_inode(dir)) { > >> err = fscrypt_get_encryption_info(dir); > >> if (err) > >> @@ -587,6 +599,9 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) > >> struct inode *inode; > >> int err; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> err = dquot_initialize(dir); > >> if (err) > >> return err; > >> @@ -639,6 +654,9 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry, > >> struct inode *inode; > >> int err = 0; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> err = dquot_initialize(dir); > >> if (err) > >> return err; > >> @@ -733,6 +751,9 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry, > >> > >> static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) > >> { > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) > >> + return -EIO; > >> + > >> if (f2fs_encrypted_inode(dir)) { > >> int err = fscrypt_get_encryption_info(dir); > >> if (err) > >> @@ -744,6 +765,9 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) > >> > >> static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout) > >> { > >> + if (unlikely(f2fs_cp_error(F2FS_I_SB(dir)))) > >> + return -EIO; > >> + > >> return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout); > >> } > >> > >> @@ -763,6 +787,9 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, > >> bool is_old_inline = f2fs_has_inline_dentry(old_dir); > >> int err = -ENOENT; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> if ((f2fs_encrypted_inode(old_dir) && > >> !fscrypt_has_encryption_key(old_dir)) || > >> (f2fs_encrypted_inode(new_dir) && > >> @@ -956,6 +983,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, > >> int old_nlink = 0, new_nlink = 0; > >> int err = -ENOENT; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return -EIO; > >> + > >> if ((f2fs_encrypted_inode(old_dir) && > >> !fscrypt_has_encryption_key(old_dir)) || > >> (f2fs_encrypted_inode(new_dir) && > >> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > >> index 7659b348582a..213d2c1e5759 100644 > >> --- a/fs/f2fs/super.c > >> +++ b/fs/f2fs/super.c > >> @@ -885,6 +885,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync) > >> struct f2fs_sb_info *sbi = F2FS_SB(sb); > >> int err = 0; > >> > >> + if (unlikely(f2fs_cp_error(sbi))) > >> + return 0; > >> + > >> trace_f2fs_sync_fs(sb, sync); > >> > >> if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) > >> > > > > > > ------------------------------------------------------------------------------ > > Check out the vibrant tech community on one of the world's most > > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > > _______________________________________________ > > Linux-f2fs-devel mailing list > > Linux-f2fs-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-23 22:14 [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Jaegeuk Kim 2017-10-23 22:14 ` [PATCH 2/2] f2fs: stop all the operations by cp_error flag Jaegeuk Kim @ 2017-10-24 9:46 ` Chao Yu 2017-10-25 5:44 ` Jaegeuk Kim 2017-10-25 5:43 ` [PATCH 1/2 v2] " Jaegeuk Kim 2 siblings, 1 reply; 11+ messages in thread From: Chao Yu @ 2017-10-24 9:46 UTC (permalink / raw) To: Jaegeuk Kim, linux-kernel, linux-fsdevel, linux-f2fs-devel On 2017/10/24 6:14, Jaegeuk Kim wrote: > This patch adds to call quota_intialize in f2fs_set_acl. > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > --- > fs/f2fs/acl.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c > index 436b3a1464d9..f6471f9d707e 100644 > --- a/fs/f2fs/acl.c > +++ b/fs/f2fs/acl.c > @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, > int error; > umode_t mode = inode->i_mode; > > + error = dquot_initialize(inode); > + if (error) > + return error; Could you move this to f2fs_setxattr, and also add missing dquot_initialize in unlink and rename like ext4? Thanks, > + > switch (type) { > case ACL_TYPE_ACCESS: > name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-24 9:46 ` [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Chao Yu @ 2017-10-25 5:44 ` Jaegeuk Kim 2017-10-25 5:57 ` Chao Yu 0 siblings, 1 reply; 11+ messages in thread From: Jaegeuk Kim @ 2017-10-25 5:44 UTC (permalink / raw) To: Chao Yu; +Cc: linux-kernel, linux-fsdevel, linux-f2fs-devel On 10/24, Chao Yu wrote: > On 2017/10/24 6:14, Jaegeuk Kim wrote: > > This patch adds to call quota_intialize in f2fs_set_acl. > > > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > --- > > fs/f2fs/acl.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c > > index 436b3a1464d9..f6471f9d707e 100644 > > --- a/fs/f2fs/acl.c > > +++ b/fs/f2fs/acl.c > > @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, > > int error; > > umode_t mode = inode->i_mode; > > > > + error = dquot_initialize(inode); > > + if (error) > > + return error; > > Could you move this to f2fs_setxattr, and also add missing dquot_initialize in > unlink and rename like ext4? I've checked that f2fs_unlink and f2fs_rename are calling dquot_initialize(). Thanks, > > Thanks, > > > + > > switch (type) { > > case ACL_TYPE_ACCESS: > > name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-25 5:44 ` Jaegeuk Kim @ 2017-10-25 5:57 ` Chao Yu 2017-10-25 6:30 ` Jaegeuk Kim 0 siblings, 1 reply; 11+ messages in thread From: Chao Yu @ 2017-10-25 5:57 UTC (permalink / raw) To: Jaegeuk Kim; +Cc: linux-kernel, linux-fsdevel, linux-f2fs-devel On 2017/10/25 13:44, Jaegeuk Kim wrote: > On 10/24, Chao Yu wrote: >> On 2017/10/24 6:14, Jaegeuk Kim wrote: >>> This patch adds to call quota_intialize in f2fs_set_acl. >>> >>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> >>> --- >>> fs/f2fs/acl.c | 4 ++++ >>> 1 file changed, 4 insertions(+) >>> >>> diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c >>> index 436b3a1464d9..f6471f9d707e 100644 >>> --- a/fs/f2fs/acl.c >>> +++ b/fs/f2fs/acl.c >>> @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, >>> int error; >>> umode_t mode = inode->i_mode; >>> >>> + error = dquot_initialize(inode); >>> + if (error) >>> + return error; >> >> Could you move this to f2fs_setxattr, and also add missing dquot_initialize in >> unlink and rename like ext4? > > I've checked that f2fs_unlink and f2fs_rename are calling dquot_initialize(). ext4_unlink: retval = dquot_initialize(dir); if (retval) return retval; retval = dquot_initialize(d_inode(dentry)); if (retval) return retval; f2fs_unlink: err = dquot_initialize(dir); if (err) return err; ext4_rename retval = dquot_initialize(old.dir); if (retval) return retval; retval = dquot_initialize(new.dir); if (retval) return retval; /* Initialize quotas before so that eventual writes go * in separate transaction */ if (new.inode) { retval = dquot_initialize(new.inode); if (retval) return retval; } f2fs_rename err = dquot_initialize(old_dir); if (err) goto out; err = dquot_initialize(new_dir); if (err) goto out; ext4 call one more dquot_initialize than f2fs, I didn't look into this in detail, but it's better to check that. :) Thanks, > > Thanks, > >> >> Thanks, >> >>> + >>> switch (type) { >>> case ACL_TYPE_ACCESS: >>> name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; >>> > > . > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-25 5:57 ` Chao Yu @ 2017-10-25 6:30 ` Jaegeuk Kim 2017-10-25 15:47 ` [f2fs-dev] " Chao Yu 0 siblings, 1 reply; 11+ messages in thread From: Jaegeuk Kim @ 2017-10-25 6:30 UTC (permalink / raw) To: Chao Yu; +Cc: linux-kernel, linux-fsdevel, linux-f2fs-devel On 10/25, Chao Yu wrote: > On 2017/10/25 13:44, Jaegeuk Kim wrote: > > On 10/24, Chao Yu wrote: > >> On 2017/10/24 6:14, Jaegeuk Kim wrote: > >>> This patch adds to call quota_intialize in f2fs_set_acl. > >>> > >>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > >>> --- > >>> fs/f2fs/acl.c | 4 ++++ > >>> 1 file changed, 4 insertions(+) > >>> > >>> diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c > >>> index 436b3a1464d9..f6471f9d707e 100644 > >>> --- a/fs/f2fs/acl.c > >>> +++ b/fs/f2fs/acl.c > >>> @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, > >>> int error; > >>> umode_t mode = inode->i_mode; > >>> > >>> + error = dquot_initialize(inode); > >>> + if (error) > >>> + return error; > >> > >> Could you move this to f2fs_setxattr, and also add missing dquot_initialize in > >> unlink and rename like ext4? > > > > I've checked that f2fs_unlink and f2fs_rename are calling dquot_initialize(). > > ext4_unlink: > > retval = dquot_initialize(dir); > if (retval) > return retval; > retval = dquot_initialize(d_inode(dentry)); > if (retval) > return retval; > > f2fs_unlink: > > err = dquot_initialize(dir); > if (err) > return err; > > ext4_rename > > retval = dquot_initialize(old.dir); > if (retval) > return retval; > retval = dquot_initialize(new.dir); > if (retval) > return retval; > > /* Initialize quotas before so that eventual writes go > * in separate transaction */ > if (new.inode) { > retval = dquot_initialize(new.inode); > if (retval) > return retval; > } > > f2fs_rename > > err = dquot_initialize(old_dir); > if (err) > goto out; > > err = dquot_initialize(new_dir); > if (err) > goto out; > > ext4 call one more dquot_initialize than f2fs, I didn't look into this in > detail, but it's better to check that. :) Ah, okay. :) This patch adds to call quota_intialize in f2fs_set_acl, f2fs_unlink, and f2fs_rename. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/namei.c | 9 +++++++++ fs/f2fs/xattr.c | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 944f7a6940b6..35d982a475b1 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -436,6 +436,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) return -EIO; err = dquot_initialize(dir); + if (err) + return err; + err = dquot_initialize(inode); if (err) return err; @@ -815,6 +818,12 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, if (err) goto out; + if (new_inode) { + err = dquot_initialize(new_inode); + if (err) + goto out; + } + old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); if (!old_entry) { if (IS_ERR(old_page)) diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index 147b481c6902..8801db019892 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c @@ -686,6 +686,10 @@ int f2fs_setxattr(struct inode *inode, int index, const char *name, struct f2fs_sb_info *sbi = F2FS_I_SB(inode); int err; + err = dquot_initialize(inode); + if (err) + return err; + /* this case is only from init_inode_metadata */ if (ipage) return __f2fs_setxattr(inode, index, name, value, -- 2.14.0.rc1.383.gd1ce394fe2-goog ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [f2fs-dev] [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-25 6:30 ` Jaegeuk Kim @ 2017-10-25 15:47 ` Chao Yu 0 siblings, 0 replies; 11+ messages in thread From: Chao Yu @ 2017-10-25 15:47 UTC (permalink / raw) To: Jaegeuk Kim, Chao Yu; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel On 2017/10/25 14:30, Jaegeuk Kim wrote: > On 10/25, Chao Yu wrote: >> On 2017/10/25 13:44, Jaegeuk Kim wrote: >>> On 10/24, Chao Yu wrote: >>>> On 2017/10/24 6:14, Jaegeuk Kim wrote: >>>>> This patch adds to call quota_intialize in f2fs_set_acl. >>>>> >>>>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> >>>>> --- >>>>> fs/f2fs/acl.c | 4 ++++ >>>>> 1 file changed, 4 insertions(+) >>>>> >>>>> diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c >>>>> index 436b3a1464d9..f6471f9d707e 100644 >>>>> --- a/fs/f2fs/acl.c >>>>> +++ b/fs/f2fs/acl.c >>>>> @@ -209,6 +209,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, >>>>> int error; >>>>> umode_t mode = inode->i_mode; >>>>> >>>>> + error = dquot_initialize(inode); >>>>> + if (error) >>>>> + return error; >>>> >>>> Could you move this to f2fs_setxattr, and also add missing dquot_initialize in >>>> unlink and rename like ext4? >>> >>> I've checked that f2fs_unlink and f2fs_rename are calling dquot_initialize(). >> >> ext4_unlink: >> >> retval = dquot_initialize(dir); >> if (retval) >> return retval; >> retval = dquot_initialize(d_inode(dentry)); >> if (retval) >> return retval; >> >> f2fs_unlink: >> >> err = dquot_initialize(dir); >> if (err) >> return err; >> >> ext4_rename >> >> retval = dquot_initialize(old.dir); >> if (retval) >> return retval; >> retval = dquot_initialize(new.dir); >> if (retval) >> return retval; >> >> /* Initialize quotas before so that eventual writes go >> * in separate transaction */ >> if (new.inode) { >> retval = dquot_initialize(new.inode); >> if (retval) >> return retval; >> } >> >> f2fs_rename >> >> err = dquot_initialize(old_dir); >> if (err) >> goto out; >> >> err = dquot_initialize(new_dir); >> if (err) >> goto out; >> >> ext4 call one more dquot_initialize than f2fs, I didn't look into this in >> detail, but it's better to check that. :) > > Ah, okay. :) > > This patch adds to call quota_intialize in f2fs_set_acl, f2fs_unlink, > and f2fs_rename. > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Reviewed-by: Chao Yu <yuchao0@huawei.com> Thanks, > --- > fs/f2fs/namei.c | 9 +++++++++ > fs/f2fs/xattr.c | 4 ++++ > 2 files changed, 13 insertions(+) > > diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c > index 944f7a6940b6..35d982a475b1 100644 > --- a/fs/f2fs/namei.c > +++ b/fs/f2fs/namei.c > @@ -436,6 +436,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) > return -EIO; > > err = dquot_initialize(dir); > + if (err) > + return err; > + err = dquot_initialize(inode); > if (err) > return err; > > @@ -815,6 +818,12 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, > if (err) > goto out; > > + if (new_inode) { > + err = dquot_initialize(new_inode); > + if (err) > + goto out; > + } > + > old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page); > if (!old_entry) { > if (IS_ERR(old_page)) > diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c > index 147b481c6902..8801db019892 100644 > --- a/fs/f2fs/xattr.c > +++ b/fs/f2fs/xattr.c > @@ -686,6 +686,10 @@ int f2fs_setxattr(struct inode *inode, int index, const char *name, > struct f2fs_sb_info *sbi = F2FS_I_SB(inode); > int err; > > + err = dquot_initialize(inode); > + if (err) > + return err; > + > /* this case is only from init_inode_metadata */ > if (ipage) > return __f2fs_setxattr(inode, index, name, value, > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2 v2] f2fs: add missing quota_initialize in f2fs_set_acl 2017-10-23 22:14 [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Jaegeuk Kim 2017-10-23 22:14 ` [PATCH 2/2] f2fs: stop all the operations by cp_error flag Jaegeuk Kim 2017-10-24 9:46 ` [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Chao Yu @ 2017-10-25 5:43 ` Jaegeuk Kim 2 siblings, 0 replies; 11+ messages in thread From: Jaegeuk Kim @ 2017-10-25 5:43 UTC (permalink / raw) To: linux-kernel, linux-fsdevel, linux-f2fs-devel This patch adds to call quota_intialize in f2fs_set_acl. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/xattr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index 147b481c6902..8801db019892 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c @@ -686,6 +686,10 @@ int f2fs_setxattr(struct inode *inode, int index, const char *name, struct f2fs_sb_info *sbi = F2FS_I_SB(inode); int err; + err = dquot_initialize(inode); + if (err) + return err; + /* this case is only from init_inode_metadata */ if (ipage) return __f2fs_setxattr(inode, index, name, value, -- 2.14.0.rc1.383.gd1ce394fe2-goog ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-11-06 0:49 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-10-23 22:14 [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Jaegeuk Kim 2017-10-23 22:14 ` [PATCH 2/2] f2fs: stop all the operations by cp_error flag Jaegeuk Kim 2017-10-24 9:51 ` [f2fs-dev] " Chao Yu 2017-11-05 3:39 ` Chao Yu 2017-11-06 0:49 ` Jaegeuk Kim 2017-10-24 9:46 ` [PATCH 1/2] f2fs: add missing quota_initialize in f2fs_set_acl Chao Yu 2017-10-25 5:44 ` Jaegeuk Kim 2017-10-25 5:57 ` Chao Yu 2017-10-25 6:30 ` Jaegeuk Kim 2017-10-25 15:47 ` [f2fs-dev] " Chao Yu 2017-10-25 5:43 ` [PATCH 1/2 v2] " Jaegeuk Kim
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).