On 2018/2/26 20:31, heyunlei wrote:
>
>
>> -----Original Message-----
>> From: heyunlei
>> Sent: Monday, February 26, 2018 8:07 PM
>> To: [email protected]; [email protected]; Yuchao (T)
>> Cc: Jianing (Euler); Wangbintian; heyunlei
>> Subject: [f2fs-dev][PATCH] f2fs: check blkaddr more accuratly before issue a
>> bio
>>
>> This patch check blkaddr more accuratly before issue a
>> write or read bio.
>>
>> Signed-off-by: Yunlei He <[email protected]>
>> ---
>> fs/f2fs/data.c | 6 ++++--
>> fs/f2fs/segment.h | 9 +++++++--
>> 2 files changed, 11 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
>> index 62ead5e..5dc93bc 100644
>> --- a/fs/f2fs/data.c
>> +++ b/fs/f2fs/data.c
>> @@ -383,6 +383,8 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
>> struct page *page = fio->encrypted_page ?
>> fio->encrypted_page : fio->page;
>>
>> + verify_block_addr(fio->sbi, fio->new_blkaddr,
>> + PAGE_TYPE_OF_BIO(fio->type));
>
>
> I'm sorry that read io will check fail during recovery or restore summary.
>
> Could we check read io by previous method, write io with new method?
Hmm.. for META_POR or migration of encrypted pages pathes, we can add a
parameter (.use_meta?) in fio structure to indicate that current user will
borrow meta inode's mapping to issue read/write IO into main area, and then in
verify_block_addr we can check blkaddr as node's or data's one. How do you
think?
Thanks,
> For I came across a broken partition, whose sit area is covered by a log file
> data.
>
>> trace_f2fs_submit_page_bio(page, fio);
>> f2fs_trace_ios(fio, 0);
>>
>> @@ -428,8 +430,8 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio)
>> }
>>
>> if (fio->old_blkaddr != NEW_ADDR)
>> - verify_block_addr(sbi, fio->old_blkaddr);
>> - verify_block_addr(sbi, fio->new_blkaddr);
>> + verify_block_addr(sbi, fio->old_blkaddr, btype);
>> + verify_block_addr(sbi, fio->new_blkaddr, btype);
>>
>> bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page;
>>
>> diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
>> index f11c4bc..45c4e8d 100644
>> --- a/fs/f2fs/segment.h
>> +++ b/fs/f2fs/segment.h
>> @@ -630,9 +630,14 @@ static inline void check_seg_range(struct f2fs_sb_info
>> *sbi, unsigned int segno)
>> f2fs_bug_on(sbi, segno > TOTAL_SEGS(sbi) - 1);
>> }
>>
>> -static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t
>> blk_addr)
>> +static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t
>> blk_addr,
>> + enum page_type
>> btype)
>> {
>> - BUG_ON(blk_addr < SEG0_BLKADDR(sbi)
>> + if (btype == META)
>> + BUG_ON(blk_addr < SEG0_BLKADDR(sbi)
>> + || blk_addr >= MAIN_BLKADDR(sbi));
>> + else
>> + BUG_ON(blk_addr < MAIN_BLKADDR(sbi)
>> || blk_addr >= MAX_BLKADDR(sbi));
>> }
>>
>> --
>> 2.7.4
>
>
> .
>
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel