Skip to content

Commit

Permalink
vfs: pass remap flags to generic_remap_file_range_prep
Browse files Browse the repository at this point in the history
Plumb the remap flags through the filesystem from the vfs function
dispatcher all the way to the prep function to prepare for behavior
changes in subsequent patches.

Signed-off-by: Darrick J. Wong <[email protected]>
Reviewed-by: Amir Goldstein <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Dave Chinner <[email protected]>
  • Loading branch information
djwong authored and dchinner committed Oct 29, 2018
1 parent 2e5dfc9 commit a91ae49
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 24 deletions.
2 changes: 1 addition & 1 deletion fs/ocfs2/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -2538,7 +2538,7 @@ static int ocfs2_remap_file_range(struct file *file_in,
return -EINVAL;

return ocfs2_reflink_remap_range(file_in, pos_in, file_out, pos_out,
len, remap_flags & REMAP_FILE_DEDUP);
len, remap_flags);
}

const struct inode_operations ocfs2_file_iops = {
Expand Down
4 changes: 2 additions & 2 deletions fs/ocfs2/refcounttree.c
Original file line number Diff line number Diff line change
Expand Up @@ -4825,7 +4825,7 @@ int ocfs2_reflink_remap_range(struct file *file_in,
struct file *file_out,
loff_t pos_out,
u64 len,
bool is_dedupe)
unsigned int remap_flags)
{
struct inode *inode_in = file_inode(file_in);
struct inode *inode_out = file_inode(file_out);
Expand All @@ -4851,7 +4851,7 @@ int ocfs2_reflink_remap_range(struct file *file_in,
goto out_unlock;

ret = generic_remap_file_range_prep(file_in, pos_in, file_out, pos_out,
&len, is_dedupe);
&len, remap_flags);
if (ret <= 0)
goto out_unlock;

Expand Down
2 changes: 1 addition & 1 deletion fs/ocfs2/refcounttree.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,6 @@ int ocfs2_reflink_remap_range(struct file *file_in,
struct file *file_out,
loff_t pos_out,
u64 len,
bool is_dedupe);
unsigned int remap_flags);

#endif /* OCFS2_REFCOUNTTREE_H */
14 changes: 7 additions & 7 deletions fs/read_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -1722,14 +1722,14 @@ static int generic_remap_check_len(struct inode *inode_in,
struct inode *inode_out,
loff_t pos_out,
u64 *len,
bool is_dedupe)
unsigned int remap_flags)
{
u64 blkmask = i_blocksize(inode_in) - 1;

if ((*len & blkmask) == 0)
return 0;

if (is_dedupe)
if (remap_flags & REMAP_FILE_DEDUP)
*len &= ~blkmask;
else if (pos_out + *len < i_size_read(inode_out))
return -EINVAL;
Expand All @@ -1747,7 +1747,7 @@ static int generic_remap_check_len(struct inode *inode_in,
*/
int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
struct file *file_out, loff_t pos_out,
u64 *len, bool is_dedupe)
u64 *len, unsigned int remap_flags)
{
struct inode *inode_in = file_inode(file_in);
struct inode *inode_out = file_inode(file_out);
Expand All @@ -1771,7 +1771,7 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
if (*len == 0) {
loff_t isize = i_size_read(inode_in);

if (is_dedupe || pos_in == isize)
if ((remap_flags & REMAP_FILE_DEDUP) || pos_in == isize)
return 0;
if (pos_in > isize)
return -EINVAL;
Expand All @@ -1782,7 +1782,7 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,

/* Check that we don't violate system file offset limits. */
ret = generic_remap_checks(file_in, pos_in, file_out, pos_out, len,
is_dedupe);
(remap_flags & REMAP_FILE_DEDUP));
if (ret)
return ret;

Expand All @@ -1804,7 +1804,7 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
/*
* Check that the extents are the same.
*/
if (is_dedupe) {
if (remap_flags & REMAP_FILE_DEDUP) {
bool is_same = false;

ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
Expand All @@ -1816,7 +1816,7 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
}

ret = generic_remap_check_len(inode_in, inode_out, pos_out, len,
is_dedupe);
remap_flags);
if (ret)
return ret;

Expand Down
2 changes: 1 addition & 1 deletion fs/xfs/xfs_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,7 @@ xfs_file_remap_range(
return -EINVAL;

return xfs_reflink_remap_range(file_in, pos_in, file_out, pos_out,
len, remap_flags & REMAP_FILE_DEDUP);
len, remap_flags);
}

