1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2016 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 #ifndef __XFS_REFLINK_H
7 #define __XFS_REFLINK_H 1
10 * Check whether it is safe to free COW fork blocks from an inode. It is unsafe
11 * to do so when an inode has dirty cache or I/O in-flight, even if no shared
12 * extents exist in the data fork, because outstanding I/O may target blocks
13 * that were speculatively allocated to the COW fork.
16 xfs_can_free_cowblocks(struct xfs_inode
*ip
)
18 struct inode
*inode
= VFS_I(ip
);
20 if ((inode
->i_state
& I_DIRTY_PAGES
) ||
21 mapping_tagged(inode
->i_mapping
, PAGECACHE_TAG_DIRTY
) ||
22 mapping_tagged(inode
->i_mapping
, PAGECACHE_TAG_WRITEBACK
) ||
23 atomic_read(&inode
->i_dio_count
))
28 extern int xfs_reflink_trim_around_shared(struct xfs_inode
*ip
,
29 struct xfs_bmbt_irec
*irec
, bool *shared
);
30 int xfs_bmap_trim_cow(struct xfs_inode
*ip
, struct xfs_bmbt_irec
*imap
,
33 int xfs_reflink_allocate_cow(struct xfs_inode
*ip
, struct xfs_bmbt_irec
*imap
,
34 struct xfs_bmbt_irec
*cmap
, bool *shared
, uint
*lockmode
,
36 extern int xfs_reflink_convert_cow(struct xfs_inode
*ip
, xfs_off_t offset
,
39 extern int xfs_reflink_cancel_cow_blocks(struct xfs_inode
*ip
,
40 struct xfs_trans
**tpp
, xfs_fileoff_t offset_fsb
,
41 xfs_fileoff_t end_fsb
, bool cancel_real
);
42 extern int xfs_reflink_cancel_cow_range(struct xfs_inode
*ip
, xfs_off_t offset
,
43 xfs_off_t count
, bool cancel_real
);
44 extern int xfs_reflink_end_cow(struct xfs_inode
*ip
, xfs_off_t offset
,
46 extern int xfs_reflink_recover_cow(struct xfs_mount
*mp
);
47 extern loff_t
xfs_reflink_remap_range(struct file
*file_in
, loff_t pos_in
,
48 struct file
*file_out
, loff_t pos_out
, loff_t len
,
49 unsigned int remap_flags
);
50 extern int xfs_reflink_inode_has_shared_extents(struct xfs_trans
*tp
,
51 struct xfs_inode
*ip
, bool *has_shared
);
52 extern int xfs_reflink_clear_inode_flag(struct xfs_inode
*ip
,
53 struct xfs_trans
**tpp
);
54 extern int xfs_reflink_unshare(struct xfs_inode
*ip
, xfs_off_t offset
,
56 extern int xfs_reflink_remap_prep(struct file
*file_in
, loff_t pos_in
,
57 struct file
*file_out
, loff_t pos_out
, loff_t
*len
,
58 unsigned int remap_flags
);
59 extern int xfs_reflink_remap_blocks(struct xfs_inode
*src
, loff_t pos_in
,
60 struct xfs_inode
*dest
, loff_t pos_out
, loff_t remap_len
,
62 extern int xfs_reflink_update_dest(struct xfs_inode
*dest
, xfs_off_t newlen
,
63 xfs_extlen_t cowextsize
, unsigned int remap_flags
);
65 #endif /* __XFS_REFLINK_H */