btrfs: Make check_can_nocow take btrfs_inode

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Nikolay Borisov 2017-02-20 13:50:50 +02:00 committed by David Sterba
parent a776c6fa1f
commit 85b7ab6705
1 changed files with 12 additions and 10 deletions

View File

@ -1474,11 +1474,11 @@ lock_and_cleanup_extent_if_need(struct inode *inode, struct page **pages,
return ret; return ret;
} }
static noinline int check_can_nocow(struct inode *inode, loff_t pos, static noinline int check_can_nocow(struct btrfs_inode *inode, loff_t pos,
size_t *write_bytes) size_t *write_bytes)
{ {
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_root *root = inode->root;
struct btrfs_ordered_extent *ordered; struct btrfs_ordered_extent *ordered;
u64 lockstart, lockend; u64 lockstart, lockend;
u64 num_bytes; u64 num_bytes;
@ -1493,19 +1493,20 @@ static noinline int check_can_nocow(struct inode *inode, loff_t pos,
fs_info->sectorsize) - 1; fs_info->sectorsize) - 1;
while (1) { while (1) {
lock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); lock_extent(&inode->io_tree, lockstart, lockend);
ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), lockstart, ordered = btrfs_lookup_ordered_range(inode, lockstart,
lockend - lockstart + 1); lockend - lockstart + 1);
if (!ordered) { if (!ordered) {
break; break;
} }
unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); unlock_extent(&inode->io_tree, lockstart, lockend);
btrfs_start_ordered_extent(inode, ordered, 1); btrfs_start_ordered_extent(&inode->vfs_inode, ordered, 1);
btrfs_put_ordered_extent(ordered); btrfs_put_ordered_extent(ordered);
} }
num_bytes = lockend - lockstart + 1; num_bytes = lockend - lockstart + 1;
ret = can_nocow_extent(inode, lockstart, &num_bytes, NULL, NULL, NULL); ret = can_nocow_extent(&inode->vfs_inode, lockstart, &num_bytes,
NULL, NULL, NULL);
if (ret <= 0) { if (ret <= 0) {
ret = 0; ret = 0;
btrfs_end_write_no_snapshoting(root); btrfs_end_write_no_snapshoting(root);
@ -1514,7 +1515,7 @@ static noinline int check_can_nocow(struct inode *inode, loff_t pos,
num_bytes - pos + lockstart); num_bytes - pos + lockstart);
} }
unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); unlock_extent(&inode->io_tree, lockstart, lockend);
return ret; return ret;
} }
@ -1579,7 +1580,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
if (ret < 0) { if (ret < 0) {
if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW |
BTRFS_INODE_PREALLOC)) && BTRFS_INODE_PREALLOC)) &&
check_can_nocow(inode, pos, &write_bytes) > 0) { check_can_nocow(BTRFS_I(inode), pos,
&write_bytes) > 0) {
/* /*
* For nodata cow case, no need to reserve * For nodata cow case, no need to reserve
* data space. * data space.