ext4: Use bitops to read/modify i_flags in struct ext4_inode_info
At several places we modify EXT4_I(inode)->i_flags without holding i_mutex (ext4_do_update_inode, ...). These modifications are racy and we can lose updates to i_flags. So convert handling of i_flags to use bitops which are atomic. https://bugzilla.kernel.org/show_bug.cgi?id=15792 Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
committed by
Theodore Ts'o
parent
24676da469
commit
12e9b89200
@@ -492,7 +492,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||
|
||||
if (S_ISDIR(mode) &&
|
||||
((parent == sb->s_root->d_inode) ||
|
||||
(EXT4_I(parent)->i_flags & EXT4_TOPDIR_FL))) {
|
||||
(ext4_test_inode_flag(parent, EXT4_INODE_TOPDIR)))) {
|
||||
int best_ndir = inodes_per_group;
|
||||
int ret = -1;
|
||||
|
||||
@@ -1038,7 +1038,7 @@ got:
|
||||
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
|
||||
/* set extent flag only for directory, file and normal symlink*/
|
||||
if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) {
|
||||
EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
|
||||
ext4_set_inode_flag(inode, EXT4_INODE_EXTENTS);
|
||||
ext4_ext_tree_init(handle, inode);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user