2 * Copyright (C) 2016 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it would be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
20 #ifndef __XFS_RMAP_H__
21 #define __XFS_RMAP_H__
25 struct xfs_owner_info
*oi
,
34 xfs_rmap_ino_bmbt_owner(
35 struct xfs_owner_info
*oi
,
41 oi
->oi_flags
= XFS_OWNER_INFO_BMBT_BLOCK
;
42 if (whichfork
== XFS_ATTR_FORK
)
43 oi
->oi_flags
|= XFS_OWNER_INFO_ATTR_FORK
;
48 struct xfs_owner_info
*oi
,
54 oi
->oi_offset
= offset
;
56 if (whichfork
== XFS_ATTR_FORK
)
57 oi
->oi_flags
|= XFS_OWNER_INFO_ATTR_FORK
;
61 xfs_rmap_skip_owner_update(
62 struct xfs_owner_info
*oi
)
64 oi
->oi_owner
= XFS_RMAP_OWN_UNKNOWN
;
67 /* Reverse mapping functions. */
72 xfs_rmap_irec_offset_pack(
73 const struct xfs_rmap_irec
*irec
)
77 x
= XFS_RMAP_OFF(irec
->rm_offset
);
78 if (irec
->rm_flags
& XFS_RMAP_ATTR_FORK
)
79 x
|= XFS_RMAP_OFF_ATTR_FORK
;
80 if (irec
->rm_flags
& XFS_RMAP_BMBT_BLOCK
)
81 x
|= XFS_RMAP_OFF_BMBT_BLOCK
;
82 if (irec
->rm_flags
& XFS_RMAP_UNWRITTEN
)
83 x
|= XFS_RMAP_OFF_UNWRITTEN
;
88 xfs_rmap_irec_offset_unpack(
90 struct xfs_rmap_irec
*irec
)
92 if (offset
& ~(XFS_RMAP_OFF_MASK
| XFS_RMAP_OFF_FLAGS
))
94 irec
->rm_offset
= XFS_RMAP_OFF(offset
);
95 if (offset
& XFS_RMAP_OFF_ATTR_FORK
)
96 irec
->rm_flags
|= XFS_RMAP_ATTR_FORK
;
97 if (offset
& XFS_RMAP_OFF_BMBT_BLOCK
)
98 irec
->rm_flags
|= XFS_RMAP_BMBT_BLOCK
;
99 if (offset
& XFS_RMAP_OFF_UNWRITTEN
)
100 irec
->rm_flags
|= XFS_RMAP_UNWRITTEN
;
105 xfs_owner_info_unpack(
106 struct xfs_owner_info
*oinfo
,
113 *owner
= oinfo
->oi_owner
;
114 *offset
= oinfo
->oi_offset
;
115 if (oinfo
->oi_flags
& XFS_OWNER_INFO_ATTR_FORK
)
116 r
|= XFS_RMAP_ATTR_FORK
;
117 if (oinfo
->oi_flags
& XFS_OWNER_INFO_BMBT_BLOCK
)
118 r
|= XFS_RMAP_BMBT_BLOCK
;
124 struct xfs_owner_info
*oinfo
,
129 oinfo
->oi_owner
= owner
;
130 oinfo
->oi_offset
= XFS_RMAP_OFF(offset
);
132 if (flags
& XFS_RMAP_ATTR_FORK
)
133 oinfo
->oi_flags
|= XFS_OWNER_INFO_ATTR_FORK
;
134 if (flags
& XFS_RMAP_BMBT_BLOCK
)
135 oinfo
->oi_flags
|= XFS_OWNER_INFO_BMBT_BLOCK
;
138 int xfs_rmap_alloc(struct xfs_trans
*tp
, struct xfs_buf
*agbp
,
139 xfs_agnumber_t agno
, xfs_agblock_t bno
, xfs_extlen_t len
,
140 struct xfs_owner_info
*oinfo
);
141 int xfs_rmap_free(struct xfs_trans
*tp
, struct xfs_buf
*agbp
,
142 xfs_agnumber_t agno
, xfs_agblock_t bno
, xfs_extlen_t len
,
143 struct xfs_owner_info
*oinfo
);
145 int xfs_rmap_lookup_le(struct xfs_btree_cur
*cur
, xfs_agblock_t bno
,
146 xfs_extlen_t len
, uint64_t owner
, uint64_t offset
,
147 unsigned int flags
, int *stat
);
148 int xfs_rmap_lookup_eq(struct xfs_btree_cur
*cur
, xfs_agblock_t bno
,
149 xfs_extlen_t len
, uint64_t owner
, uint64_t offset
,
150 unsigned int flags
, int *stat
);
151 int xfs_rmap_insert(struct xfs_btree_cur
*rcur
, xfs_agblock_t agbno
,
152 xfs_extlen_t len
, uint64_t owner
, uint64_t offset
,
154 int xfs_rmap_get_rec(struct xfs_btree_cur
*cur
, struct xfs_rmap_irec
*irec
,
157 typedef int (*xfs_rmap_query_range_fn
)(
158 struct xfs_btree_cur
*cur
,
159 struct xfs_rmap_irec
*rec
,
162 int xfs_rmap_query_range(struct xfs_btree_cur
*cur
,
163 struct xfs_rmap_irec
*low_rec
, struct xfs_rmap_irec
*high_rec
,
164 xfs_rmap_query_range_fn fn
, void *priv
);
166 enum xfs_rmap_intent_type
{
170 XFS_RMAP_UNMAP_SHARED
,
172 XFS_RMAP_CONVERT_SHARED
,
177 struct xfs_rmap_intent
{
178 struct list_head ri_list
;
179 enum xfs_rmap_intent_type ri_type
;
182 struct xfs_bmbt_irec ri_bmap
;
185 /* functions for updating the rmapbt based on bmbt map/unmap operations */
186 int xfs_rmap_map_extent(struct xfs_mount
*mp
, struct xfs_defer_ops
*dfops
,
187 struct xfs_inode
*ip
, int whichfork
,
188 struct xfs_bmbt_irec
*imap
);
189 int xfs_rmap_unmap_extent(struct xfs_mount
*mp
, struct xfs_defer_ops
*dfops
,
190 struct xfs_inode
*ip
, int whichfork
,
191 struct xfs_bmbt_irec
*imap
);
192 int xfs_rmap_convert_extent(struct xfs_mount
*mp
, struct xfs_defer_ops
*dfops
,
193 struct xfs_inode
*ip
, int whichfork
,
194 struct xfs_bmbt_irec
*imap
);
195 int xfs_rmap_alloc_extent(struct xfs_mount
*mp
, struct xfs_defer_ops
*dfops
,
196 xfs_agnumber_t agno
, xfs_agblock_t bno
, xfs_extlen_t len
,
198 int xfs_rmap_free_extent(struct xfs_mount
*mp
, struct xfs_defer_ops
*dfops
,
199 xfs_agnumber_t agno
, xfs_agblock_t bno
, xfs_extlen_t len
,
202 void xfs_rmap_finish_one_cleanup(struct xfs_trans
*tp
,
203 struct xfs_btree_cur
*rcur
, int error
);
204 int xfs_rmap_finish_one(struct xfs_trans
*tp
, enum xfs_rmap_intent_type type
,
205 __uint64_t owner
, int whichfork
, xfs_fileoff_t startoff
,
206 xfs_fsblock_t startblock
, xfs_filblks_t blockcount
,
207 xfs_exntst_t state
, struct xfs_btree_cur
**pcur
);
209 int xfs_rmap_find_left_neighbor(struct xfs_btree_cur
*cur
, xfs_agblock_t bno
,
210 uint64_t owner
, uint64_t offset
, unsigned int flags
,
211 struct xfs_rmap_irec
*irec
, int *stat
);
212 int xfs_rmap_lookup_le_range(struct xfs_btree_cur
*cur
, xfs_agblock_t bno
,
213 uint64_t owner
, uint64_t offset
, unsigned int flags
,
214 struct xfs_rmap_irec
*irec
, int *stat
);
216 #endif /* __XFS_RMAP_H__ */