|
@@ -1186,14 +1186,14 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
pg_start = offset >> PAGE_SHIFT;
|
|
pg_start = offset >> PAGE_SHIFT;
|
|
pg_end = (offset + len) >> PAGE_SHIFT;
|
|
pg_end = (offset + len) >> PAGE_SHIFT;
|
|
|
|
|
|
|
|
+ /* avoid gc operation during block exchange */
|
|
|
|
+ down_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
+
|
|
down_write(&F2FS_I(inode)->i_mmap_sem);
|
|
down_write(&F2FS_I(inode)->i_mmap_sem);
|
|
/* write out all dirty pages from offset */
|
|
/* write out all dirty pages from offset */
|
|
ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
|
|
ret = filemap_write_and_wait_range(inode->i_mapping, offset, LLONG_MAX);
|
|
if (ret)
|
|
if (ret)
|
|
- goto out;
|
|
|
|
-
|
|
|
|
- /* avoid gc operation during block exchange */
|
|
|
|
- down_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
truncate_pagecache(inode, offset);
|
|
truncate_pagecache(inode, offset);
|
|
|
|
|
|
@@ -1212,9 +1212,8 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
|
|
if (!ret)
|
|
if (!ret)
|
|
f2fs_i_size_write(inode, new_size);
|
|
f2fs_i_size_write(inode, new_size);
|
|
out_unlock:
|
|
out_unlock:
|
|
- up_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
-out:
|
|
|
|
up_write(&F2FS_I(inode)->i_mmap_sem);
|
|
up_write(&F2FS_I(inode)->i_mmap_sem);
|
|
|
|
+ up_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1385,6 +1384,9 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
|
|
|
f2fs_balance_fs(sbi, true);
|
|
f2fs_balance_fs(sbi, true);
|
|
|
|
|
|
|
|
+ /* avoid gc operation during block exchange */
|
|
|
|
+ down_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
+
|
|
down_write(&F2FS_I(inode)->i_mmap_sem);
|
|
down_write(&F2FS_I(inode)->i_mmap_sem);
|
|
ret = truncate_blocks(inode, i_size_read(inode), true);
|
|
ret = truncate_blocks(inode, i_size_read(inode), true);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -1395,9 +1397,6 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
|
|
if (ret)
|
|
if (ret)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- /* avoid gc operation during block exchange */
|
|
|
|
- down_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
-
|
|
|
|
truncate_pagecache(inode, offset);
|
|
truncate_pagecache(inode, offset);
|
|
|
|
|
|
pg_start = offset >> PAGE_SHIFT;
|
|
pg_start = offset >> PAGE_SHIFT;
|
|
@@ -1425,10 +1424,9 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
|
|
|
|
|
|
if (!ret)
|
|
if (!ret)
|
|
f2fs_i_size_write(inode, new_size);
|
|
f2fs_i_size_write(inode, new_size);
|
|
-
|
|
|
|
- up_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
|
|
out:
|
|
out:
|
|
up_write(&F2FS_I(inode)->i_mmap_sem);
|
|
up_write(&F2FS_I(inode)->i_mmap_sem);
|
|
|
|
+ up_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|