STATIC int
Expand Down
21 changes: 11 additions & 10 deletions fs/xfs/xfs_reflink.c
Original file line number Diff line number Diff line change
Expand Up @@ -921,13 +921,14 @@ xfs_reflink_update_dest(
struct xfs_inode *dest,
xfs_off_t newlen,
xfs_extlen_t cowextsize,
bool is_dedupe)
unsigned int remap_flags)
{
struct xfs_mount *mp = dest->i_mount;
struct xfs_trans *tp;
int error;

if (is_dedupe && newlen <= i_size_read(VFS_I(dest)) && cowextsize == 0)
if ((remap_flags & REMAP_FILE_DEDUP) &&
newlen <= i_size_read(VFS_I(dest)) && cowextsize == 0)
return 0;

error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
Expand All @@ -948,7 +949,7 @@ xfs_reflink_update_dest(
dest->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
}

if (!is_dedupe) {
if (!(remap_flags & REMAP_FILE_DEDUP)) {
xfs_trans_ichgtime(tp, dest,
XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
}
Expand Down Expand Up @@ -1296,7 +1297,7 @@ xfs_reflink_remap_prep(
struct file *file_out,
loff_t pos_out,
u64 *len,
bool is_dedupe)
unsigned int remap_flags)
{
struct inode *inode_in = file_inode(file_in);
struct xfs_inode *src = XFS_I(inode_in);
Expand Down Expand Up @@ -1327,7 +1328,7 @@ xfs_reflink_remap_prep(
goto out_unlock;

ret = generic_remap_file_range_prep(file_in, pos_in, file_out, pos_out,
len, is_dedupe);
len, remap_flags);
if (ret <= 0)
goto out_unlock;

Expand All @@ -1336,7 +1337,7 @@ xfs_reflink_remap_prep(
* from the source file so we don't try to dedupe the partial
* EOF block.
*/
if (is_dedupe) {
if (remap_flags & REMAP_FILE_DEDUP) {
*len &= ~blkmask;
} else if (*len & blkmask) {
/*
Expand Down Expand Up @@ -1372,7 +1373,7 @@ xfs_reflink_remap_prep(
PAGE_ALIGN(pos_out + *len) - 1);

/* If we're altering the file contents... */
if (!is_dedupe) {
if (!(remap_flags & REMAP_FILE_DEDUP)) {
/*
* ...update the timestamps (which will grab the ilock again
* from xfs_fs_dirty_inode, so we have to call it before we
Expand Down Expand Up @@ -1410,7 +1411,7 @@ xfs_reflink_remap_range(
struct file *file_out,
loff_t pos_out,
u64 len,
bool is_dedupe)
unsigned int remap_flags)
{
struct inode *inode_in = file_inode(file_in);
struct xfs_inode *src = XFS_I(inode_in);
Expand All @@ -1430,7 +1431,7 @@ xfs_reflink_remap_range(

/* Prepare and then clone file data. */
ret = xfs_reflink_remap_prep(file_in, pos_in, file_out, pos_out,
&len, is_dedupe);
&len, remap_flags);
if (ret <= 0)
return ret;

Expand All @@ -1457,7 +1458,7 @@ xfs_reflink_remap_range(
cowextsize = src->i_d.di_cowextsize;

ret = xfs_reflink_update_dest(dest, pos_out + len, cowextsize,
is_dedupe);
remap_flags);

out_unlock:
xfs_reflink_remap_unlock(file_in, file_out);
Expand Down
3 changes: 2 additions & 1 deletion fs/xfs/xfs_reflink.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ extern int xfs_reflink_end_cow(struct xfs_inode *ip, xfs_off_t offset,
xfs_off_t count);
extern int xfs_reflink_recover_cow(struct xfs_mount *mp);
extern int xfs_reflink_remap_range(struct file *file_in, loff_t pos_in,
struct file *file_out, loff_t pos_out, u64 len, bool is_dedupe);
struct file *file_out, loff_t pos_out, u64 len,
unsigned int remap_flags);
extern int xfs_reflink_inode_has_shared_extents(struct xfs_trans *tp,
struct xfs_inode *ip, bool *has_shared);
extern int xfs_reflink_clear_inode_flag(struct xfs_inode *ip,
Expand Down
2 changes: 1 addition & 1 deletion include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1844,7 +1844,7 @@ extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
loff_t, size_t, unsigned int);
extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
struct file *file_out, loff_t pos_out,
u64 *count, bool is_dedupe);
u64 *count, unsigned int remap_flags);
extern int do_clone_file_range(struct file *file_in, loff_t pos_in,
struct file *file_out, loff_t pos_out, u64 len);
extern int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
Expand Down

0 comments on commit a91ae49

Please sign in to comment.