[Ocfs2-devel] [PATCH RESEND] ocfs2: fix a misuse a of brelse after failing ocfs2_check_dir_entry

piaojun piaojun at huawei.com
Sat Nov 10 00:04:31 PST 2018


Hi Changwei,

Sorry for the oversight for your patch. There is nothing wrong.

Thanks,
Jun

On 2018/11/10 15:58, Changwei Ge wrote:
> Hi Jun,
> 
> Thanks for looking into this, my code from Linux mainline is not looked like yours...
> 
> On 2018/11/10 14:36, piaojun wrote:
>> Hi Changwei,
>>
>> On 2018/5/28 22:40, Changwei Ge wrote:
>>> From: Changwei Ge <ge.changwei at h3c.com>
>>>
>>> Somehow, file system metadata was corrupted, which causes
>>> ocfs2_check_dir_entry() to fail in function ocfs2_dir_foreach_blk_el().
>>>
>>> According to the original design intention, if above happens we should
>>> skip the problematic block and continue to retrieve dir entry. But there
>>> is obviouse misuse of brelse around related code.
>>>
>>> After failure of ocfs2_check_dir_entry(), currunt code just moves to next
>>> position and uses the problematic buffer head again and again during
>>> which the problematic buffer head is released for multiple times. I
>>> suppose, this a serious issue which is long-lived in ocfs2. This may
>>> cause other file systems which is also used in a the same host insane.
>>>
>>> So we should also consider about bakcporting this patch into
>>> linux -stable.
>>>
>>> Suggested-by: Changkuo Shi <shi.changkuo at h3c.com>
>>> Cc: stable at vger.kernel.org
>>> Signed-off-by: Changwei Ge <ge.changwei at h3c.com>
>>> ---
>>>   fs/ocfs2/dir.c | 3 +--
>>>   1 file changed, 1 insertion(+), 2 deletions(-)
>>>
>>> diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
>>> index b048d4f..c121abb 100644
>>> --- a/fs/ocfs2/dir.c
>>> +++ b/fs/ocfs2/dir.c
>>> @@ -1897,8 +1897,7 @@ static int ocfs2_dir_foreach_blk_el(struct inode *inode,
>>>   				/* On error, skip the f_pos to the
>>>   				   next block. */
>>>   				ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 1;
>>> -				brelse(bh);
>>> -				continue;
>>> +				break;
>>
>> I guess return is more appropriate than break here as it will cause double
>> free buffer:
>>
>> "
>> ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 1;
>> brelse(bh);
>> break;
>> "
> 
> Linux mainline should not have 'brelse(bh)', could your please rebase your tree?
> 
> '''
> ccd979bdb (Mark Fasheh         2005-12-15 14:31:24 -0800 1897)                          /* On error, skip the f_pos to the
> ccd979bdb (Mark Fasheh         2005-12-15 14:31:24 -0800 1898)                             next block. */
> 3704412bd (Al Viro             2013-05-22 21:06:00 -0400 1899)                          ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 1;
> 29aa30167 (Changwei Ge         2018-11-02 15:48:15 -0700 1900)                          break;
> '''
>>
>> "
>> brelse(bh);
>> bh = NULL;
>> if (!persist && stored)
>> 	break;
>> "
>>
>> Thanks,
>> Jun
>>
>>>   			}
>>>   			if (le64_to_cpu(de->inode)) {
>>>   				unsigned char d_type = DT_UNKNOWN;
>>>
>>
>> _______________________________________________
>> Ocfs2-devel mailing list
>> Ocfs2-devel at oss.oracle.com
>> https://oss.oracle.com/mailman/listinfo/ocfs2-devel
>>
> .
> 



More information about the Ocfs2-devel mailing list