diff mbox

[1/2] f2fs: retry ENOMEM for quota_read|write

Message ID 20171019165617.79128-1-jaegeuk@kernel.org (mailing list archive)
State New, archived
Headers show

Commit Message

Jaegeuk Kim Oct. 19, 2017, 4:56 p.m. UTC
This gives another chance to read or write quota data.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
 fs/f2fs/super.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Comments

Chao Yu Oct. 22, 2017, 3:02 p.m. UTC | #1
On 2017/10/20 0:56, Jaegeuk Kim wrote:
> This gives another chance to read or write quota data.
> 
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

> ---
>  fs/f2fs/super.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index fc3b74e53670..2c6e9adce464 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1351,8 +1351,13 @@ static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
>  		tocopy = min_t(unsigned long, sb->s_blocksize - offset, toread);
>  repeat:
>  		page = read_mapping_page(mapping, blkidx, NULL);
> -		if (IS_ERR(page))
> +		if (IS_ERR(page)) {
> +			if (PTR_ERR(page) == -ENOMEM) {
> +				congestion_wait(BLK_RW_ASYNC, HZ/50);
> +				goto repeat;
> +			}
>  			return PTR_ERR(page);
> +		}
>  
>  		lock_page(page);
>  
> @@ -1395,10 +1400,14 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
>  	while (towrite > 0) {
>  		tocopy = min_t(unsigned long, sb->s_blocksize - offset,
>  								towrite);
> -
> +retry:
>  		err = a_ops->write_begin(NULL, mapping, off, tocopy, 0,
>  							&page, NULL);
>  		if (unlikely(err)) {
> +			if (err == -ENOMEM) {
> +				congestion_wait(BLK_RW_ASYNC, HZ/50);
> +				goto retry;
> +			}
>  			if (len == towrite)
>  				return err;
>  			break;
>
diff mbox

Patch

diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index fc3b74e53670..2c6e9adce464 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1351,8 +1351,13 @@  static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
 		tocopy = min_t(unsigned long, sb->s_blocksize - offset, toread);
 repeat:
 		page = read_mapping_page(mapping, blkidx, NULL);
-		if (IS_ERR(page))
+		if (IS_ERR(page)) {
+			if (PTR_ERR(page) == -ENOMEM) {
+				congestion_wait(BLK_RW_ASYNC, HZ/50);
+				goto repeat;
+			}
 			return PTR_ERR(page);
+		}
 
 		lock_page(page);
 
@@ -1395,10 +1400,14 @@  static ssize_t f2fs_quota_write(struct super_block *sb, int type,
 	while (towrite > 0) {
 		tocopy = min_t(unsigned long, sb->s_blocksize - offset,
 								towrite);
-
+retry:
 		err = a_ops->write_begin(NULL, mapping, off, tocopy, 0,
 							&page, NULL);
 		if (unlikely(err)) {
+			if (err == -ENOMEM) {
+				congestion_wait(BLK_RW_ASYNC, HZ/50);
+				goto retry;
+			}
 			if (len == towrite)
 				return err;
 			break;