Skip to content

Commit

Permalink
xfs: convert directory vector functions to constants
Browse files Browse the repository at this point in the history
Next step in the vectorisation process is the directory free block
encode/decode operations. There are relatively few of these, though
there are quite a number of calls to them.

Binary sizes:

   text    data     bss     dec     hex filename
 794490   96802    1096  892388   d9de4 fs/xfs/xfs.o.orig
 792986   96802    1096  890884   d9804 fs/xfs/xfs.o.p1
 792350   96802    1096  890248   d9588 fs/xfs/xfs.o.p2
 789293   96802    1096  887191   d8997 fs/xfs/xfs.o.p3
 789005   96802    1096  886903   d8997 fs/xfs/xfs.o.p4
 789061   96802    1096  886959   d88af fs/xfs/xfs.o.p5
 789733   96802    1096  887631   d8b4f fs/xfs/xfs.o.p6
 791421   96802    1096  889319   d91e7 fs/xfs/xfs.o.p7
 791701   96802    1096  889599   d92ff fs/xfs/xfs.o.p8

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
  • Loading branch information
Dave Chinner authored and Ben Myers committed Oct 30, 2013
1 parent 01ba43b commit 24dd0f5
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 70 deletions.
89 changes: 89 additions & 0 deletions fs/xfs/xfs_da_format.c
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,80 @@ xfs_da3_node_hdr_to_disk(
/*
* Directory free space block operations
*/
static int
xfs_dir2_free_hdr_size(void)
{
return sizeof(struct xfs_dir2_free_hdr);
}

static int
xfs_dir2_free_max_bests(struct xfs_mount *mp)
{
return (mp->m_dirblksize - xfs_dir2_free_hdr_size()) /
sizeof(xfs_dir2_data_off_t);
}

static __be16 *
xfs_dir2_free_bests_p(struct xfs_dir2_free *free)
{
return (__be16 *)((char *)free + xfs_dir2_free_hdr_size());
}

/*
* Convert data space db to the corresponding free db.
*/
static xfs_dir2_db_t
xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp);
}

/*
* Convert data space db to the corresponding index in a free db.
*/
static int
xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return db % xfs_dir2_free_max_bests(mp);
}

static int
xfs_dir3_free_hdr_size(void)
{
return sizeof(struct xfs_dir3_free_hdr);
}

static int
xfs_dir3_free_max_bests(struct xfs_mount *mp)
{
return (mp->m_dirblksize - xfs_dir3_free_hdr_size()) /
sizeof(xfs_dir2_data_off_t);
}

static __be16 *
xfs_dir3_free_bests_p(struct xfs_dir2_free *free)
{
return (__be16 *)((char *)free + xfs_dir3_free_hdr_size());
}

/*
* Convert data space db to the corresponding free db.
*/
static xfs_dir2_db_t
xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp);
}

/*
* Convert data space db to the corresponding index in a free db.
*/
static int
xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return db % xfs_dir3_free_max_bests(mp);
}

static void
xfs_dir2_free_hdr_from_disk(
struct xfs_dir3_icfree_hdr *to,
Expand Down Expand Up @@ -722,8 +796,13 @@ const struct xfs_dir_ops xfs_dir2_ops = {
.node_hdr_from_disk = xfs_da2_node_hdr_from_disk,
.node_tree_p = xfs_da2_node_tree_p,

.free_hdr_size = xfs_dir2_free_hdr_size,
.free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
.free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
.free_max_bests = xfs_dir2_free_max_bests,
.free_bests_p = xfs_dir2_free_bests_p,
.db_to_fdb = xfs_dir2_db_to_fdb,
.db_to_fdindex = xfs_dir2_db_to_fdindex,
};

const struct xfs_dir_ops xfs_dir2_ftype_ops = {
Expand Down Expand Up @@ -764,8 +843,13 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = {
.node_hdr_from_disk = xfs_da2_node_hdr_from_disk,
.node_tree_p = xfs_da2_node_tree_p,

.free_hdr_size = xfs_dir2_free_hdr_size,
.free_hdr_to_disk = xfs_dir2_free_hdr_to_disk,
.free_hdr_from_disk = xfs_dir2_free_hdr_from_disk,
.free_max_bests = xfs_dir2_free_max_bests,
.free_bests_p = xfs_dir2_free_bests_p,
.db_to_fdb = xfs_dir2_db_to_fdb,
.db_to_fdindex = xfs_dir2_db_to_fdindex,
};

const struct xfs_dir_ops xfs_dir3_ops = {
Expand Down Expand Up @@ -806,8 +890,13 @@ const struct xfs_dir_ops xfs_dir3_ops = {
.node_hdr_from_disk = xfs_da3_node_hdr_from_disk,
.node_tree_p = xfs_da3_node_tree_p,

.free_hdr_size = xfs_dir3_free_hdr_size,
.free_hdr_to_disk = xfs_dir3_free_hdr_to_disk,
.free_hdr_from_disk = xfs_dir3_free_hdr_from_disk,
.free_max_bests = xfs_dir3_free_max_bests,
.free_bests_p = xfs_dir3_free_bests_p,
.db_to_fdb = xfs_dir3_db_to_fdb,
.db_to_fdindex = xfs_dir3_db_to_fdindex,
};

const struct xfs_dir_ops xfs_dir2_nondir_ops = {
Expand Down
39 changes: 0 additions & 39 deletions fs/xfs/xfs_da_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -704,45 +704,6 @@ struct xfs_dir3_icfree_hdr {

};

static inline int
xfs_dir3_free_hdr_size(struct xfs_mount *mp)
{
if (xfs_sb_version_hascrc(&mp->m_sb))
return sizeof(struct xfs_dir3_free_hdr);
return sizeof(struct xfs_dir2_free_hdr);
}

static inline int
xfs_dir3_free_max_bests(struct xfs_mount *mp)
{
return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) /
sizeof(xfs_dir2_data_off_t);
}

static inline __be16 *
xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free)
{
return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp));
}

/*
* Convert data space db to the corresponding free db.
*/
static inline xfs_dir2_db_t
xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp);
}

/*
* Convert data space db to the corresponding index in a free db.
*/
static inline int
xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db)
{
return db % xfs_dir3_free_max_bests(mp);
}

/*
* Single block format.
*
Expand Down
5 changes: 5 additions & 0 deletions fs/xfs/xfs_dir2.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,15 @@ struct xfs_dir_ops {
struct xfs_da_node_entry *
(*node_tree_p)(struct xfs_da_intnode *dap);

int (*free_hdr_size)(void);
void (*free_hdr_to_disk)(struct xfs_dir2_free *to,
struct xfs_dir3_icfree_hdr *from);
void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to,
struct xfs_dir2_free *from);
int (*free_max_bests)(struct xfs_mount *mp);
__be16 * (*free_bests_p)(struct xfs_dir2_free *free);
xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db);
int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db);
};

extern const struct xfs_dir_ops *
Expand Down
2 changes: 1 addition & 1 deletion fs/xfs/xfs_dir2_leaf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1785,7 +1785,7 @@ xfs_dir2_node_to_leaf(
/*
* Set up the leaf bests table.
*/
memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free),
memcpy(xfs_dir2_leaf_bests_p(ltp), dp->d_ops->free_bests_p(free),
freehdr.nvalid * sizeof(xfs_dir2_data_off_t));

dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr);
Expand Down
Loading

0 comments on commit 24dd0f5

Please sign in to comment.