ext4: add mask of ext4 flags to swap
The reason is that while swapping two inode, we swap the flags too. Some flags such as EXT4_JOURNAL_DATA_FL can really confuse the things since we're not resetting the address operations structure. The simplest way to keep things sane is to restrict the flags that can be swapped. Signed-off-by: yangerkun <yangerkun@huawei.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@vger.kernel.org
This commit is contained in:
@@ -63,6 +63,7 @@ static void swap_inode_data(struct inode *inode1, struct inode *inode2)
|
||||
loff_t isize;
|
||||
struct ext4_inode_info *ei1;
|
||||
struct ext4_inode_info *ei2;
|
||||
unsigned long tmp;
|
||||
|
||||
ei1 = EXT4_I(inode1);
|
||||
ei2 = EXT4_I(inode2);
|
||||
@@ -72,7 +73,10 @@ static void swap_inode_data(struct inode *inode1, struct inode *inode2)
|
||||
swap(inode1->i_mtime, inode2->i_mtime);
|
||||
|
||||
memswap(ei1->i_data, ei2->i_data, sizeof(ei1->i_data));
|
||||
swap(ei1->i_flags, ei2->i_flags);
|
||||
tmp = ei1->i_flags & EXT4_FL_SHOULD_SWAP;
|
||||
ei1->i_flags = (ei2->i_flags & EXT4_FL_SHOULD_SWAP) |
|
||||
(ei1->i_flags & ~EXT4_FL_SHOULD_SWAP);
|
||||
ei2->i_flags = tmp | (ei2->i_flags & ~EXT4_FL_SHOULD_SWAP);
|
||||
swap(ei1->i_disksize, ei2->i_disksize);
|
||||
ext4_es_remove_extent(inode1, 0, EXT_MAX_BLOCKS);
|
||||
ext4_es_remove_extent(inode2, 0, EXT_MAX_BLOCKS);
|
||||
|
Reference in New Issue
Block a user