On 2020/3/23 10:00, Joe Perches wrote: > On Mon, 2020-03-23 at 09:25 +0800, Chao Yu wrote: >> f2fs_inode_info.flags is unsigned long variable, it has 32 bits >> in 32bit architecture, since we introduced FI_MMAP_FILE flag >> when we support data compression, we may access memory cross >> the border of .flags field, corrupting .i_sem field, result in >> below deadlock. >> >> To fix this issue, let's expand .flags as an array to grab enough >> space to store new flags. > [] >> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > [] >> @@ -2586,22 +2590,28 @@ static inline void __mark_inode_dirty_flag(struct >> inode *inode, >> } >> } >> >> +static inline void __set_inode_flag(struct inode *inode, int flag) >> +{ >> + test_and_set_bit(flag % BITS_PER_LONG, >> + &F2FS_I(inode)->flags[BIT_WORD(flag)]); > > I believe this should just use > > test_and_set_bit(flag, F2FS_I(inode)->flags); > >> static inline int is_inode_flag_set(struct inode *inode, int flag) >> { >> - return test_bit(flag, &F2FS_I(inode)->flags); >> + return test_bit(flag % BITS_PER_LONG, >> + &F2FS_I(inode)->flags[BIT_WORD(flag)]); > > here too. > > test_bit(flag, F2FS_I(inode)->flags); > >> static inline void clear_inode_flag(struct inode *inode, int flag) >> { >> - if (test_bit(flag, &F2FS_I(inode)->flags)) >> - clear_bit(flag, &F2FS_I(inode)->flags); >> + test_and_clear_bit(flag % BITS_PER_LONG, >> + &F2FS_I(inode)->flags[BIT_WORD(flag)]); > > and here.
My bad, Ondřej Jirman also reminded me this issue, will fix this soon. Thanks, > > I also don't know why these functions are used at all. > > > . > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel