root/fs/xfs/libxfs/xfs_ialloc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. xfs_make_iptr

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (c) 2000,2005 Silicon Graphics, Inc.
   4  * All Rights Reserved.
   5  */
   6 #ifndef __XFS_IALLOC_H__
   7 #define __XFS_IALLOC_H__
   8 
   9 struct xfs_buf;
  10 struct xfs_dinode;
  11 struct xfs_imap;
  12 struct xfs_mount;
  13 struct xfs_trans;
  14 struct xfs_btree_cur;
  15 
  16 /* Move inodes in clusters of this size */
  17 #define XFS_INODE_BIG_CLUSTER_SIZE      8192
  18 
  19 struct xfs_icluster {
  20         bool            deleted;        /* record is deleted */
  21         xfs_ino_t       first_ino;      /* first inode number */
  22         uint64_t        alloc;          /* inode phys. allocation bitmap for
  23                                          * sparse chunks */
  24 };
  25 
  26 /*
  27  * Make an inode pointer out of the buffer/offset.
  28  */
  29 static inline struct xfs_dinode *
  30 xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o)
  31 {
  32         return xfs_buf_offset(b, o << (mp)->m_sb.sb_inodelog);
  33 }
  34 
  35 /*
  36  * Allocate an inode on disk.
  37  * Mode is used to tell whether the new inode will need space, and whether
  38  * it is a directory.
  39  *
  40  * To work within the constraint of one allocation per transaction,
  41  * xfs_dialloc() is designed to be called twice if it has to do an
  42  * allocation to make more free inodes.  If an inode is
  43  * available without an allocation, agbp would be set to the current
  44  * agbp and alloc_done set to false.
  45  * If an allocation needed to be done, agbp would be set to the
  46  * inode header of the allocation group and alloc_done set to true.
  47  * The caller should then commit the current transaction and allocate a new
  48  * transaction.  xfs_dialloc() should then be called again with
  49  * the agbp value returned from the previous call.
  50  *
  51  * Once we successfully pick an inode its number is returned and the
  52  * on-disk data structures are updated.  The inode itself is not read
  53  * in, since doing so would break ordering constraints with xfs_reclaim.
  54  *
  55  * *agbp should be set to NULL on the first call, *alloc_done set to FALSE.
  56  */
  57 int                                     /* error */
  58 xfs_dialloc(
  59         struct xfs_trans *tp,           /* transaction pointer */
  60         xfs_ino_t       parent,         /* parent inode (directory) */
  61         umode_t         mode,           /* mode bits for new inode */
  62         struct xfs_buf  **agbp,         /* buf for a.g. inode header */
  63         xfs_ino_t       *inop);         /* inode number allocated */
  64 
  65 /*
  66  * Free disk inode.  Carefully avoids touching the incore inode, all
  67  * manipulations incore are the caller's responsibility.
  68  * The on-disk inode is not changed by this operation, only the
  69  * btree (free inode mask) is changed.
  70  */
  71 int                                     /* error */
  72 xfs_difree(
  73         struct xfs_trans *tp,           /* transaction pointer */
  74         xfs_ino_t       inode,          /* inode to be freed */
  75         struct xfs_icluster *ifree);    /* cluster info if deleted */
  76 
  77 /*
  78  * Return the location of the inode in imap, for mapping it into a buffer.
  79  */
  80 int
  81 xfs_imap(
  82         struct xfs_mount *mp,           /* file system mount structure */
  83         struct xfs_trans *tp,           /* transaction pointer */
  84         xfs_ino_t       ino,            /* inode to locate */
  85         struct xfs_imap *imap,          /* location map structure */
  86         uint            flags);         /* flags for inode btree lookup */
  87 
  88 /*
  89  * Log specified fields for the ag hdr (inode section)
  90  */
  91 void
  92 xfs_ialloc_log_agi(
  93         struct xfs_trans *tp,           /* transaction pointer */
  94         struct xfs_buf  *bp,            /* allocation group header buffer */
  95         int             fields);        /* bitmask of fields to log */
  96 
  97 /*
  98  * Read in the allocation group header (inode allocation section)
  99  */
 100 int                                     /* error */
 101 xfs_ialloc_read_agi(
 102         struct xfs_mount *mp,           /* file system mount structure */
 103         struct xfs_trans *tp,           /* transaction pointer */
 104         xfs_agnumber_t  agno,           /* allocation group number */
 105         struct xfs_buf  **bpp);         /* allocation group hdr buf */
 106 
 107 /*
 108  * Read in the allocation group header to initialise the per-ag data
 109  * in the mount structure
 110  */
 111 int
 112 xfs_ialloc_pagi_init(
 113         struct xfs_mount *mp,           /* file system mount structure */
 114         struct xfs_trans *tp,           /* transaction pointer */
 115         xfs_agnumber_t  agno);          /* allocation group number */
 116 
 117 /*
 118  * Lookup a record by ino in the btree given by cur.
 119  */
 120 int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino,
 121                 xfs_lookup_t dir, int *stat);
 122 
 123 /*
 124  * Get the data from the pointed-to record.
 125  */
 126 int xfs_inobt_get_rec(struct xfs_btree_cur *cur,
 127                 xfs_inobt_rec_incore_t *rec, int *stat);
 128 
 129 /*
 130  * Inode chunk initialisation routine
 131  */
 132 int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp,
 133                           struct list_head *buffer_list, int icount,
 134                           xfs_agnumber_t agno, xfs_agblock_t agbno,
 135                           xfs_agblock_t length, unsigned int gen);
 136 
 137 int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp,
 138                 xfs_agnumber_t agno, struct xfs_buf **bpp);
 139 
 140 union xfs_btree_rec;
 141 void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec,
 142                 struct xfs_inobt_rec_incore *irec);
 143 int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur,
 144                 xfs_agblock_t bno, xfs_extlen_t len, bool *exists);
 145 int xfs_ialloc_has_inode_record(struct xfs_btree_cur *cur, xfs_agino_t low,
 146                 xfs_agino_t high, bool *exists);
 147 int xfs_ialloc_count_inodes(struct xfs_btree_cur *cur, xfs_agino_t *count,
 148                 xfs_agino_t *freecount);
 149 int xfs_inobt_insert_rec(struct xfs_btree_cur *cur, uint16_t holemask,
 150                 uint8_t count, int32_t freecount, xfs_inofree_t free,
 151                 int *stat);
 152 
 153 int xfs_ialloc_cluster_alignment(struct xfs_mount *mp);
 154 void xfs_ialloc_setup_geometry(struct xfs_mount *mp);
 155 
 156 #endif  /* __XFS_IALLOC_H__ */

/* [<][>][^][v][top][bottom][index][help] */