All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chao Yu <chao@kernel.org>
To: Chao Yu <yuchao0@huawei.com>, Jaegeuk Kim <jaegeuk@kernel.org>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH 2/2] f2fs: stop all the operations by cp_error flag
Date: Sun, 5 Nov 2017 11:39:59 +0800	[thread overview]
Message-ID: <1d3d0d9c-a20a-9d3a-0b7f-a34e2e62b8a5@kernel.org> (raw)
In-Reply-To: <200e3f93-c9bb-381e-9b00-1f50ab82631c@huawei.com>

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
> 

WARNING: multiple messages have this Message-ID (diff)
From: Chao Yu <chao@kernel.org>
To: Chao Yu <yuchao0@huawei.com>, Jaegeuk Kim <jaegeuk@kernel.org>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [PATCH 2/2] f2fs: stop all the operations by cp_error flag
Date: Sun, 5 Nov 2017 11:39:59 +0800	[thread overview]
Message-ID: <1d3d0d9c-a20a-9d3a-0b7f-a34e2e62b8a5@kernel.org> (raw)
In-Reply-To: <200e3f93-c9bb-381e-9b00-1f50ab82631c@huawei.com>

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
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

  reply	other threads:[~2017-11-05  3:40 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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-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-10-24  9:51     ` Chao Yu
2017-11-05  3:39     ` Chao Yu [this message]
2017-11-05  3:39       ` Chao Yu
2017-11-06  0:49       ` [f2fs-dev] " Jaegeuk Kim
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-24  9:46   ` Chao Yu
2017-10-25  5:44   ` Jaegeuk Kim
2017-10-25  5:57     ` Chao Yu
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 15:47           ` Chao Yu
2017-10-25  5:43 ` [PATCH 1/2 v2] " Jaegeuk Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1d3d0d9c-a20a-9d3a-0b7f-a34e2e62b8a5@kernel.org \
    --to=chao@kernel.org \
    --cc=jaegeuk@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=yuchao0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.