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
9 static inline bool xfs_is_always_cow_inode(struct xfs_inode
*ip
)
11 return ip
->i_mount
->m_always_cow
&&
12 xfs_sb_version_hasreflink(&ip
->i_mount
->m_sb
);
15 static inline bool xfs_is_cow_inode(struct xfs_inode
*ip
)
17 return xfs_is_reflink_inode(ip
) || xfs_is_always_cow_inode(ip
);
20 extern int xfs_reflink_find_shared(struct xfs_mount
*mp
, struct xfs_trans
*tp
,
21 xfs_agnumber_t agno
, xfs_agblock_t agbno
, xfs_extlen_t aglen
,
22 xfs_agblock_t
*fbno
, xfs_extlen_t
*flen
, bool find_maximal
);
23 extern int xfs_reflink_trim_around_shared(struct xfs_inode
*ip
,
24 struct xfs_bmbt_irec
*irec
, bool *shared
);
25 int xfs_bmap_trim_cow(struct xfs_inode
*ip
, struct xfs_bmbt_irec
*imap
,
28 int xfs_reflink_allocate_cow(struct xfs_inode
*ip
, struct xfs_bmbt_irec
*imap
,
29 struct xfs_bmbt_irec
*cmap
, bool *shared
, uint
*lockmode
,
31 extern int xfs_reflink_convert_cow(struct xfs_inode
*ip
, xfs_off_t offset
,
34 extern int xfs_reflink_cancel_cow_blocks(struct xfs_inode
*ip
,
35 struct xfs_trans
**tpp
, xfs_fileoff_t offset_fsb
,
36 xfs_fileoff_t end_fsb
, bool cancel_real
);
37 extern int xfs_reflink_cancel_cow_range(struct xfs_inode
*ip
, xfs_off_t offset
,
38 xfs_off_t count
, bool cancel_real
);
39 extern int xfs_reflink_end_cow(struct xfs_inode
*ip
, xfs_off_t offset
,
41 extern int xfs_reflink_recover_cow(struct xfs_mount
*mp
);
42 extern loff_t
xfs_reflink_remap_range(struct file
*file_in
, loff_t pos_in
,
43 struct file
*file_out
, loff_t pos_out
, loff_t len
,
44 unsigned int remap_flags
);
45 extern int xfs_reflink_inode_has_shared_extents(struct xfs_trans
*tp
,
46 struct xfs_inode
*ip
, bool *has_shared
);
47 extern int xfs_reflink_clear_inode_flag(struct xfs_inode
*ip
,
48 struct xfs_trans
**tpp
);
49 extern int xfs_reflink_unshare(struct xfs_inode
*ip
, xfs_off_t offset
,
51 extern int xfs_reflink_remap_prep(struct file
*file_in
, loff_t pos_in
,
52 struct file
*file_out
, loff_t pos_out
, loff_t
*len
,
53 unsigned int remap_flags
);
54 extern int xfs_reflink_remap_blocks(struct xfs_inode
*src
, loff_t pos_in
,
55 struct xfs_inode
*dest
, loff_t pos_out
, loff_t remap_len
,
57 extern int xfs_reflink_update_dest(struct xfs_inode
*dest
, xfs_off_t newlen
,
58 xfs_extlen_t cowextsize
, unsigned int remap_flags
);
59 extern void xfs_reflink_remap_unlock(struct file
*file_in
,
60 struct file
*file_out
);
62 #endif /* __XFS_REFLINK_H */