xfs: kill struct xfs_dir2_data
authorChristoph Hellwig <hch@lst.de>
Fri, 8 Jul 2011 12:35:42 +0000 (14:35 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 8 Jul 2011 12:35:42 +0000 (14:35 +0200)
Remove the confusing xfs_dir2_data structure.  It is supposed to describe
an XFS dir2 data btree block, but due to the variable sized nature of
almost all elements in it it can't actuall do anything close to that
job.  In addition to accessing the fixed offset header structure it was
only used to get a pointer to the first dir or unused entry after it,
which can be trivially replaced by pointer arithmetics on the header
pointer.  For most users that is actually more natural anyway, as they
don't use a typed pointer but rather a character pointer for further
arithmetics.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Alex Elder <aelder@sgi.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/xfs_dir2_data.c
fs/xfs/xfs_dir2_data.h
fs/xfs/xfs_dir2_leaf.c

index 2bbc21696944d82200969fbfdbb8e1d58401a4a6..8e47ac3a3b9ddc26dcc92f1a0c2dcceebff44060 100644 (file)
@@ -53,7 +53,6 @@ xfs_dir2_data_check(
        xfs_dir2_data_free_t    *bf;            /* bestfree table */
        xfs_dir2_block_tail_t   *btp=NULL;      /* block tail */
        int                     count;          /* count of entries found */
-       xfs_dir2_data_t         *d;             /* data block pointer */
        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
        xfs_dir2_data_entry_t   *dep;           /* data entry */
        xfs_dir2_data_free_t    *dfp;           /* bestfree entry */
@@ -70,10 +69,9 @@ xfs_dir2_data_check(
        struct xfs_name         name;
 
        mp = dp->i_mount;
-       d = bp->data;
-       hdr = &d->hdr;
+       hdr = bp->data;
        bf = hdr->bestfree;
-       p = (char *)d->u;
+       p = (char *)(hdr + 1);
 
        if (be32_to_cpu(hdr->magic) == XFS_DIR2_BLOCK_MAGIC) {
                btp = xfs_dir2_block_tail_p(mp, hdr);
@@ -336,7 +334,6 @@ xfs_dir2_data_freescan(
        xfs_dir2_data_hdr_t     *hdr,           /* data block header */
        int                     *loghead)       /* out: log data header */
 {
-       xfs_dir2_data_t         *d = (xfs_dir2_data_t *)hdr;
        xfs_dir2_block_tail_t   *btp;           /* block tail */
        xfs_dir2_data_entry_t   *dep;           /* active data entry */
        xfs_dir2_data_unused_t  *dup;           /* unused data entry */
@@ -355,7 +352,7 @@ xfs_dir2_data_freescan(
        /*
         * Set up pointers.
         */
-       p = (char *)d->u;
+       p = (char *)(hdr + 1);
        if (be32_to_cpu(hdr->magic) == XFS_DIR2_BLOCK_MAGIC) {
                btp = xfs_dir2_block_tail_p(mp, hdr);
                endp = (char *)xfs_dir2_block_leaf_p(btp);
@@ -398,7 +395,6 @@ xfs_dir2_data_init(
        xfs_dabuf_t             **bpp)          /* output block buffer */
 {
        xfs_dabuf_t             *bp;            /* block buffer */
-       xfs_dir2_data_t         *d;             /* pointer to block */
        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
        xfs_inode_t             *dp;            /* incore directory inode */
        xfs_dir2_data_unused_t  *dup;           /* unused entry pointer */
@@ -424,8 +420,7 @@ xfs_dir2_data_init(
        /*
         * Initialize the header.
         */
-       d = bp->data;
-       hdr = &d->hdr;
+       hdr = bp->data;
        hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC);
        hdr->bestfree[0].offset = cpu_to_be16(sizeof(*hdr));
        for (i = 1; i < XFS_DIR2_DATA_FD_COUNT; i++) {
@@ -436,7 +431,7 @@ xfs_dir2_data_init(
        /*
         * Set up an unused entry for the block's body.
         */
-       dup = &d->u[0].unused;
+       dup = (xfs_dir2_data_unused_t *)(hdr + 1);
        dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG);
 
        t = mp->m_dirblksize - (uint)sizeof(*hdr);
index aa6bf91c4228f6121fedc4cf2e4b9948db2ad045..ca02cc71e234511b10f6844f582c2a41a37351d7 100644 (file)
 
 /*
  * Directory format 2, data block structures.
+ *
+ * A pure data block looks like the following drawing on disk:
+ *
+ *    +-------------------------------------------------+
+ *    | xfs_dir2_data_hdr_t                             |
+ *    +-------------------------------------------------+
+ *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
+ *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
+ *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
+ *    | ...                                             |
+ *    +-------------------------------------------------+
+ *    | unused space                                    |
+ *    +-------------------------------------------------+
+ *
+ * As all the entries are variable size structures the accessors in this
+ * file should be used to iterate over them.
  */
 
 struct xfs_dabuf;
@@ -103,23 +119,6 @@ typedef struct xfs_dir2_data_unused {
        __be16                  tag;            /* starting offset of us */
 } xfs_dir2_data_unused_t;
 
-typedef union {
-       xfs_dir2_data_entry_t   entry;
-       xfs_dir2_data_unused_t  unused;
-} xfs_dir2_data_union_t;
-
-/*
- * Generic data block structure, for xfs_db.
- */
-typedef struct xfs_dir2_data {
-       xfs_dir2_data_hdr_t     hdr;            /* magic XFS_DIR2_DATA_MAGIC */
-       xfs_dir2_data_union_t   u[1];
-} xfs_dir2_data_t;
-
-/*
- * Macros.
- */
-
 /*
  * Size of a data entry.
  */
index d7b4d4494f2da6f3b0e4a2fed2449cf9e7f5c177..067a6abdeabe391e558d26b52d013bef298ba283 100644 (file)
@@ -785,7 +785,6 @@ xfs_dir2_leaf_getdents(
        int                     byteoff;        /* offset in current block */
        xfs_dir2_db_t           curdb;          /* db for current block */
        xfs_dir2_off_t          curoff;         /* current overall offset */
-       xfs_dir2_data_t         *data;          /* data block structure */
        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
        xfs_dir2_data_entry_t   *dep;           /* data entry */
        xfs_dir2_data_unused_t  *dup;           /* unused entry */
@@ -1044,13 +1043,12 @@ xfs_dir2_leaf_getdents(
                        else if (curoff > newoff)
                                ASSERT(xfs_dir2_byte_to_db(mp, curoff) ==
                                       curdb);
-                       data = bp->data;
-                       hdr = &data->hdr;
+                       hdr = bp->data;
                        xfs_dir2_data_check(dp, bp);
                        /*
                         * Find our position in the block.
                         */
-                       ptr = (char *)&data->u;
+                       ptr = (char *)(hdr + 1);
                        byteoff = xfs_dir2_byte_to_off(mp, curoff);
                        /*
                         * Skip past the header.