ext4: store EXT4_EXT_MIGRATE in i_state instead of i_flags
EXT4_EXT_MIGRATE is only intended to be used for an in-memory flag, and the hex value assigned to it collides with FS_DIRECTIO_FL (which is also stored in i_flags). There's no reason for the EXT4_EXT_MIGRATE bit to be stored in i_flags, so we switch it to use i_state instead. Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
fb0a387dcd
commit
1b9c12f44c
3 changed files with 13 additions and 15 deletions
|
@ -353,17 +353,16 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode,
|
|||
|
||||
down_write(&EXT4_I(inode)->i_data_sem);
|
||||
/*
|
||||
* if EXT4_EXT_MIGRATE is cleared a block allocation
|
||||
* if EXT4_STATE_EXT_MIGRATE is cleared a block allocation
|
||||
* happened after we started the migrate. We need to
|
||||
* fail the migrate
|
||||
*/
|
||||
if (!(EXT4_I(inode)->i_flags & EXT4_EXT_MIGRATE)) {
|
||||
if (!(EXT4_I(inode)->i_state & EXT4_STATE_EXT_MIGRATE)) {
|
||||
retval = -EAGAIN;
|
||||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
goto err_out;
|
||||
} else
|
||||
EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags &
|
||||
~EXT4_EXT_MIGRATE;
|
||||
EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE;
|
||||
/*
|
||||
* We have the extent map build with the tmp inode.
|
||||
* Now copy the i_data across
|
||||
|
@ -517,14 +516,15 @@ int ext4_ext_migrate(struct inode *inode)
|
|||
* when we add extents we extent the journal
|
||||
*/
|
||||
/*
|
||||
* Even though we take i_mutex we can still cause block allocation
|
||||
* via mmap write to holes. If we have allocated new blocks we fail
|
||||
* migrate. New block allocation will clear EXT4_EXT_MIGRATE flag.
|
||||
* The flag is updated with i_data_sem held to prevent racing with
|
||||
* block allocation.
|
||||
* Even though we take i_mutex we can still cause block
|
||||
* allocation via mmap write to holes. If we have allocated
|
||||
* new blocks we fail migrate. New block allocation will
|
||||
* clear EXT4_STATE_EXT_MIGRATE flag. The flag is updated
|
||||
* with i_data_sem held to prevent racing with block
|
||||
* allocation.
|
||||
*/
|
||||
down_read((&EXT4_I(inode)->i_data_sem));
|
||||
EXT4_I(inode)->i_flags = EXT4_I(inode)->i_flags | EXT4_EXT_MIGRATE;
|
||||
EXT4_I(inode)->i_state |= EXT4_STATE_EXT_MIGRATE;
|
||||
up_read((&EXT4_I(inode)->i_data_sem));
|
||||
|
||||
handle = ext4_journal_start(inode, 1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue