xfs: convert m_dirblkfsbs to xfs_da_geometry
[deliverable/linux.git] / fs / xfs / xfs_dir2_readdir.c
index aead369e1c30471f5b176661afc4e2ee7beb5afa..8cb5340071e8582b713ccac2e718518c72fc56b9 100644 (file)
@@ -87,8 +87,10 @@ xfs_dir2_sf_getdents(
        xfs_dir2_dataptr_t      dot_offset;
        xfs_dir2_dataptr_t      dotdot_offset;
        xfs_ino_t               ino;
+       struct xfs_da_geometry  *geo;
 
        mp = dp->i_mount;
+       geo = mp->m_dir_geo;
 
        ASSERT(dp->i_df.if_flags & XFS_IFINLINE);
        /*
@@ -109,18 +111,18 @@ xfs_dir2_sf_getdents(
        /*
         * If the block number in the offset is out of range, we're done.
         */
-       if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk)
+       if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk)
                return 0;
 
        /*
         * Precalculate offsets for . and .. as we will always need them.
         *
         * XXX(hch): the second argument is sometimes 0 and sometimes
-        * mp->m_dirdatablk.
+        * geo->datablk
         */
-       dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
+       dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
                                                dp->d_ops->data_dot_offset);
-       dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
+       dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
                                                dp->d_ops->data_dotdot_offset);
 
        /*
@@ -149,7 +151,7 @@ xfs_dir2_sf_getdents(
        for (i = 0; i < sfp->count; i++) {
                __uint8_t filetype;
 
-               off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
+               off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
                                xfs_dir2_sf_get_offset(sfep));
 
                if (ctx->pos > off) {
@@ -166,7 +168,7 @@ xfs_dir2_sf_getdents(
                sfep = dp->d_ops->sf_nextentry(sfp, sfep);
        }
 
-       ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) &
+       ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) &
                        0x7fffffff;
        return 0;
 }
@@ -190,12 +192,14 @@ xfs_dir2_block_getdents(
        char                    *ptr;           /* current data entry */
        int                     wantoff;        /* starting block offset */
        xfs_off_t               cook;
+       struct xfs_da_geometry  *geo;
 
        mp = dp->i_mount;
+       geo = mp->m_dir_geo;
        /*
         * If the block number in the offset is out of range, we're done.
         */
-       if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk)
+       if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk)
                return 0;
 
        error = xfs_dir3_block_read(NULL, dp, &bp);
@@ -206,7 +210,7 @@ xfs_dir2_block_getdents(
         * Extract the byte offset we start at from the seek pointer.
         * We'll skip entries before this.
         */
-       wantoff = xfs_dir2_dataptr_to_off(mp, ctx->pos);
+       wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos);
        hdr = bp->b_addr;
        xfs_dir3_data_check(dp, bp);
        /*
@@ -244,7 +248,7 @@ xfs_dir2_block_getdents(
                if ((char *)dep - (char *)hdr < wantoff)
                        continue;
 
-               cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
+               cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
                                            (char *)dep - (char *)hdr);
 
                ctx->pos = cook & 0x7fffffff;
@@ -264,7 +268,7 @@ xfs_dir2_block_getdents(
         * Reached the end of the block.
         * Set the offset to a non-existent block 1 and return.
         */
-       ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) &
+       ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) &
                        0x7fffffff;
        xfs_trans_brelse(NULL, bp);
        return 0;
