linux/fs/xfs/libxfs/xfs_rmap.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2016 Oracle.  All Rights Reserved.
   4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
   5 */
   6#ifndef __XFS_RMAP_H__
   7#define __XFS_RMAP_H__
   8
   9static inline void
  10xfs_rmap_ino_bmbt_owner(
  11        struct xfs_owner_info   *oi,
  12        xfs_ino_t               ino,
  13        int                     whichfork)
  14{
  15        oi->oi_owner = ino;
  16        oi->oi_offset = 0;
  17        oi->oi_flags = XFS_OWNER_INFO_BMBT_BLOCK;
  18        if (whichfork == XFS_ATTR_FORK)
  19                oi->oi_flags |= XFS_OWNER_INFO_ATTR_FORK;
  20}
  21
  22static inline void
  23xfs_rmap_ino_owner(
  24        struct xfs_owner_info   *oi,
  25        xfs_ino_t               ino,
  26        int                     whichfork,
  27        xfs_fileoff_t           offset)
  28{
  29        oi->oi_owner = ino;
  30        oi->oi_offset = offset;
  31        oi->oi_flags = 0;
  32        if (whichfork == XFS_ATTR_FORK)
  33                oi->oi_flags |= XFS_OWNER_INFO_ATTR_FORK;
  34}
  35
  36static inline bool
  37xfs_rmap_should_skip_owner_update(
  38        const struct xfs_owner_info     *oi)
  39{
  40        return oi->oi_owner == XFS_RMAP_OWN_NULL;
  41}
  42
  43/* Reverse mapping functions. */
  44
  45struct xfs_buf;
  46
  47static inline __u64
  48xfs_rmap_irec_offset_pack(
  49        const struct xfs_rmap_irec      *irec)
  50{
  51        __u64                   x;
  52
  53        x = XFS_RMAP_OFF(irec->rm_offset);
  54        if (irec->rm_flags & XFS_RMAP_ATTR_FORK)
  55                x |= XFS_RMAP_OFF_ATTR_FORK;
  56        if (irec->rm_flags & XFS_RMAP_BMBT_BLOCK)
  57                x |= XFS_RMAP_OFF_BMBT_BLOCK;
  58        if (irec->rm_flags & XFS_RMAP_UNWRITTEN)
  59                x |= XFS_RMAP_OFF_UNWRITTEN;
  60        return x;
  61}
  62
  63static inline int
  64xfs_rmap_irec_offset_unpack(
  65        __u64                   offset,
  66        struct xfs_rmap_irec    *irec)
  67{
  68        if (offset & ~(XFS_RMAP_OFF_MASK | XFS_RMAP_OFF_FLAGS))
  69                return -EFSCORRUPTED;
  70        irec->rm_offset = XFS_RMAP_OFF(offset);
  71        irec->rm_flags = 0;
  72        if (offset & XFS_RMAP_OFF_ATTR_FORK)
  73                irec->rm_flags |= XFS_RMAP_ATTR_FORK;
  74        if (offset & XFS_RMAP_OFF_BMBT_BLOCK)
  75                irec->rm_flags |= XFS_RMAP_BMBT_BLOCK;
  76        if (offset & XFS_RMAP_OFF_UNWRITTEN)
  77                irec->rm_flags |= XFS_RMAP_UNWRITTEN;
  78        return 0;
  79}
  80
  81static inline void
  82xfs_owner_info_unpack(
  83        const struct xfs_owner_info     *oinfo,
  84        uint64_t                        *owner,
  85        uint64_t                        *offset,
  86        unsigned int                    *flags)
  87{
  88        unsigned int                    r = 0;
  89
  90        *owner = oinfo->oi_owner;
  91        *offset = oinfo->oi_offset;
  92        if (oinfo->oi_flags & XFS_OWNER_INFO_ATTR_FORK)
  93                r |= XFS_RMAP_ATTR_FORK;
  94        if (oinfo->oi_flags & XFS_OWNER_INFO_BMBT_BLOCK)
  95                r |= XFS_RMAP_BMBT_BLOCK;
  96        *flags = r;
  97}
  98
  99static inline void
 100xfs_owner_info_pack(
 101        struct xfs_owner_info   *oinfo,
 102        uint64_t                owner,
 103        uint64_t                offset,
 104        unsigned int            flags)
 105{
 106        oinfo->oi_owner = owner;
 107        oinfo->oi_offset = XFS_RMAP_OFF(offset);
 108        oinfo->oi_flags = 0;
 109        if (flags & XFS_RMAP_ATTR_FORK)
 110                oinfo->oi_flags |= XFS_OWNER_INFO_ATTR_FORK;
 111        if (flags & XFS_RMAP_BMBT_BLOCK)
 112                oinfo->oi_flags |= XFS_OWNER_INFO_BMBT_BLOCK;
 113}
 114
 115int xfs_rmap_alloc(struct xfs_trans *tp, struct xfs_buf *agbp,
 116                   xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len,
 117                   const struct xfs_owner_info *oinfo);
 118int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp,
 119                  xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len,
 120                  const struct xfs_owner_info *oinfo);
 121
 122int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 123                xfs_extlen_t len, uint64_t owner, uint64_t offset,
 124                unsigned int flags, int *stat);
 125int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 126                xfs_extlen_t len, uint64_t owner, uint64_t offset,
 127                unsigned int flags, int *stat);
 128int xfs_rmap_insert(struct xfs_btree_cur *rcur, xfs_agblock_t agbno,
 129                xfs_extlen_t len, uint64_t owner, uint64_t offset,
 130                unsigned int flags);
 131int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec,
 132                int *stat);
 133
 134typedef int (*xfs_rmap_query_range_fn)(
 135        struct xfs_btree_cur    *cur,
 136        struct xfs_rmap_irec    *rec,
 137        void                    *priv);
 138
 139int xfs_rmap_query_range(struct xfs_btree_cur *cur,
 140                struct xfs_rmap_irec *low_rec, struct xfs_rmap_irec *high_rec,
 141                xfs_rmap_query_range_fn fn, void *priv);
 142int xfs_rmap_query_all(struct xfs_btree_cur *cur, xfs_rmap_query_range_fn fn,
 143                void *priv);
 144
 145enum xfs_rmap_intent_type {
 146        XFS_RMAP_MAP,
 147        XFS_RMAP_MAP_SHARED,
 148        XFS_RMAP_UNMAP,
 149        XFS_RMAP_UNMAP_SHARED,
 150        XFS_RMAP_CONVERT,
 151        XFS_RMAP_CONVERT_SHARED,
 152        XFS_RMAP_ALLOC,
 153        XFS_RMAP_FREE,
 154};
 155
 156struct xfs_rmap_intent {
 157        struct list_head                        ri_list;
 158        enum xfs_rmap_intent_type               ri_type;
 159        uint64_t                                ri_owner;
 160        int                                     ri_whichfork;
 161        struct xfs_bmbt_irec                    ri_bmap;
 162};
 163
 164/* functions for updating the rmapbt based on bmbt map/unmap operations */
 165void xfs_rmap_map_extent(struct xfs_trans *tp, struct xfs_inode *ip,
 166                int whichfork, struct xfs_bmbt_irec *imap);
 167void xfs_rmap_unmap_extent(struct xfs_trans *tp, struct xfs_inode *ip,
 168                int whichfork, struct xfs_bmbt_irec *imap);
 169void xfs_rmap_convert_extent(struct xfs_mount *mp, struct xfs_trans *tp,
 170                struct xfs_inode *ip, int whichfork,
 171                struct xfs_bmbt_irec *imap);
 172void xfs_rmap_alloc_extent(struct xfs_trans *tp, xfs_agnumber_t agno,
 173                xfs_agblock_t bno, xfs_extlen_t len, uint64_t owner);
 174void xfs_rmap_free_extent(struct xfs_trans *tp, xfs_agnumber_t agno,
 175                xfs_agblock_t bno, xfs_extlen_t len, uint64_t owner);
 176
 177void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp,
 178                struct xfs_btree_cur *rcur, int error);
 179int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type,
 180                uint64_t owner, int whichfork, xfs_fileoff_t startoff,
 181                xfs_fsblock_t startblock, xfs_filblks_t blockcount,
 182                xfs_exntst_t state, struct xfs_btree_cur **pcur);
 183
 184int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 185                uint64_t owner, uint64_t offset, unsigned int flags,
 186                struct xfs_rmap_irec *irec, int *stat);
 187int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 188                uint64_t owner, uint64_t offset, unsigned int flags,
 189                struct xfs_rmap_irec *irec, int *stat);
 190int xfs_rmap_compare(const struct xfs_rmap_irec *a,
 191                const struct xfs_rmap_irec *b);
 192union xfs_btree_rec;
 193int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec,
 194                struct xfs_rmap_irec *irec);
 195int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 196                xfs_extlen_t len, bool *exists);
 197int xfs_rmap_record_exists(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 198                xfs_extlen_t len, const struct xfs_owner_info *oinfo,
 199                bool *has_rmap);
 200int xfs_rmap_has_other_keys(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 201                xfs_extlen_t len, const struct xfs_owner_info *oinfo,
 202                bool *has_rmap);
 203int xfs_rmap_map_raw(struct xfs_btree_cur *cur, struct xfs_rmap_irec *rmap);
 204
 205extern const struct xfs_owner_info XFS_RMAP_OINFO_SKIP_UPDATE;
 206extern const struct xfs_owner_info XFS_RMAP_OINFO_ANY_OWNER;
 207extern const struct xfs_owner_info XFS_RMAP_OINFO_FS;
 208extern const struct xfs_owner_info XFS_RMAP_OINFO_LOG;
 209extern const struct xfs_owner_info XFS_RMAP_OINFO_AG;
 210extern const struct xfs_owner_info XFS_RMAP_OINFO_INOBT;
 211extern const struct xfs_owner_info XFS_RMAP_OINFO_INODES;
 212extern const struct xfs_owner_info XFS_RMAP_OINFO_REFC;
 213extern const struct xfs_owner_info XFS_RMAP_OINFO_COW;
 214
 215#endif  /* __XFS_RMAP_H__ */
 216