| From 0c62d16a30887817e99877f76083144e5d845c49 Mon Sep 17 00:00:00 2001 |
| From: Junxiao Bi <junxiao.bi@oracle.com> |
| Date: Fri, 28 Dec 2018 00:32:57 -0800 |
| Subject: ocfs2: don't clear bh uptodate for block read |
| |
| [ Upstream commit 70306d9dce75abde855cefaf32b3f71eed8602a3 ] |
| |
| For sync io read in ocfs2_read_blocks_sync(), first clear bh uptodate flag |
| and submit the io, second wait io done, last check whether bh uptodate, if |
| not return io error. |
| |
| If two sync io for the same bh were issued, it could be the first io done |
| and set uptodate flag, but just before check that flag, the second io came |
| in and cleared uptodate, then ocfs2_read_blocks_sync() for the first io |
| will return IO error. |
| |
| Indeed it's not necessary to clear uptodate flag, as the io end handler |
| end_buffer_read_sync() will set or clear it based on io succeed or failed. |
| |
| The following message was found from a nfs server but the underlying |
| storage returned no error. |
| |
| [4106438.567376] (nfsd,7146,3):ocfs2_get_suballoc_slot_bit:2780 ERROR: read block 1238823695 failed -5 |
| [4106438.567569] (nfsd,7146,3):ocfs2_get_suballoc_slot_bit:2812 ERROR: status = -5 |
| [4106438.567611] (nfsd,7146,3):ocfs2_test_inode_bit:2894 ERROR: get alloc slot and bit failed -5 |
| [4106438.567643] (nfsd,7146,3):ocfs2_test_inode_bit:2932 ERROR: status = -5 |
| [4106438.567675] (nfsd,7146,3):ocfs2_get_dentry:94 ERROR: test inode bit failed -5 |
| |
| Same issue in non sync read ocfs2_read_blocks(), fixed it as well. |
| |
| Link: http://lkml.kernel.org/r/20181121020023.3034-4-junxiao.bi@oracle.com |
| Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com> |
| Reviewed-by: Changwei Ge <ge.changwei@h3c.com> |
| Reviewed-by: Yiwen Jiang <jiangyiwen@huawei.com> |
| Cc: Joel Becker <jlbec@evilplan.org> |
| Cc: Joseph Qi <jiangqi903@gmail.com> |
| Cc: Jun Piao <piaojun@huawei.com> |
| Cc: Mark Fasheh <mfasheh@versity.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ocfs2/buffer_head_io.c | 2 -- |
| 1 file changed, 2 deletions(-) |
| |
| diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c |
| index 1d098c3c00e0..9f8250df99f1 100644 |
| --- a/fs/ocfs2/buffer_head_io.c |
| +++ b/fs/ocfs2/buffer_head_io.c |
| @@ -152,7 +152,6 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, |
| #endif |
| } |
| |
| - clear_buffer_uptodate(bh); |
| get_bh(bh); /* for end_buffer_read_sync() */ |
| bh->b_end_io = end_buffer_read_sync; |
| submit_bh(REQ_OP_READ, 0, bh); |
| @@ -306,7 +305,6 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, |
| continue; |
| } |
| |
| - clear_buffer_uptodate(bh); |
| get_bh(bh); /* for end_buffer_read_sync() */ |
| if (validate) |
| set_buffer_needs_validate(bh); |
| -- |
| 2.19.1 |
| |