@@ -300,6 +304,7 @@ xfs_dir2_leaf_readbuf(
        int                     length;
        int                     i;
        int                     j;
+       struct xfs_da_geometry  *geo = mp->m_dir_geo;
 
        /*
         * If we have a buffer, we need to release it and
@@ -309,12 +314,12 @@ xfs_dir2_leaf_readbuf(
        if (bp) {
                xfs_trans_brelse(NULL, bp);
                bp = NULL;
-               mip->map_blocks -= mp->m_dirblkfsbs;
+               mip->map_blocks -= geo->fsbcount;
                /*
                 * Loop to get rid of the extents for the
                 * directory block.
                 */
-               for (i = mp->m_dirblkfsbs; i > 0; ) {
+               for (i = geo->fsbcount; i > 0; ) {
                        j = min_t(int, map->br_blockcount, i);
                        map->br_blockcount -= j;
                        map->br_startblock += j;
@@ -342,14 +347,14 @@ xfs_dir2_leaf_readbuf(
         * run out of data blocks, get some more mappings.
         */
        if (1 + mip->ra_want > mip->map_blocks &&
-           mip->map_off < xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET)) {
+           mip->map_off < xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET)) {
                /*
                 * Get more bmaps, fill in after the ones
                 * we already have in the table.
                 */
                mip->nmap = mip->map_size - mip->map_valid;
                error = xfs_bmapi_read(dp, mip->map_off,
-                               xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) -
+                               xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET) -
                                                                mip->map_off,
                                &map[mip->map_valid], &mip->nmap, 0);
 
@@ -370,7 +375,7 @@ xfs_dir2_leaf_readbuf(
                        i = mip->map_valid + mip->nmap - 1;
                        mip->map_off = map[i].br_startoff + map[i].br_blockcount;
                } else
-                       mip->map_off = xfs_dir2_byte_to_da(mp,
+                       mip->map_off = xfs_dir2_byte_to_da(geo,
                                                        XFS_DIR2_LEAF_OFFSET);
 
                /*
@@ -396,16 +401,16 @@ xfs_dir2_leaf_readbuf(
         * No valid mappings, so no more data blocks.
         */
        if (!mip->map_valid) {
-               *curoff = xfs_dir2_da_to_byte(mp, mip->map_off);
+               *curoff = xfs_dir2_da_to_byte(geo, mip->map_off);
                goto out;
        }
 
        /*
         * Read the directory block starting at the first mapping.
         */
-       mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff);
+       mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff);
        error = xfs_dir3_data_read(NULL, dp, map->br_startoff,
-                       map->br_blockcount >= mp->m_dirblkfsbs ?
+                       map->br_blockcount >= geo->fsbcount ?
                            XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp);
 
        /*
@@ -419,7 +424,7 @@ xfs_dir2_leaf_readbuf(
         * was previously ra.
         */
        if (mip->ra_current)
-               mip->ra_current -= mp->m_dirblkfsbs;
+               mip->ra_current -= geo->fsbcount;
 
        /*
         * Do we need more readahead?
@@ -427,14 +432,14 @@ xfs_dir2_leaf_readbuf(
        blk_start_plug(&plug);
        for (mip->ra_index = mip->ra_offset = i = 0;
             mip->ra_want > mip->ra_current && i < mip->map_blocks;
-            i += mp->m_dirblkfsbs) {
+            i += geo->fsbcount) {
                ASSERT(mip->ra_index < mip->map_valid);
                /*
                 * Read-ahead a contiguous directory block.
                 */
                if (i > mip->ra_current &&
-                   map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) {
-                       xfs_dir3_data_readahead(NULL, dp,
+                   map[mip->ra_index].br_blockcount >= geo->fsbcount) {
+                       xfs_dir3_data_readahead(dp,
                                map[mip->ra_index].br_startoff + mip->ra_offset,
                                XFS_FSB_TO_DADDR(mp,
                                        map[mip->ra_index].br_startblock +
@@ -447,7 +452,7 @@ xfs_dir2_leaf_readbuf(
                 * use our mapping, but this is a very rare case.
                 */
                else if (i > mip->ra_current) {
-                       xfs_dir3_data_readahead(NULL, dp,
+                       xfs_dir3_data_readahead(dp,
                                        map[mip->ra_index].br_startoff +
                                                        mip->ra_offset, -1);
                        mip->ra_current = i;
@@ -456,15 +461,14 @@ xfs_dir2_leaf_readbuf(
                /*
                 * Advance offset through the mapping table.
                 */
-               for (j = 0; j < mp->m_dirblkfsbs; j++) {
+               for (j = 0; j < geo->fsbcount; j += length ) {
                        /*
                         * The rest of this extent but not more than a dir
                         * block.
                         */
-                       length = min_t(int, mp->m_dirblkfsbs,
+                       length = min_t(int, geo->fsbcount,
                                        map[mip->ra_index].br_blockcount -
                                                        mip->ra_offset);
-                       j += length;
                        mip->ra_offset += length;
 
                        /*
@@ -505,6 +509,7 @@ xfs_dir2_leaf_getdents(
        xfs_dir2_off_t          newoff;         /* new curoff after new blk */
        char                    *ptr = NULL;    /* pointer to current data */
        struct xfs_dir2_leaf_map_info *map_info;
+       struct xfs_da_geometry  *geo;
 
        /*
         * If the offset is at or past the largest allowed value,
@@ -514,6 +519,7 @@ xfs_dir2_leaf_getdents(
                return 0;
 
        mp = dp->i_mount;
+       geo = mp->m_dir_geo;
 
        /*
         * Set up to bmap a number of blocks based on the caller's
@@ -531,14 +537,14 @@ xfs_dir2_leaf_getdents(
         * Inside the loop we keep the main offset value as a byte offset
         * in the directory file.
         */
-       curoff = xfs_dir2_dataptr_to_byte(mp, ctx->pos);
+       curoff = xfs_dir2_dataptr_to_byte(ctx->pos);
 
        /*
         * Force this conversion through db so we truncate the offset
         * down to get the start of the data block.
         */
-       map_info->map_off = xfs_dir2_db_to_da(mp,
-                                             xfs_dir2_byte_to_db(mp, curoff));
+       map_info->map_off = xfs_dir2_db_to_da(geo,
+                                             xfs_dir2_byte_to_db(geo, curoff));
 
        /*
         * Loop over directory entries until we reach the end offset.
@@ -561,7 +567,8 @@ xfs_dir2_leaf_getdents(
                        /*
                         * Having done a read, we need to set a new offset.
                         */
-                       newoff = xfs_dir2_db_off_to_byte(mp, map_info->curdb, 0);
+                       newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo,
+                                                        map_info->curdb, 0);
                        /*
                         * Start of the current block.
                         */
@@ -571,7 +578,7 @@ xfs_dir2_leaf_getdents(
                         * Make sure we're in the right block.
                         */
                        else if (curoff > newoff)
-                               ASSERT(xfs_dir2_byte_to_db(mp, curoff) ==
+                               ASSERT(xfs_dir2_byte_to_db(geo, curoff) ==
                                       map_info->curdb);
                        hdr = bp->b_addr;
                        xfs_dir3_data_check(dp, bp);
@@ -579,7 +586,7 @@ xfs_dir2_leaf_getdents(
                         * Find our position in the block.
                         */
                        ptr = (char *)dp->d_ops->data_entry_p(hdr);
-                       byteoff = xfs_dir2_byte_to_off(mp, curoff);
+                       byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff);
                        /*
                         * Skip past the header.
                         */
@@ -608,8 +615,8 @@ xfs_dir2_leaf_getdents(
                                 * Now set our real offset.
                                 */
                                curoff =
-                                       xfs_dir2_db_off_to_byte(mp,
-                                           xfs_dir2_byte_to_db(mp, curoff),
+                                       xfs_dir2_db_off_to_byte(geo,
+                                           xfs_dir2_byte_to_db(geo, curoff),
                                            (char *)ptr - (char *)hdr);
                                if (ptr >= (char *)hdr + mp->m_dirblksize) {
                                        continue;
@@ -635,7 +642,7 @@ xfs_dir2_leaf_getdents(
                length = dp->d_ops->data_entsize(dep->namelen);
                filetype = dp->d_ops->data_get_ftype(dep);
 
-               ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
+               ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff;
                if (!dir_emit(ctx, (char *)dep->name, dep->namelen,
                            be64_to_cpu(dep->inumber),
                            xfs_dir3_get_dtype(mp, filetype)))
@@ -653,10 +660,10 @@ xfs_dir2_leaf_getdents(
        /*
         * All done.  Set output offset value to current offset.
         */
-       if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR))
+       if (curoff > xfs_dir2_dataptr_to_byte(XFS_DIR2_MAX_DATAPTR))
                ctx->pos = XFS_DIR2_MAX_DATAPTR & 0x7fffffff;
        else
-               ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
+               ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff;
        kmem_free(map_info);
        if (bp)
                xfs_trans_brelse(NULL, bp);
@@ -687,7 +694,7 @@ xfs_readdir(
        lock_mode = xfs_ilock_data_map_shared(dp);
        if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
                rval = xfs_dir2_sf_getdents(dp, ctx);
-       else if ((rval = xfs_dir2_isblock(NULL, dp, &v)))
+       else if ((rval = xfs_dir2_isblock(dp, &v)))
                ;
        else if (v)
                rval = xfs_dir2_block_getdents(dp, ctx);
This page took 0.030463 seconds and 5 git commands to generate.