xfs: introduce struct xfs_da_geometry
v3 cover xfs: introduce struct xfs_da_geometry
Hi folks,
Version three of the patchset first posted here:
http://oss.sgi.com/pipermail/xfs/2014-May/036125.html
This version addresses the review comments so far.
Changelog:
Version 3:
- added xfs_da_unmount
- moved dir2 conversion functions to xfs_dir2_priv.h
- converted xfs_dir2_readdir.c to use local geo variables
- added a patch to remove newly redundant geometry fields from the struct xfs_da_state
Version 2:
- patch removing checks from xfs_da_read_buf() sent separately
- dropped patch adding xfs_da_geometry to the inode forks as it's not currently needed
- cleared up all the "XXX" notations added in the RFC series
- fixed several bugs in different patches as a result of incorrect conversions
- ensured each patch compiled and passes xfstests individually
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 1/16 xfs: introduce directory geometry structure
From: Dave Chinner <[email protected]>
The directory code has a dependency on the struct xfs_mount to supply the directory block geometry. Block size, block log size, and other parameters are pre-caclulated in the struct xfs_mount or access directly from the superblock embedded in the struct xfs_mount.
Extract all of this geometry information out of the struct xfs_mount and superblock and place it into a new struct xfs_da_geometry defined by the directory code. Allocate and initialise it at mount time, and attach it to the struct xfs_mount so it canbe passed back into the directory code appropriately rather than using the struct xfs_mount.
--- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_leaf.c | 2 ++ fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_da_btree.h | 18 +++++++++++++ fs/xfs/xfs_dir2.c | 73 +++++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_dir2.h | 4 ++- fs/xfs/xfs_mount.c | 16 ++++++----- fs/xfs/xfs_mount.h | 3 +++ 8 files changed, 97 insertions(+), 21 deletions(-)
fs/xfs/xfs_attr.c +1 -0
@@ -88,6 +88,7 @@ xfs_attr_args_init(return EINVAL ;memset (args,0 ,sizeof (*args)); + args->geo = dp->i_mount->m_attr_geo; args->whichfork =XFS_ATTR_FORK ; args->dp = dp; args->flags = flags;
fs/xfs/xfs_attr_leaf.c +2 -0
@@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args)memset ((char *)&nargs,0 ,sizeof (nargs)); nargs.dp = dp; + nargs.geo = args->geo; nargs.firstblock = args->firstblock; nargs.flist = args->flist; nargs.total = args->total;
@@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform(* Copy the attributes */ memset ((char *)&nargs,0 ,sizeof (nargs)); + nargs.geo = args->geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist;
fs/xfs/xfs_attr_list.c +1 -0
@@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int(xfs_da_args_t args;memset ((char *)&args,0 ,sizeof (args)); + args.geo = context->dp->i_mount->m_attr_geo; args.dp = context->dp; args.whichfork =XFS_ATTR_FORK ; args.valuelen = valuelen;
fs/xfs/xfs_da_btree.h +18 -0
@@ -25,6 +25,23 @@ struct xfs_trans;struct zone ;struct xfs_dir_ops ; +/* +* Directory/attribute geometry information. There will be one of these for each +* data fork type, and it will be passed around via the xfs_da_args. Global +* structures will be attached to the xfs_mount. +*/ +struct xfs_da_geometry { +int blksize;/* da block size in bytes */ +int fsbcount;/* da block size in filesystem blocks */ +uint8_t fsblog;/* log2 of _filesystem_ block size */ +uint8_t blklog;/* log2 of da block size */ +uint node_ents;/* # of entries in a danode */ +int magicpct;/* 37% of block size in bytes */ +xfs_dablk_t datablk;/* blockno of dir data v2 */ +xfs_dablk_t leafblk;/* blockno of leaf data v2 */ +xfs_dablk_t freeblk;/* blockno of free data v2 */ +}; +/*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/
@@ -42,6 +59,7 @@ enum xfs_dacmp {* Structure to ease passing around component names. */ typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ __uint8_t filetype; /* filetype of inode for directories */
fs/xfs/xfs_dir2.c +60 -13
131 lines not on this page · raw message
fs/xfs/xfs_dir2.h +3 -1
@@ -112,7 +112,9 @@ extern const struct xfs_dir_ops ** Generic directory interface routines */ extern void xfs_dir_startup (void ); -extern void xfs_dir_mount (struct xfs_mount *mp); +extern int xfs_da_mount (struct xfs_mount *mp); +extern void xfs_da_unmount (struct xfs_mount *mp); +extern int xfs_dir_isempty (struct xfs_inode *dp);extern int xfs_dir_init (struct xfs_trans *tp,struct xfs_inode *dp,struct xfs_inode *pdp);
fs/xfs/xfs_mount.c +9 -7
@@ -791,12 +791,11 @@ xfs_mountfs( mp->m_dmevmask =0 ;/* not persistent; set after each mount */ -xfs_dir_mount (mp); - -/* -* Initialize the attribute manager's entries. -*/ - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize *37 ) /100 ; + error =xfs_da_mount (mp); +if (error) { +xfs_warn (mp,"Failed dir/attr init: %d" , error); + goto out_remove_uuid; + }/* * Initialize the precomputed transaction reservations values.
@@ -811,7 +810,7 @@ xfs_mountfs( error =xfs_initialize_perag (mp, sbp->sb_agcount, &mp->m_maxagi);if (error) {xfs_warn (mp,"Failed per-ag init: %d" , error); - goto out_remove_uuid; + goto out_free_dir; }if (!sbp->sb_logblocks) {
@@ -986,6 +985,8 @@ xfs_mountfs(xfs_wait_buftarg (mp->m_ddev_targp); out_free_perag:xfs_free_perag (mp); + out_free_dir: +xfs_da_unmount (mp); out_remove_uuid:xfs_uuid_unmount (mp); out:
@@ -1063,6 +1064,7 @@ xfs_unmountfs( "Freespace may not be correct on next mount.");xfs_log_unmount (mp); +xfs_da_unmount (mp);xfs_uuid_unmount (mp);#if defined(DEBUG )
fs/xfs/xfs_mount.h +3 -0
@@ -27,6 +27,7 @@ struct xfs_nameops;struct xfs_ail ;struct xfs_quotainfo ;struct xfs_dir_ops ; +struct xfs_da_geometry ;#ifdef HAVE_PERCPU_SB
@@ -96,6 +97,8 @@ typedef struct xfs_mount {uint m_readio_blocks;/* min read size blocks */ uint m_writeio_log;/* min write size log bytes */ uint m_writeio_blocks;/* min write size blocks */ +struct xfs_da_geometry *m_dir_geo;/* directory block geometry */ +struct xfs_da_geometry *m_attr_geo;/* attribute block geometry */ struct xlog *m_log;/* log specific stuff */ int m_logbufs;/* number of log buffers */ int m_logbsize;/* size of each log buffer */
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 01/16] xfs: introduce directory geometry structure
Quoted 15 lines · Dave Chinner
From: Dave Chinner <[email protected]>
The directory code has a dependency on the struct
xfs_mountto supply the directory block geometry. Block size, block log size, and other parameters are pre-caclulated in the structxfs_mountor access directly from the superblock embedded in the structxfs_mount.Extract all of this geometry information out of the struct
xfs_mountand superblock and place it into a new structxfs_da_geometrydefined by the directory code. Allocate and initialise it at mount time, and attach it to the structxfs_mountso it canbe passed back into the directory code appropriately rather than using the structxfs_mount.
Quoted 2 lines
Signed-off-by Dave Chinner <[email protected]>---
Quoted 324 lines
fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_leaf.c | 2 ++ fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_da_btree.h | 18 +++++++++++++ fs/xfs/xfs_dir2.c | 73 +++++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_dir2.h | 4 ++- fs/xfs/xfs_mount.c | 16 ++++++----- fs/xfs/xfs_mount.h | 3 +++ 8 files changed, 97 insertions(+), 21 deletions(-)fs/xfs/xfs_attr.c +1
-0@@ -88,6 +88,7 @@ xfs_attr_args_init(return EINVAL ;memset (args,0 ,sizeof (*args)); + args->geo = dp->i_mount->m_attr_geo; args->whichfork =XFS_ATTR_FORK ; args->dp = dp; args->flags = flags;fs/xfs/xfs_attr_leaf.c +2
-0@@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args)memset ((char *)&nargs,0 ,sizeof (nargs)); nargs.dp = dp; + nargs.geo = args->geo; nargs.firstblock = args->firstblock; nargs.flist = args->flist; nargs.total = args->total;@@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform(* Copy the attributes */ memset ((char *)&nargs,0 ,sizeof (nargs)); + nargs.geo = args->geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist;fs/xfs/xfs_attr_list.c +1
-0@@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int(xfs_da_args_t args;memset ((char *)&args,0 ,sizeof (args)); + args.geo = context->dp->i_mount->m_attr_geo; args.dp = context->dp; args.whichfork =XFS_ATTR_FORK ; args.valuelen = valuelen;fs/xfs/xfs_da_btree.h +18
-0@@ -25,6 +25,23 @@ struct xfs_trans;struct zone ;struct xfs_dir_ops ; +/* +* Directory/attribute geometry information. There will be one of these for each +* data fork type, and it will be passed around via the xfs_da_args. Global +* structures will be attached to the xfs_mount. +*/ +struct xfs_da_geometry { +int blksize;/* da block size in bytes */ +int fsbcount;/* da block size in filesystem blocks */ +uint8_t fsblog;/* log2 of _filesystem_ block size */ +uint8_t blklog;/* log2 of da block size */ +uint node_ents;/* # of entries in a danode */ +int magicpct;/* 37% of block size in bytes */ +xfs_dablk_t datablk;/* blockno of dir data v2 */ +xfs_dablk_t leafblk;/* blockno of leaf data v2 */ +xfs_dablk_t freeblk;/* blockno of free data v2 */ +}; +/*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ @@ -42,6 +59,7 @@ enum xfs_dacmp {* Structure to ease passing around component names. */ typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ __uint8_t filetype; /* filetype of inode for directories */fs/xfs/xfs_dir2.c +60
-13@@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { .compname = xfs_ascii_ci_compname, }; -void -xfs_dir_mount ( -xfs_mount_t *mp) +int +xfs_da_mount ( +struct xfs_mount *mp) { -int nodehdr_size; +struct xfs_da_geometry *dageo; +int nodehdr_size;ASSERT (mp->m_sb.sb_versionnum &XFS_SB_VERSION_DIRV2BIT );@@ -99,24 +100,64 @@ xfs_dir_mount( mp->m_dir_inode_ops =xfs_dir_get_ops (mp,NULL ); mp->m_nondir_inode_ops =xfs_nondir_get_ops (mp,NULL ); - mp->m_dirblksize =1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); - mp->m_dirblkfsbs =1 << mp->m_sb.sb_dirblklog; - mp->m_dirdatablk =xfs_dir2_db_to_da (mp,XFS_DIR2_DATA_FIRSTDB (mp)); - mp->m_dirleafblk =xfs_dir2_db_to_da (mp,XFS_DIR2_LEAF_FIRSTDB (mp)); - mp->m_dirfreeblk =xfs_dir2_db_to_da (mp,XFS_DIR2_FREE_FIRSTDB (mp)); - nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / + mp->m_dir_geo =kmem_zalloc (sizeof (struct xfs_da_geometry ), +KM_SLEEP |KM_MAYFAIL ); + mp->m_attr_geo =kmem_zalloc (sizeof (struct xfs_da_geometry ), +KM_SLEEP |KM_MAYFAIL ); +if (!mp->m_dir_geo || !mp->m_attr_geo) { +kmem_free (mp->m_dir_geo); +kmem_free (mp->m_attr_geo); +return ENOMEM ; + } + +/* set up directory geometry */ + dageo = mp->m_dir_geo; + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize =1 << dageo->blklog; + dageo->fsbcount =1 << mp->m_sb.sb_dirblklog; + dageo->datablk =xfs_dir2_byte_to_da (mp,XFS_DIR2_DATA_OFFSET ); + dageo->leafblk =xfs_dir2_byte_to_da (mp,XFS_DIR2_LEAF_OFFSET ); + dageo->freeblk =xfs_dir2_byte_to_da (mp,XFS_DIR2_FREE_OFFSET ); + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint )sizeof (xfs_da_node_entry_t); - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / + dageo->magicpct = (dageo->blksize *37 ) /100 ; + +/* set up attribute geometry - single fsb only */ + dageo = mp->m_attr_geo; + dageo->blklog = mp->m_sb.sb_blocklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize =1 << dageo->blklog; + dageo->fsbcount =1 ; + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint )sizeof (xfs_da_node_entry_t); + dageo->magicpct = (dageo->blksize *37 ) /100 ; - mp->m_dir_magicpct = (mp->m_dirblksize *37 ) /100 ;if (xfs_sb_version_hasasciici (&mp->m_sb)) mp->m_dirnameops = &xfs_ascii_ci_nameops;else mp->m_dirnameops = &xfs_default_nameops; +/* XXX: these are to be removed as code is converted to use geo */ + mp->m_dirblksize = mp->m_dir_geo->blksize; + mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; + mp->m_dirdatablk = mp->m_dir_geo->datablk; + mp->m_dirleafblk = mp->m_dir_geo->leafblk; + mp->m_dirfreeblk = mp->m_dir_geo->freeblk; + mp->m_dir_node_ents = mp->m_dir_geo->node_ents; + mp->m_dir_magicpct = mp->m_dir_geo->magicpct; + mp->m_attr_node_ents = mp->m_attr_geo->node_ents; + mp->m_attr_magicpct = mp->m_attr_geo->magicpct; +return 0 ; +} + +void +xfs_da_unmount ( +struct xfs_mount *mp) +{ +kmem_free (mp->m_dir_geo); +kmem_free (mp->m_attr_geo); }/* @@ -192,6 +233,7 @@ xfs_dir_init(if (!args)return ENOMEM ; + args->geo = dp->i_mount->m_dir_geo; args->dp = dp; args->trans = tp; error =xfs_dir2_sf_create (args, pdp->i_ino);@@ -226,6 +268,7 @@ xfs_dir_createname(if (!args)return ENOMEM ; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type;@@ -320,6 +363,7 @@ xfs_dir_lookup(* annotations into the reclaim path for the ilock. */ args =kmem_zalloc (sizeof (*args),KM_SLEEP |KM_NOFS ); + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type;@@ -391,6 +435,7 @@ xfs_dir_removename(if (!args)return ENOMEM ; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type;@@ -455,6 +500,7 @@ xfs_dir_replace(if (!args)return ENOMEM ; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type;@@ -516,6 +562,7 @@ xfs_dir_canenter(if (!args)return ENOMEM ; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type;fs/xfs/xfs_dir2.h +3
-1@@ -112,7 +112,9 @@ extern const struct xfs_dir_ops ** Generic directory interface routines */ extern void xfs_dir_startup (void ); -extern void xfs_dir_mount (struct xfs_mount *mp); +extern int xfs_da_mount (struct xfs_mount *mp); +extern void xfs_da_unmount (struct xfs_mount *mp); +extern int xfs_dir_isempty (struct xfs_inode *dp);extern int xfs_dir_init (struct xfs_trans *tp,struct xfs_inode *dp,struct xfs_inode *pdp);fs/xfs/xfs_mount.c +9
-7@@ -791,12 +791,11 @@ xfs_mountfs( mp->m_dmevmask =0 ;/* not persistent; set after each mount */ -xfs_dir_mount (mp); - -/* -* Initialize the attribute manager's entries. -*/ - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize *37 ) /100 ; + error =xfs_da_mount (mp); +if (error) { +xfs_warn (mp,"Failed dir/attr init: %d" , error); + goto out_remove_uuid; + }/* * Initialize the precomputed transaction reservations values. @@ -811,7 +810,7 @@ xfs_mountfs( error =xfs_initialize_perag (mp, sbp->sb_agcount, &mp->m_maxagi);if (error) {xfs_warn (mp,"Failed per-ag init: %d" , error); - goto out_remove_uuid; + goto out_free_dir; }if (!sbp->sb_logblocks) {@@ -986,6 +985,8 @@ xfs_mountfs(xfs_wait_buftarg (mp->m_ddev_targp); out_free_perag:xfs_free_perag (mp); + out_free_dir: +xfs_da_unmount (mp); out_remove_uuid:xfs_uuid_unmount (mp); out:@@ -1063,6 +1064,7 @@ xfs_unmountfs( "Freespace may not be correct on next mount.");xfs_log_unmount (mp); +xfs_da_unmount (mp);xfs_uuid_unmount (mp);#if defined(DEBUG )fs/xfs/xfs_mount.h +3
-0@@ -27,6 +27,7 @@ struct xfs_nameops;struct xfs_ail ;struct xfs_quotainfo ;struct xfs_dir_ops ; +struct xfs_da_geometry ;#ifdef HAVE_PERCPU_SB @@ -96,6 +97,8 @@ typedef struct xfs_mount {uint m_readio_blocks;/* min read size blocks */ uint m_writeio_log;/* min write size log bytes */ uint m_writeio_blocks;/* min write size blocks */ +struct xfs_da_geometry *m_dir_geo;/* directory block geometry */ +struct xfs_da_geometry *m_attr_geo;/* attribute block geometry */ struct xlog *m_log;/* log specific stuff */ int m_logbufs;/* number of log buffers */ int m_logbsize;/* size of each log buffer */ Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 2/16 xfs: move directory block translatiosn to xfs_dir2_priv.h
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Because they aren't actually part of the on-disk format, and so shouldn't be in xfs_da_format.h.
--- fs/xfs/xfs_da_format.c | 2 + fs/xfs/xfs_da_format.h | 138 ------------------------------------------------- fs/xfs/xfs_dir2_priv.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 138 deletions(-)
fs/xfs/xfs_da_format.c +2 -0
@@ -26,8 +26,10 @@#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_dir2.h" +#include "xfs_dir2_priv.h" /* * Shortform directory ops
fs/xfs/xfs_da_format.h +0 -138
156 lines not on this page · raw message
fs/xfs/xfs_dir2_priv.h +137 -0
143 lines not on this page · raw message
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 3/16 xfs: kill XFS_DIR2...FIRSTDB macros
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
They are just simple wrappers around xfs_dir2_byte_to_db(), and we've already removed one usage earlier in the patch set. Kill the rest before we start removing the xfs_mount from conversion functions.
--- fs/xfs/xfs_da_format.c | 6 ++++-- fs/xfs/xfs_da_format.h | 6 ------ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 9 +++++---- fs/xfs/xfs_dir2_node.c | 11 +++++++---- 5 files changed, 17 insertions(+), 17 deletions(-)
fs/xfs/xfs_da_format.c +4 -2
@@ -611,7 +611,8 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free)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); +return xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ) + + (db /xfs_dir2_free_max_bests (mp)); }/*
@@ -642,7 +643,8 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free)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); +return xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ) + + (db /xfs_dir3_free_max_bests (mp)); }/*
fs/xfs/xfs_da_format.h +0 -6
@@ -330,8 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr)#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG))#define XFS_DIR2_DATA_SPACE 0#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB (mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET)/* * Describe a free area in the data block.
@@ -456,8 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup)*/ #define XFS_DIR2_LEAF_SPACE 1#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB (mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)/* * Leaf block header.
@@ -531,8 +527,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp)*/ #define XFS_DIR2_FREE_SPACE 2#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB (mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) typedef struct xfs_dir2_free_hdr { __be32 magic; /* XFS_DIR2_FREE_MAGIC */
fs/xfs/xfs_dir2.c +1 -1
@@ -744,7 +744,7 @@ xfs_dir2_shrink_inode(/* * If it's not a data block, we're done. */ -if (db >=XFS_DIR2_LEAF_FIRSTDB (mp)) +if (db >=xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ))return 0 ;/* * If the block isn't the last one in the directory, we're done.
fs/xfs/xfs_dir2_leaf.c +5 -4
@@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf(int error;ASSERT (magic ==XFS_DIR2_LEAF1_MAGIC || magic ==XFS_DIR2_LEAFN_MAGIC ); -ASSERT (bno >=XFS_DIR2_LEAF_FIRSTDB (mp) && - bno <XFS_DIR2_FREE_FIRSTDB (mp)); +ASSERT (bno >=xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ) && + bno <xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET )); error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (mp, bno),-1 , &bp,XFS_DATA_FORK );
@@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf(return error; } ldb =xfs_dir2_da_to_db (mp, blkno); -ASSERT (ldb ==XFS_DIR2_LEAF_FIRSTDB (mp)); +ASSERT (ldb ==xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ));/* * Initialize the leaf block, get a buffer for it. */
@@ -1798,7 +1798,8 @@ xfs_dir2_node_to_leaf(/* * Get rid of the freespace block. */ - error =xfs_dir2_shrink_inode (args,XFS_DIR2_FREE_FIRSTDB (mp), fbp); + error =xfs_dir2_shrink_inode (args, +xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ), fbp);if (error) {/* * This can't fail here because it can only happen when
fs/xfs/xfs_dir2_node.c +7 -4
@@ -315,7 +315,7 @@ xfs_dir2_leaf_to_node(if ((error =xfs_dir2_grow_inode (args,XFS_DIR2_FREE_SPACE , &fdb))) {return error; } -ASSERT (fdb ==XFS_DIR2_FREE_FIRSTDB (mp)); +ASSERT (fdb ==xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ));/* * Get the buffer for the new freespace block. */
@@ -1256,7 +1256,7 @@ xfs_dir2_leafn_remove(struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk (&freehdr, free);ASSERT (freehdr.firstdb == dp->d_ops->free_max_bests (mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); }#endif /*
@@ -1747,7 +1747,8 @@ xfs_dir2_node_addname_int(* us a freespace block to start with. */ if (++fbno ==0 ) - fbno =XFS_DIR2_FREE_FIRSTDB (mp); + fbno =xfs_dir2_byte_to_db (mp, +XFS_DIR2_FREE_OFFSET );/* * If it's ifbno we already looked at it. */
@@ -1887,7 +1888,9 @@ xfs_dir2_node_addname_int(/* * Remember the first slot as our empty slot. */ - freehdr.firstdb = (fbno -XFS_DIR2_FREE_FIRSTDB (mp)) * + freehdr.firstdb = + (fbno -xfs_dir2_byte_to_db (mp, +XFS_DIR2_FREE_OFFSET )) * dp->d_ops->free_max_bests (mp); }else { free = fbp->b_addr;
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 4/16 xfs: convert dir byte/off conversion to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_priv.h | 18 +++++++++--------- fs/xfs/xfs_dir2_readdir.c | 7 ++++--- 3 files changed, 14 insertions(+), 13 deletions(-)
fs/xfs/xfs_dir2.c +1 -1
@@ -749,7 +749,7 @@ xfs_dir2_shrink_inode(/* * If the block isn't the last one in the directory, we're done. */ -if (dp->i_d.di_size >xfs_dir2_db_off_to_byte (mp, db +1 ,0 )) +if (dp->i_d.di_size >xfs_dir2_db_off_to_byte (args->geo, db +1 ,0 ))return 0 ; bno = da;if ((error =xfs_bmap_last_before (tp, dp, &bno,XFS_DATA_FORK ))) {
fs/xfs/xfs_dir2_priv.h +9 -9
@@ -67,10 +67,9 @@ xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp)* Convert byte in space to offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off (struct xfs_mount *mp,xfs_dir2_off_t by) +xfs_dir2_byte_to_off (struct xfs_da_geometry *geo,xfs_dir2_off_t by) { -return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) -1 )); +return (xfs_dir2_data_aoff_t)(by & (geo->blksize -1 )); }/*
@@ -79,18 +78,17 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by)static inline xfs_dir2_data_aoff_t xfs_dir2_dataptr_to_off (struct xfs_mount *mp,xfs_dir2_dataptr_t dp) { -return xfs_dir2_byte_to_off (mp,xfs_dir2_dataptr_to_byte (dp)); +return xfs_dir2_byte_to_off (mp->m_dir_geo,xfs_dir2_dataptr_to_byte (dp)); }/* * Convert block and offset to byte in space */ static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte (struct xfs_mount *mp,xfs_dir2_db_t db, +xfs_dir2_db_off_to_byte (struct xfs_da_geometry *geo,xfs_dir2_db_t db,xfs_dir2_data_aoff_t o) { -return ((xfs_dir2_off_t )db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +return ((xfs_dir2_off_t )db << geo->blklog) + o; }/*
@@ -118,7 +116,8 @@ static inline xfs_dir2_dataptr_t xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); + return xfs_dir2_byte_to_dataptr( + xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); }/*
@@ -136,7 +135,8 @@ xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da)static inline xfs_dir2_off_t xfs_dir2_da_to_byte (struct xfs_mount *mp,xfs_dablk_t da) { -return xfs_dir2_db_off_to_byte (mp,xfs_dir2_da_to_db (mp, da),0 ); +return xfs_dir2_db_off_to_byte (mp->m_dir_geo, +xfs_dir2_da_to_db (mp, da),0 ); }/*
fs/xfs/xfs_dir2_readdir.c +4 -3
@@ -560,7 +560,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. */
@@ -578,7 +579,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. */
@@ -607,7 +608,7 @@ xfs_dir2_leaf_getdents(* Now set our real offset. */ curoff = -xfs_dir2_db_off_to_byte (mp, +xfs_dir2_db_off_to_byte (mp->m_dir_geo,xfs_dir2_byte_to_db (mp, curoff), (char *)ptr - (char *)hdr);if (ptr >= (char *)hdr + mp->m_dirblksize) {
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 5/16 xfs: convert directory dablk conversion to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_data.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ fs/xfs/xfs_dir2_priv.h | 15 +++++++-------- fs/xfs/xfs_dir2_readdir.c | 6 +++--- 6 files changed, 48 insertions(+), 43 deletions(-)
fs/xfs/xfs_dir2.c +2 -2
@@ -632,7 +632,7 @@ xfs_dir2_grow_inode(if (error)return error; - *dbp =xfs_dir2_da_to_db (mp, (xfs_dablk_t )bno); + *dbp =xfs_dir2_da_to_db (args->geo, (xfs_dablk_t )bno);/* * Update file's size if this is the data space and it grew.
@@ -713,7 +713,7 @@ xfs_dir2_shrink_inode( dp = args->dp; mp = dp->i_mount; tp = args->trans; - da =xfs_dir2_db_to_da (mp, db); + da =xfs_dir2_db_to_da (args->geo, db);/* * Unmap the fsblock(s). */
fs/xfs/xfs_dir2_data.c +2 -2
@@ -584,8 +584,8 @@ xfs_dir3_data_init(/* * Get the buffer set up for the block. */ - error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (mp, blkno),-1 , &bp, -XFS_DATA_FORK ); + error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (args->geo, blkno), +-1 , &bp,XFS_DATA_FORK );if (error)return error; bp->b_ops = &xfs_dir3_data_buf_ops;
fs/xfs/xfs_dir2_leaf.c +11 -10
@@ -350,8 +350,8 @@ xfs_dir3_leaf_get_buf(ASSERT (bno >=xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ) && bno <xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET )); - error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (mp, bno),-1 , &bp, -XFS_DATA_FORK ); + error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (args->geo, bno), +-1 , &bp,XFS_DATA_FORK );if (error)return error;
@@ -403,7 +403,7 @@ xfs_dir2_block_to_leaf(if ((error =xfs_da_grow_inode (args, &blkno))) {return error; } - ldb =xfs_dir2_da_to_db (mp, blkno); + ldb =xfs_dir2_da_to_db (args->geo, blkno);ASSERT (ldb ==xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ));/* * Initialize the leaf block, get a buffer for it.
@@ -828,8 +828,8 @@ xfs_dir2_leaf_addname(* Just read that one in. */ error =xfs_dir3_data_read (tp, dp, -xfs_dir2_db_to_da (mp, use_block), --1 , &dbp); +xfs_dir2_db_to_da (args->geo, use_block), +-1 , &dbp);if (error) {xfs_trans_brelse (tp, lbp);return error;
@@ -1269,8 +1269,8 @@ xfs_dir2_leaf_lookup_int(if (dbp)xfs_trans_brelse (tp, dbp); error =xfs_dir3_data_read (tp, dp, -xfs_dir2_db_to_da (mp, newdb), --1 , &dbp); +xfs_dir2_db_to_da (args->geo, newdb), +-1 , &dbp);if (error) {xfs_trans_brelse (tp, lbp);return error;
@@ -1310,8 +1310,8 @@ xfs_dir2_leaf_lookup_int(if (cidb != curdb) {xfs_trans_brelse (tp, dbp); error =xfs_dir3_data_read (tp, dp, -xfs_dir2_db_to_da (mp, cidb), --1 , &dbp); +xfs_dir2_db_to_da (args->geo, cidb), +-1 , &dbp);if (error) {xfs_trans_brelse (tp, lbp);return error;
@@ -1609,7 +1609,8 @@ xfs_dir2_leaf_trim_data(/* * Read the offending data block. We need its buffer. */ - error =xfs_dir3_data_read (tp, dp,xfs_dir2_db_to_da (mp, db),-1 , &dbp); + error =xfs_dir3_data_read (tp, dp,xfs_dir2_db_to_da (args->geo, db), +-1 , &dbp);if (error)return error;
fs/xfs/xfs_dir2_node.c +23 -18
121 lines not on this page · raw message
fs/xfs/xfs_dir2_priv.h +7 -8
@@ -95,9 +95,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db,* Convert block (DB) to block (dablk) */ static inline xfs_dablk_t -xfs_dir2_db_to_da (struct xfs_mount *mp,xfs_dir2_db_t db) +xfs_dir2_db_to_da (struct xfs_da_geometry *geo,xfs_dir2_db_t db) { -return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +return (xfs_dablk_t)(db << (geo->blklog - geo->fsblog)); }/*
@@ -106,7 +106,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db)static inline xfs_dablk_t xfs_dir2_byte_to_da (struct xfs_mount *mp,xfs_dir2_off_t by) { -return xfs_dir2_db_to_da (mp,xfs_dir2_byte_to_db (mp, by)); +return xfs_dir2_db_to_da (mp->m_dir_geo,xfs_dir2_byte_to_db (mp, by)); }/*
@@ -124,19 +124,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db,* Convert block (dablk) to block (DB) */ static inline xfs_dir2_db_t -xfs_dir2_da_to_db (struct xfs_mount *mp,xfs_dablk_t da) +xfs_dir2_da_to_db (struct xfs_da_geometry *geo,xfs_dablk_t da) { -return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +return (xfs_dir2_db_t)(da >> (geo->blklog - geo->fsblog)); }/* * Convert block (dablk) to byte offset in space */ static inline xfs_dir2_off_t -xfs_dir2_da_to_byte (struct xfs_mount *mp,xfs_dablk_t da) +xfs_dir2_da_to_byte (struct xfs_da_geometry *geo,xfs_dablk_t da) { -return xfs_dir2_db_off_to_byte (mp->m_dir_geo, -xfs_dir2_da_to_db (mp, da),0 ); +return xfs_dir2_db_off_to_byte (geo,xfs_dir2_da_to_db (geo, da),0 ); }/*
fs/xfs/xfs_dir2_readdir.c +3 -3
@@ -396,14 +396,14 @@ 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 (mp->m_dir_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 (mp->m_dir_geo, map->br_startoff); error =xfs_dir3_data_read (NULL , dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ?XFS_FSB_TO_DADDR (mp, map->br_startblock) :-1 , &bp);
@@ -536,7 +536,7 @@ xfs_dir2_leaf_getdents(* 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, + map_info->map_off =xfs_dir2_db_to_da (mp->m_dir_geo,xfs_dir2_byte_to_db (mp, curoff));/*
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 6/16 xfs: convert directory db conversion to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_da_format.c | 4 ++-- fs/xfs/xfs_dir2.c | 13 +++++++++---- fs/xfs/xfs_dir2_block.c | 15 +++++++++------ fs/xfs/xfs_dir2_data.c | 3 ++- fs/xfs/xfs_dir2_leaf.c | 30 +++++++++++++++++------------- fs/xfs/xfs_dir2_node.c | 27 ++++++++++++++++----------- fs/xfs/xfs_dir2_priv.h | 22 ++++++++++------------ fs/xfs/xfs_dir2_readdir.c | 45 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_dir2_sf.c | 4 ++-- 9 files changed, 93 insertions(+), 70 deletions(-)
fs/xfs/xfs_da_format.c +2 -2
@@ -611,7 +611,7 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free)static xfs_dir2_db_t xfs_dir2_db_to_fdb (struct xfs_mount *mp,xfs_dir2_db_t db) { -return xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ) + +return xfs_dir2_byte_to_db (mp->m_dir_geo,XFS_DIR2_FREE_OFFSET ) + (db /xfs_dir2_free_max_bests (mp)); }
@@ -643,7 +643,7 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free)static xfs_dir2_db_t xfs_dir3_db_to_fdb (struct xfs_mount *mp,xfs_dir2_db_t db) { -return xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ) + +return xfs_dir2_byte_to_db (mp->m_dir_geo,XFS_DIR2_FREE_OFFSET ) + (db /xfs_dir3_free_max_bests (mp)); }
fs/xfs/xfs_dir2.c +9 -4
@@ -117,9 +117,14 @@ xfs_da_mount( dageo->fsblog = mp->m_sb.sb_blocklog; dageo->blksize =1 << dageo->blklog; dageo->fsbcount =1 << mp->m_sb.sb_dirblklog; - dageo->datablk =xfs_dir2_byte_to_da (mp,XFS_DIR2_DATA_OFFSET ); - dageo->leafblk =xfs_dir2_byte_to_da (mp,XFS_DIR2_LEAF_OFFSET ); - dageo->freeblk =xfs_dir2_byte_to_da (mp,XFS_DIR2_FREE_OFFSET ); + +/* +* Now we've set up the block conversion variables, we can calculate the +* segment block constants using the geometry structure. +*/ + dageo->datablk =xfs_dir2_byte_to_da (dageo,XFS_DIR2_DATA_OFFSET ); + dageo->leafblk =xfs_dir2_byte_to_da (dageo,XFS_DIR2_LEAF_OFFSET ); + dageo->freeblk =xfs_dir2_byte_to_da (dageo,XFS_DIR2_FREE_OFFSET ); dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint )sizeof (xfs_da_node_entry_t); dageo->magicpct = (dageo->blksize *37 ) /100 ;
@@ -744,7 +749,7 @@ xfs_dir2_shrink_inode(/* * If it's not a data block, we're done. */ -if (db >=xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET )) +if (db >=xfs_dir2_byte_to_db (args->geo,XFS_DIR2_LEAF_OFFSET ))return 0 ;/* * If the block isn't the last one in the directory, we're done.
fs/xfs/xfs_dir2_block.c +9 -6
@@ -639,7 +639,8 @@ xfs_dir2_block_lookup(* Get the offset from the leaf entry, to point to the data. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + -xfs_dir2_dataptr_to_off (mp,be32_to_cpu (blp[ent].address))); +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (blp[ent].address)));/* * Fill in inode number, CI name if appropriate, release the block. */
@@ -723,7 +724,7 @@ xfs_dir2_block_lookup_int(* Get pointer to the entry from the leaf. */ dep = (xfs_dir2_data_entry_t *) - ((char *)hdr +xfs_dir2_dataptr_to_off (mp, addr)); + ((char *)hdr +xfs_dir2_dataptr_to_off (args->geo, addr));/* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store
@@ -795,8 +796,9 @@ xfs_dir2_block_removename(/* * Point to the data entry using the leaf entry. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr +xfs_dir2_dataptr_to_off (mp,be32_to_cpu (blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (blp[ent].address)));/* * Mark the data entry's space free. */
@@ -870,8 +872,9 @@ xfs_dir2_block_replace(/* * Point to the data entry we need to change. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr +xfs_dir2_dataptr_to_off (mp,be32_to_cpu (blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (blp[ent].address)));ASSERT (be64_to_cpu (dep->inumber) != args->inumber);/* * Change the inode number to the new value.
fs/xfs/xfs_dir2_data.c +2 -1
@@ -172,7 +172,8 @@ __xfs_dir3_data_check( lastfree =0 ;if (hdr->magic ==cpu_to_be32 (XFS_DIR2_BLOCK_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_BLOCK_MAGIC )) { - addr =xfs_dir2_db_off_to_dataptr (mp, mp->m_dirdatablk, + addr =xfs_dir2_db_off_to_dataptr (mp->m_dir_geo, + mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); name.name = dep->name;
fs/xfs/xfs_dir2_leaf.c +17 -13
@@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf(int error;ASSERT (magic ==XFS_DIR2_LEAF1_MAGIC || magic ==XFS_DIR2_LEAFN_MAGIC ); -ASSERT (bno >=xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET ) && - bno <xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET )); +ASSERT (bno >=xfs_dir2_byte_to_db (args->geo,XFS_DIR2_LEAF_OFFSET ) && + bno <xfs_dir2_byte_to_db (args->geo,XFS_DIR2_FREE_OFFSET )); error =xfs_da_get_buf (tp, dp,xfs_dir2_db_to_da (args->geo, bno),-1 , &bp,XFS_DATA_FORK );
@@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf(return error; } ldb =xfs_dir2_da_to_db (args->geo, blkno); -ASSERT (ldb ==xfs_dir2_byte_to_db (mp,XFS_DIR2_LEAF_OFFSET )); +ASSERT (ldb ==xfs_dir2_byte_to_db (args->geo,XFS_DIR2_LEAF_OFFSET ));/* * Initialize the leaf block, get a buffer for it. */
@@ -670,7 +670,7 @@ xfs_dir2_leaf_addname( index++, lep++) {if (be32_to_cpu (lep->address) ==XFS_DIR2_NULL_DATAPTR )continue ; - i =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); + i =xfs_dir2_dataptr_to_db (args->geo,be32_to_cpu (lep->address));ASSERT (i <be32_to_cpu (ltp->bestcount));ASSERT (bestsp[i] !=cpu_to_be16 (NULLDATAOFF ));if (be16_to_cpu (bestsp[i]) >= length) {
@@ -889,7 +889,8 @@ xfs_dir2_leaf_addname(* Fill in the new leaf entry. */ lep->hashval =cpu_to_be32 (args->hashval); - lep->address =cpu_to_be32 (xfs_dir2_db_off_to_dataptr (mp, use_block, + lep->address =cpu_to_be32 ( +xfs_dir2_db_off_to_dataptr (args->geo, use_block,be16_to_cpu (*tagp)));/* * Log the leaf fields and give up the buffers.
@@ -1185,7 +1186,7 @@ xfs_dir2_leaf_lookup(*/ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + -xfs_dir2_dataptr_to_off (dp->i_mount,be32_to_cpu (lep->address))); +xfs_dir2_dataptr_to_off (args->geo,be32_to_cpu (lep->address)));/* * Return the found inode number & CI name if appropriate */
@@ -1260,7 +1261,8 @@ xfs_dir2_leaf_lookup_int(/* * Get the new data block number. */ - newdb =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); + newdb =xfs_dir2_dataptr_to_db (args->geo, +be32_to_cpu (lep->address));/* * If it's not the same as the old data block number, * need to pitch the old one and read the new one.
@@ -1281,7 +1283,8 @@ xfs_dir2_leaf_lookup_int(* Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + -xfs_dir2_dataptr_to_off (mp,be32_to_cpu (lep->address))); +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (lep->address)));/* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store
@@ -1380,9 +1383,9 @@ xfs_dir2_leaf_removename(* Point to the leaf entry, use that to point to the data entry. */ lep = &ents[index]; - db =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr +xfs_dir2_dataptr_to_off (mp,be32_to_cpu (lep->address))); + db =xfs_dir2_dataptr_to_db (args->geo,be32_to_cpu (lep->address)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + +xfs_dir2_dataptr_to_off (args->geo,be32_to_cpu (lep->address))); needscan = needlog =0 ; oldbest =be16_to_cpu (bf[0 ].length); ltp =xfs_dir2_leaf_tail_p (mp, leaf);
@@ -1515,7 +1518,7 @@ xfs_dir2_leaf_replace(*/ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + -xfs_dir2_dataptr_to_off (dp->i_mount,be32_to_cpu (lep->address))); +xfs_dir2_dataptr_to_off (args->geo,be32_to_cpu (lep->address)));ASSERT (args->inumber !=be64_to_cpu (dep->inumber));/* * Put the new inode number in, log it.
@@ -1800,7 +1803,8 @@ xfs_dir2_node_to_leaf(* Get rid of the freespace block. */ error =xfs_dir2_shrink_inode (args, -xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET ), fbp); +xfs_dir2_byte_to_db (args->geo,XFS_DIR2_FREE_OFFSET ), + fbp);if (error) {/* * This can't fail here because it can only happen when
fs/xfs/xfs_dir2_node.c +16 -11
@@ -316,7 +316,7 @@ xfs_dir2_leaf_to_node(if ((error =xfs_dir2_grow_inode (args,XFS_DIR2_FREE_SPACE , &fdb))) {return error; } -ASSERT (fdb ==xfs_dir2_byte_to_db (mp,XFS_DIR2_FREE_OFFSET )); +ASSERT (fdb ==xfs_dir2_byte_to_db (args->geo,XFS_DIR2_FREE_OFFSET ));/* * Get the buffer for the new freespace block. */
@@ -451,7 +451,7 @@ xfs_dir2_leafn_add( highstale, &lfloglow, &lfloghigh); lep->hashval =cpu_to_be32 (args->hashval); - lep->address =cpu_to_be32 (xfs_dir2_db_off_to_dataptr (mp, + lep->address =cpu_to_be32 (xfs_dir2_db_off_to_dataptr (args->geo, args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk (leaf, &leafhdr);
@@ -577,7 +577,8 @@ xfs_dir2_leafn_lookup_for_addname(/* * Pull the data block number from the entry. */ - newdb =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); + newdb =xfs_dir2_dataptr_to_db (args->geo, +be32_to_cpu (lep->address));/* * For addname, we're looking for a place to put the new entry. * We want to use a data block with an entry of equal
@@ -723,7 +724,8 @@ xfs_dir2_leafn_lookup_for_entry(/* * Pull the data block number from the entry. */ - newdb =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); + newdb =xfs_dir2_dataptr_to_db (args->geo, +be32_to_cpu (lep->address));/* * Not adding a new entry, so we really want to find * the name given to us.
@@ -761,7 +763,8 @@ xfs_dir2_leafn_lookup_for_entry(* Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + -xfs_dir2_dataptr_to_off (mp,be32_to_cpu (lep->address))); +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (lep->address)));/* * Compare the entry and if it's an exact match, return * EEXIST immediately. If it's the first case-insensitive
@@ -1196,9 +1199,9 @@ xfs_dir2_leafn_remove(/* * Extract the data block and offset from the entry. */ - db =xfs_dir2_dataptr_to_db (mp,be32_to_cpu (lep->address)); + db =xfs_dir2_dataptr_to_db (args->geo,be32_to_cpu (lep->address));ASSERT (dblk->blkno == db); - off =xfs_dir2_dataptr_to_off (mp,be32_to_cpu (lep->address)); + off =xfs_dir2_dataptr_to_off (args->geo,be32_to_cpu (lep->address));ASSERT (dblk->index == off);/*
@@ -1260,7 +1263,8 @@ xfs_dir2_leafn_remove(struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk (&freehdr, free);ASSERT (freehdr.firstdb == dp->d_ops->free_max_bests (mp) * - (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); + (fdb -xfs_dir2_byte_to_db (args->geo, + XFS_DIR2_FREE_OFFSET))); }#endif /*
@@ -1751,7 +1755,7 @@ xfs_dir2_node_addname_int(* us a freespace block to start with. */ if (++fbno ==0 ) - fbno =xfs_dir2_byte_to_db (mp, + fbno =xfs_dir2_byte_to_db (args->geo,XFS_DIR2_FREE_OFFSET );/* * If it's ifbno we already looked at it.
@@ -1893,7 +1897,7 @@ xfs_dir2_node_addname_int(* Remember the first slot as our empty slot. */ freehdr.firstdb = - (fbno -xfs_dir2_byte_to_db (mp, + (fbno -xfs_dir2_byte_to_db (args->geo,XFS_DIR2_FREE_OFFSET )) * dp->d_ops->free_max_bests (mp); }else {
@@ -2194,7 +2198,8 @@ xfs_dir2_node_replace( hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + -xfs_dir2_dataptr_to_off (state->mp,be32_to_cpu (lep->address))); +xfs_dir2_dataptr_to_off (args->geo, +be32_to_cpu (lep->address)));ASSERT (inum !=be64_to_cpu (dep->inumber));/* * Fill in the new inode number and log the entry.
fs/xfs/xfs_dir2_priv.h +10 -12
@@ -48,19 +48,18 @@ xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by)* Convert byte in space to (DB) block */ static inline xfs_dir2_db_t -xfs_dir2_byte_to_db (struct xfs_mount *mp,xfs_dir2_off_t by) +xfs_dir2_byte_to_db (struct xfs_da_geometry *geo,xfs_dir2_off_t by) { -return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +return (xfs_dir2_db_t)(by >> geo->blklog); }/* * Convert dataptr to a block number */ static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db (struct xfs_mount *mp,xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_db (struct xfs_da_geometry *geo,xfs_dir2_dataptr_t dp) { -return xfs_dir2_byte_to_db (mp,xfs_dir2_dataptr_to_byte (dp)); +return xfs_dir2_byte_to_db (geo,xfs_dir2_dataptr_to_byte (dp)); }/*
@@ -76,9 +75,9 @@ xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by)* Convert dataptr to a byte offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off (struct xfs_mount *mp,xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_off (struct xfs_da_geometry *geo,xfs_dir2_dataptr_t dp) { -return xfs_dir2_byte_to_off (mp->m_dir_geo,xfs_dir2_dataptr_to_byte (dp)); +return xfs_dir2_byte_to_off (geo,xfs_dir2_dataptr_to_byte (dp)); }/*
@@ -104,20 +103,19 @@ xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db)* Convert byte in space to (DA) block */ static inline xfs_dablk_t -xfs_dir2_byte_to_da (struct xfs_mount *mp,xfs_dir2_off_t by) +xfs_dir2_byte_to_da (struct xfs_da_geometry *geo,xfs_dir2_off_t by) { -return xfs_dir2_db_to_da (mp->m_dir_geo,xfs_dir2_byte_to_db (mp, by)); +return xfs_dir2_db_to_da (geo,xfs_dir2_byte_to_db (geo, by)); }/* * Convert block and offset to dataptr */ static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr (struct xfs_mount *mp,xfs_dir2_db_t db, +xfs_dir2_db_off_to_dataptr (struct xfs_da_geometry *geo,xfs_dir2_db_t db,xfs_dir2_data_aoff_t o) { -return xfs_dir2_byte_to_dataptr ( -xfs_dir2_db_off_to_byte (mp->m_dir_geo, db, o)); +return xfs_dir2_byte_to_dataptr (xfs_dir2_db_off_to_byte (geo, db, o)); }/*
fs/xfs/xfs_dir2_readdir.c +26 -19
173 lines not on this page · raw message
fs/xfs/xfs_dir2_sf.c +2 -2
@@ -104,8 +104,8 @@ xfs_dir2_block_sfsize(/* * Calculate the pointer to the entry at hand. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr +xfs_dir2_dataptr_to_off (mp, addr)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + +xfs_dir2_dataptr_to_off (mp->m_dir_geo, addr));/* * Detect . and .., so we can special-case them. * . is not included in sf directories.
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 7/16 xfs: convert directory segment limits to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_da_btree.c | 22 +++++++++++----------- fs/xfs/xfs_dir2.c | 7 ++----- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_data.c | 9 +++++---- fs/xfs/xfs_dir2_leaf.c | 12 ++++++------ fs/xfs/xfs_dir2_readdir.c | 18 +++++++++--------- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_mount.h | 3 --- 8 files changed, 37 insertions(+), 42 deletions(-)
fs/xfs/xfs_da_btree.c +11 -11
@@ -598,7 +598,7 @@ xfs_da3_root_split(* Set up the new root node. */ error =xfs_da3_node_create (args, - (args->whichfork ==XFS_DATA_FORK ) ? mp->m_dirleafblk :0 , + (args->whichfork ==XFS_DATA_FORK ) ? args->geo->leafblk :0 , level +1 , &bp, args->whichfork);if (error)return error;
@@ -616,10 +616,10 @@ xfs_da3_root_split(#ifdef DEBUG if (oldroot->hdr.info.magic ==cpu_to_be16 (XFS_DIR2_LEAFN_MAGIC ) || oldroot->hdr.info.magic ==cpu_to_be16 (XFS_DIR3_LEAFN_MAGIC )) { -ASSERT (blk1->blkno >= mp->m_dirleafblk && - blk1->blkno < mp->m_dirfreeblk); -ASSERT (blk2->blkno >= mp->m_dirleafblk && - blk2->blkno < mp->m_dirfreeblk); +ASSERT (blk1->blkno >= args->geo->leafblk && + blk1->blkno < args->geo->freeblk); +ASSERT (blk2->blkno >= args->geo->leafblk && + blk2->blkno < args->geo->freeblk); }#endif
@@ -894,8 +894,8 @@ xfs_da3_node_add(ASSERT (oldblk->index >=0 && oldblk->index <= nodehdr.count);ASSERT (newblk->blkno !=0 );if (state->args->whichfork ==XFS_DATA_FORK ) -ASSERT (newblk->blkno >= state->mp->m_dirleafblk && - newblk->blkno < state->mp->m_dirfreeblk); +ASSERT (newblk->blkno >= state->args->geo->leafblk && + newblk->blkno < state->args->geo->freeblk);/* * We may need to make some room before we insert the new node.
@@ -1472,7 +1472,7 @@ xfs_da3_node_lookup_int(* Descend thru the B-tree searching each level for the right * node to use, until the right hashval is found. */ - blkno = (args->whichfork ==XFS_DATA_FORK )? state->mp->m_dirleafblk :0 ; + blkno = (args->whichfork ==XFS_DATA_FORK )? args->geo->leafblk :0 ;for (blk = &state->path.blk[0 ], state->path.active =1 ; state->path.active <=XFS_DA_NODE_MAXDEPTH ; blk++, state->path.active++) {
@@ -2096,7 +2096,7 @@ xfs_da_grow_inode(trace_xfs_da_grow_inode (args);if (args->whichfork ==XFS_DATA_FORK ) { - bno = args->dp->i_mount->m_dirleafblk; + bno = args->geo->leafblk; count = args->dp->i_mount->m_dirblkfsbs; }else { bno =0 ;
@@ -2158,7 +2158,7 @@ xfs_da3_swap_lastblock( w = args->whichfork;ASSERT (w ==XFS_DATA_FORK ); mp = dp->i_mount; - lastoff = mp->m_dirfreeblk; + lastoff = args->geo->freeblk; error =xfs_bmap_last_before (tp, dp, &lastoff, w);if (error)return error;
@@ -2247,7 +2247,7 @@ xfs_da3_swap_lastblock( sizeof(sib_info->back))); sib_buf =NULL ; } - par_blkno = mp->m_dirleafblk; + par_blkno = args->geo->leafblk; level =-1 ;/* * Walk down the tree looking for the parent of the moved block.
fs/xfs/xfs_dir2.c +2 -5
@@ -147,9 +147,6 @@ xfs_da_mount(/* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; - mp->m_dirdatablk = mp->m_dir_geo->datablk; - mp->m_dirleafblk = mp->m_dir_geo->leafblk; - mp->m_dirfreeblk = mp->m_dir_geo->freeblk; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents;
@@ -690,7 +687,7 @@ xfs_dir2_isleaf( mp = dp->i_mount;if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK )))return rval; - *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog);return 0 ; }
@@ -763,7 +760,7 @@ xfs_dir2_shrink_inode(*/ return error; } -if (db == mp->m_dirdatablk) +if (db == args->geo->datablk)ASSERT (bno ==0 );else ASSERT (bno >0 );
fs/xfs/xfs_dir2_block.c +3 -3
@@ -136,7 +136,7 @@ xfs_dir3_block_read(struct xfs_mount *mp = dp->i_mount;int err; - err =xfs_da_read_buf (tp, dp, mp->m_dirdatablk,-1 , bpp, + err =xfs_da_read_buf (tp, dp, mp->m_dir_geo->datablk,-1 , bpp,XFS_DATA_FORK , &xfs_dir3_block_buf_ops);if (!err && tp)xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_BLOCK_BUF );
@@ -969,7 +969,7 @@ xfs_dir2_leaf_to_block(* Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error =xfs_dir3_data_read (tp, dp, mp->m_dirdatablk,-1 , &dbp); + error =xfs_dir3_data_read (tp, dp, args->geo->datablk,-1 , &dbp);if (error)return error; }
@@ -1034,7 +1034,7 @@ xfs_dir2_leaf_to_block(/* * Pitch the old leaf block. */ - error =xfs_da_shrink_inode (args, mp->m_dirleafblk, lbp); + error =xfs_da_shrink_inode (args, args->geo->leafblk, lbp);if (error)return error;
fs/xfs/xfs_dir2_data.c +5 -4
@@ -63,8 +63,10 @@ __xfs_dir3_data_check(int stale;/* count of stale leaves */ struct xfs_name name;const struct xfs_dir_ops *ops; +struct xfs_da_geometry *geo; mp = bp->b_target->bt_mount; + geo = mp->m_dir_geo;/* * We can be passed a null dp here from a verifier, so we need to go the
@@ -172,10 +174,9 @@ __xfs_dir3_data_check( lastfree =0 ;if (hdr->magic ==cpu_to_be32 (XFS_DIR2_BLOCK_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_BLOCK_MAGIC )) { - addr =xfs_dir2_db_off_to_dataptr (mp->m_dir_geo, - mp->m_dirdatablk, - (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)hdr)); + addr =xfs_dir2_db_off_to_dataptr (geo, geo->datablk, + (xfs_dir2_data_aoff_t) + ((char *)dep - (char *)hdr)); name.name = dep->name; name.len = dep->namelen; hash = mp->m_dirnameops->hashname (&name);
fs/xfs/xfs_dir2_leaf.c +6 -6
@@ -641,7 +641,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error =xfs_dir3_leaf_read (tp, dp, mp->m_dirleafblk,-1 , &lbp); + error =xfs_dir3_leaf_read (tp, dp, args->geo->leafblk,-1 , &lbp);if (error)return error;
@@ -1232,7 +1232,7 @@ xfs_dir2_leaf_lookup_int( tp = args->trans; mp = dp->i_mount; - error =xfs_dir3_leaf_read (tp, dp, mp->m_dirleafblk,-1 , &lbp); + error =xfs_dir3_leaf_read (tp, dp, args->geo->leafblk,-1 , &lbp);if (error)return error;
@@ -1429,7 +1429,7 @@ xfs_dir2_leaf_removename(*/ if (be16_to_cpu (bf[0 ].length) == mp->m_dirblksize - dp->d_ops->data_entry_offset) { -ASSERT (db != mp->m_dirdatablk); +ASSERT (db != args->geo->datablk);if ((error =xfs_dir2_shrink_inode (args, db, dbp))) {/* * Nope, can't get rid of it because it caused
@@ -1470,7 +1470,7 @@ xfs_dir2_leaf_removename(/* * If the data block was not the first one, drop it. */ - else if (db != mp->m_dirdatablk) + else if (db != args->geo->datablk) dbp =NULL ;xfs_dir3_leaf_check (dp, lbp);
@@ -1722,7 +1722,7 @@ xfs_dir2_node_to_leaf(* that may have been left behind during no-space-reservation * operations. */ -while (fo > mp->m_dirfreeblk) { +while (fo > args->geo->freeblk) {if ((error =xfs_dir2_node_trim_free (args, fo, &rval))) {return error; }
@@ -1752,7 +1752,7 @@ xfs_dir2_node_to_leaf(/* * Read the freespace block. */ - error =xfs_dir2_free_read (tp, dp, mp->m_dirfreeblk, &fbp); + error =xfs_dir2_free_read (tp, dp, args->geo->freeblk, &fbp);if (error)return error; free = fbp->b_addr;
fs/xfs/xfs_dir2_readdir.c +9 -9
@@ -111,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 (geo, 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 (geo, 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 (geo, mp->m_dirdatablk, + dotdot_offset =xfs_dir2_db_off_to_dataptr (geo, geo->datablk, dp->d_ops->data_dotdot_offset);/*
@@ -151,7 +151,7 @@ xfs_dir2_sf_getdents(for (i =0 ; i < sfp->count; i++) {__uint8_t filetype; - off =xfs_dir2_db_off_to_dataptr (geo, mp->m_dirdatablk, + off =xfs_dir2_db_off_to_dataptr (geo, geo->datablk,xfs_dir2_sf_get_offset (sfep));if (ctx->pos > off) {
@@ -168,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry (sfp, sfep); } - ctx->pos =xfs_dir2_db_off_to_dataptr (geo, mp->m_dirdatablk +1 ,0 ) & + ctx->pos =xfs_dir2_db_off_to_dataptr (geo, geo->datablk +1 ,0 ) &0x7fffffff ;return 0 ; }
@@ -199,7 +199,7 @@ xfs_dir2_block_getdents(/* * If the block number in the offset is out of range, we're done. */ -if (xfs_dir2_dataptr_to_db (geo, 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);
@@ -248,7 +248,7 @@ xfs_dir2_block_getdents(if ((char *)dep - (char *)hdr < wantoff)continue ; - cook =xfs_dir2_db_off_to_dataptr (geo, mp->m_dirdatablk, + cook =xfs_dir2_db_off_to_dataptr (geo, geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook &0x7fffffff ;
@@ -268,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 (geo, 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 ;
fs/xfs/xfs_dir2_sf.c +1 -1
@@ -247,7 +247,7 @@ xfs_dir2_block_to_sf(/* now we are done with the block, we can shrink the inode */ logflags =XFS_ILOG_CORE ; - error =xfs_dir2_shrink_inode (args, mp->m_dirdatablk, bp); + error =xfs_dir2_shrink_inode (args, args->geo->datablk, bp);if (error) {ASSERT (error !=ENOSPC ); goto out;
fs/xfs/xfs_mount.h +0 -3
@@ -156,9 +156,6 @@ typedef struct xfs_mount {const struct xfs_dir_ops *m_nondir_inode_ops;/* !dir inode ops */ int m_dirblksize;/* directory block sz--bytes */ int m_dirblkfsbs;/* directory block sz--fsbs */ -xfs_dablk_t m_dirdatablk;/* blockno of dir data v2 */ -xfs_dablk_t m_dirleafblk;/* blockno of dir non-data v2 */ -xfs_dablk_t m_dirfreeblk;/* blockno of dirfreeindex v2 */ uint m_chsize;/* size of next field */ atomic_t m_active_trans;/* number trans frozen */ #ifdef HAVE_PERCPU_SB
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 8/16 xfs: convert m_dirblkfsbs to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_bmap.c | 3 ++- fs/xfs/xfs_da_btree.c | 24 ++++++++---------------- fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2_leaf.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 16 ++++++++-------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_symlink.c | 1 + fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_trans_space.h | 5 +++-- 9 files changed, 27 insertions(+), 33 deletions(-)
fs/xfs/xfs_bmap.c +2 -1
@@ -1098,10 +1098,11 @@ xfs_bmap_add_attrfork_local(if (S_ISDIR (ip->i_d.di_mode)) {memset (&dargs,0 ,sizeof (dargs)); + dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip; dargs.firstblock = firstblock; dargs.flist = flist; - dargs.total = ip->i_mount->m_dirblkfsbs; + dargs.total = dargs.geo->fsbcount; dargs.whichfork =XFS_DATA_FORK ; dargs.trans = tp;return xfs_dir2_sf_to_block (&dargs);
fs/xfs/xfs_da_btree.c +8 -16
@@ -2090,20 +2090,12 @@ xfs_da_grow_inode( xfs_dablk_t *new_blkno) {xfs_fileoff_t bno; -int count;int error;trace_xfs_da_grow_inode (args); -if (args->whichfork ==XFS_DATA_FORK ) { - bno = args->geo->leafblk; - count = args->dp->i_mount->m_dirblkfsbs; - }else { - bno =0 ; - count =1 ; - } - - error =xfs_da_grow_inode_int (args, &bno, count); + bno = args->geo->leafblk; + error =xfs_da_grow_inode_int (args, &bno, args->geo->fsbcount);if (!error) *new_blkno = (xfs_dablk_t )bno;return error;
@@ -2170,7 +2162,7 @@ xfs_da3_swap_lastblock(/* * Read the last block in the btree space. */ - last_blkno = (xfs_dablk_t )lastoff - mp->m_dirblkfsbs; + last_blkno = (xfs_dablk_t )lastoff - args->geo->fsbcount; error =xfs_da3_node_read (tp, dp, last_blkno,-1 , &last_buf, w);if (error)return error;
@@ -2357,10 +2349,7 @@ xfs_da_shrink_inode( w = args->whichfork; tp = args->trans; mp = dp->i_mount; -if (w ==XFS_DATA_FORK ) - count = mp->m_dirblkfsbs; -else - count =1 ; + count = args->geo->fsbcount;for (;;) {/* * Remove extents. If we get ENOSPC for a dir we have to move
@@ -2479,7 +2468,10 @@ xfs_dabuf_map(ASSERT (map && *map);ASSERT (*nmaps ==1 ); - nfsb = (whichfork ==XFS_DATA_FORK ) ? mp->m_dirblkfsbs :1 ; +if (whichfork ==XFS_DATA_FORK ) + nfsb = mp->m_dir_geo->fsbcount; +else + nfsb = mp->m_attr_geo->fsbcount;/* * Caller doesn't have a mapping. -2 means don't complain
fs/xfs/xfs_dir2.c +2 -3
@@ -146,7 +146,6 @@ xfs_da_mount(/* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; - mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents;
@@ -628,7 +627,7 @@ xfs_dir2_grow_inode(* Set lowest possible block in the space requested. */ bno =XFS_B_TO_FSBT (mp, space *XFS_DIR2_SPACE_SIZE ); - count = mp->m_dirblkfsbs; + count = args->geo->fsbcount; error =xfs_da_grow_inode_int (args, &bno, count);if (error)
@@ -719,7 +718,7 @@ xfs_dir2_shrink_inode(/* * Unmap the fsblock(s). */ -if ((error =xfs_bunmapi (tp, dp, da, mp->m_dirblkfsbs, +if ((error =xfs_bunmapi (tp, dp, da, args->geo->fsbcount,XFS_BMAPI_METADATA ,0 , args->firstblock, args->flist, &done))) {/*
fs/xfs/xfs_dir2_leaf.c +2 -2
@@ -1715,7 +1715,7 @@ xfs_dir2_node_to_leaf(if ((error =xfs_bmap_last_offset (dp, &fo,XFS_DATA_FORK ))) {return error; } - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount;/* * If there are freespace blocks other than the first one, * take this opportunity to remove trailing empty freespace blocks
@@ -1727,7 +1727,7 @@ xfs_dir2_node_to_leaf(return error; }if (rval) - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount;else return 0 ; }
fs/xfs/xfs_dir2_readdir.c +8 -8
@@ -314,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;
@@ -410,7 +410,7 @@ xfs_dir2_leaf_readbuf(*/ 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);/*
@@ -424,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?
@@ -432,13 +432,13 @@ 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) { + 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,
@@ -461,12 +461,12 @@ xfs_dir2_leaf_readbuf(/* * Advance offset through the mapping table. */ -for (j =0 ; j < mp->m_dirblkfsbs; j += length ) { +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); mip->ra_offset += length;
fs/xfs/xfs_mount.h +0 -1
@@ -155,7 +155,6 @@ typedef struct xfs_mount {const struct xfs_dir_ops *m_dir_inode_ops;/* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops;/* !dir inode ops */ int m_dirblksize;/* directory block sz--bytes */ -int m_dirblkfsbs;/* directory block sz--fsbs */ uint m_chsize;/* size of next field */ atomic_t m_active_trans;/* number trans frozen */ #ifdef HAVE_PERCPU_SB
fs/xfs/xfs_symlink.c +1 -0
@@ -27,6 +27,7 @@#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_dir2.h" #include "xfs_inode.h" #include "xfs_ialloc.h"
fs/xfs/xfs_trans_resv.c +1 -0
@@ -26,6 +26,7 @@#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc.h"
fs/xfs/xfs_trans_space.h +3 -2
@@ -28,7 +28,8 @@ (((b +XFS_MAX_CONTIG_EXTENTS_PER_BLOCK (mp) -1 ) / \XFS_MAX_CONTIG_EXTENTS_PER_BLOCK (mp)) * \ XFS_EXTENTADD_SPACE_RES(mp,w)) -#define XFS_DAENTER_1B (mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) +#define XFS_DAENTER_1B (mp,w) \ + ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1)#define XFS_DAENTER_DBS (mp,w) \ (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0))#define XFS_DAENTER_BLOCKS (mp,w) \
@@ -55,7 +56,7 @@* Space reservation values for various transactions. */ #define XFS_ADDAFORK_SPACE_RES (mp) \ - ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) + ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK))#define XFS_ATTRRM_SPACE_RES (mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK)/* This macro is not used - see inline code in xfs_attr_set */
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 9/16 xfs: convert m_dirblksize to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_da_format.c | 36 ++++++++++++++++++------------------ fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2.h | 10 ++++++---- fs/xfs/xfs_dir2_block.c | 32 ++++++++++++++++---------------- fs/xfs/xfs_dir2_data.c | 17 ++++++++++------- fs/xfs/xfs_dir2_leaf.c | 35 ++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 42 ++++++++++++++++++++++-------------------- fs/xfs/xfs_dir2_priv.h | 8 ++++---- fs/xfs/xfs_dir2_readdir.c | 11 +++++------ fs/xfs/xfs_dir2_sf.c | 14 ++++++++------ fs/xfs/xfs_fsops.c | 4 +++- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_trans_resv.c | 2 +- 14 files changed, 115 insertions(+), 106 deletions(-)
fs/xfs/xfs_da_btree.c +2 -2
@@ -2169,8 +2169,8 @@ xfs_da3_swap_lastblock(/* * Copy the last block into the dead buffer and log it. */ -memcpy (dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); -xfs_trans_log_buf (tp, dead_buf,0 , mp->m_dirblksize -1 ); +memcpy (dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); +xfs_trans_log_buf (tp, dead_buf,0 , args->geo->blksize -1 ); dead_info = dead_buf->b_addr;/* * Get values from the moved block.
fs/xfs/xfs_da_format.c +18 -18
@@ -427,9 +427,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr)* Directory Leaf block operations */ static int -xfs_dir2_max_leaf_ents (struct xfs_mount *mp) +xfs_dir2_max_leaf_ents (struct xfs_da_geometry *geo) { -return (mp->m_dirblksize -sizeof (struct xfs_dir2_leaf_hdr )) / +return (geo->blksize -sizeof (struct xfs_dir2_leaf_hdr )) / (uint )sizeof (struct xfs_dir2_leaf_entry ); }
@@ -440,9 +440,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) }static int -xfs_dir3_max_leaf_ents (struct xfs_mount *mp) +xfs_dir3_max_leaf_ents (struct xfs_da_geometry *geo) { -return (mp->m_dirblksize -sizeof (struct xfs_dir3_leaf_hdr )) / +return (geo->blksize -sizeof (struct xfs_dir3_leaf_hdr )) / (uint )sizeof (struct xfs_dir2_leaf_entry ); }
@@ -593,9 +593,9 @@ xfs_da3_node_hdr_to_disk(* Directory free space block operations */ static int -xfs_dir2_free_max_bests (struct xfs_mount *mp) +xfs_dir2_free_max_bests (struct xfs_da_geometry *geo) { -return (mp->m_dirblksize -sizeof (struct xfs_dir2_free_hdr )) / +return (geo->blksize -sizeof (struct xfs_dir2_free_hdr )) /sizeof (xfs_dir2_data_off_t); }
@@ -609,25 +609,25 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free)* 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) +xfs_dir2_db_to_fdb (struct xfs_da_geometry *geo,xfs_dir2_db_t db) { -return xfs_dir2_byte_to_db (mp->m_dir_geo,XFS_DIR2_FREE_OFFSET ) + - (db /xfs_dir2_free_max_bests (mp)); +return xfs_dir2_byte_to_db (geo,XFS_DIR2_FREE_OFFSET ) + + (db /xfs_dir2_free_max_bests (geo)); }/* * 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) +xfs_dir2_db_to_fdindex (struct xfs_da_geometry *geo,xfs_dir2_db_t db) { -return db %xfs_dir2_free_max_bests (mp); +return db %xfs_dir2_free_max_bests (geo); }static int -xfs_dir3_free_max_bests (struct xfs_mount *mp) +xfs_dir3_free_max_bests (struct xfs_da_geometry *geo) { -return (mp->m_dirblksize -sizeof (struct xfs_dir3_free_hdr )) / +return (geo->blksize -sizeof (struct xfs_dir3_free_hdr )) /sizeof (xfs_dir2_data_off_t); }
@@ -641,19 +641,19 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free)* 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) +xfs_dir3_db_to_fdb (struct xfs_da_geometry *geo,xfs_dir2_db_t db) { -return xfs_dir2_byte_to_db (mp->m_dir_geo,XFS_DIR2_FREE_OFFSET ) + - (db /xfs_dir3_free_max_bests (mp)); +return xfs_dir2_byte_to_db (geo,XFS_DIR2_FREE_OFFSET ) + + (db /xfs_dir3_free_max_bests (geo)); }/* * 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) +xfs_dir3_db_to_fdindex (struct xfs_da_geometry *geo,xfs_dir2_db_t db) { -return db %xfs_dir3_free_max_bests (mp); +return db %xfs_dir3_free_max_bests (geo); } static void
fs/xfs/xfs_dir2.c +2 -3
@@ -145,7 +145,6 @@ xfs_da_mount( mp->m_dirnameops = &xfs_default_nameops;/* XXX: these are to be removed as code is converted to use geo */ - mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents;
@@ -665,8 +664,8 @@ xfs_dir2_isblock( mp = dp->i_mount;if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK )))return rval; - rval =XFS_FSB_TO_B (mp, last) == mp->m_dirblksize; -ASSERT (rval ==0 || dp->i_d.di_size == mp->m_dirblksize); + rval =XFS_FSB_TO_B (mp, last) == mp->m_dir_geo->blksize; +ASSERT (rval ==0 || dp->i_d.di_size == mp->m_dir_geo->blksize); *vp = rval;return 0 ; }
fs/xfs/xfs_dir2.h +6 -4
@@ -80,7 +80,7 @@ struct xfs_dir_ops { struct xfs_dir3_icleaf_hdr *from);void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to,struct xfs_dir2_leaf *from); -int (*leaf_max_ents)(struct xfs_mount *mp); +int (*leaf_max_ents)(struct xfs_da_geometry *geo);struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp);
@@ -97,10 +97,12 @@ struct xfs_dir_ops { 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); +int (*free_max_bests)(struct xfs_da_geometry *geo);__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); +xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, +xfs_dir2_db_t db); +int (*db_to_fdindex)(struct xfs_da_geometry *geo, +xfs_dir2_db_t db); }; extern const struct xfs_dir_ops *
fs/xfs/xfs_dir2_block.c +16 -16
@@ -377,7 +377,7 @@ xfs_dir2_block_addname(* Set up pointers to parts of the block. */ hdr = bp->b_addr; - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/*
@@ -581,7 +581,7 @@ xfs_dir2_block_log_leaf(xfs_dir2_leaf_entry_t *blp;xfs_dir2_block_tail_t *btp; - btp =xfs_dir2_block_tail_p (tp->t_mountp, hdr); + btp =xfs_dir2_block_tail_p (tp->t_mountp->m_dir_geo, hdr); blp =xfs_dir2_block_leaf_p (btp);xfs_trans_log_buf (tp, bp, (uint)((char *)&blp[first] - (char *)hdr), (uint)((char *)&blp[last +1 ] - (char *)hdr -1 ));
@@ -598,7 +598,7 @@ xfs_dir2_block_log_tail(xfs_dir2_data_hdr_t *hdr = bp->b_addr;xfs_dir2_block_tail_t *btp; - btp =xfs_dir2_block_tail_p (tp->t_mountp, hdr); + btp =xfs_dir2_block_tail_p (tp->t_mountp->m_dir_geo, hdr);xfs_trans_log_buf (tp, bp, (uint)((char *)btp - (char *)hdr), (uint)((char *)(btp +1 ) - (char *)hdr -1 )); }
@@ -633,7 +633,7 @@ xfs_dir2_block_lookup( mp = dp->i_mount; hdr = bp->b_addr;xfs_dir3_data_check (dp, bp); - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/* * Get the offset from the leaf entry, to point to the data.
@@ -686,7 +686,7 @@ xfs_dir2_block_lookup_int( hdr = bp->b_addr;xfs_dir3_data_check (dp, bp); - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/* * Loop doing a binary search for our hash value.
@@ -791,7 +791,7 @@ xfs_dir2_block_removename( tp = args->trans; mp = dp->i_mount; hdr = bp->b_addr; - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/* * Point to the data entry using the leaf entry.
@@ -867,7 +867,7 @@ xfs_dir2_block_replace( dp = args->dp; mp = dp->i_mount; hdr = bp->b_addr; - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/* * Point to the data entry we need to change.
@@ -941,7 +941,7 @@ xfs_dir2_leaf_to_block( leaf = lbp->b_addr; dp->d_ops->leaf_hdr_from_disk (&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p (leaf); - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf);ASSERT (leafhdr.magic ==XFS_DIR2_LEAF1_MAGIC || leafhdr.magic ==XFS_DIR3_LEAF1_MAGIC );
@@ -951,13 +951,13 @@ xfs_dir2_leaf_to_block(* been left behind during no-space-reservation operations. * These will show up in the leaf bests table. */ -while (dp->i_d.di_size > mp->m_dirblksize) { +while (dp->i_d.di_size > args->geo->blksize) {int hdrsz; hdrsz = dp->d_ops->data_entry_offset; bestsp =xfs_dir2_leaf_bests_p (ltp);if (be16_to_cpu (bestsp[be32_to_cpu (ltp->bestcount) -1 ]) == - mp->m_dirblksize - hdrsz) { + args->geo->blksize - hdrsz) {if ((error =xfs_dir2_leaf_trim_data (args, lbp, (xfs_dir2_db_t)(be32_to_cpu (ltp->bestcount) -1 ))))
@@ -985,7 +985,7 @@ xfs_dir2_leaf_to_block(/* * Look at the last data entry. */ - tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) -1 ; + tagp = (__be16 *)((char *)hdr + args->geo->blksize) -1 ; dup = (xfs_dir2_data_unused_t *)((char *)hdr +be16_to_cpu (*tagp));/* * If it's not free or is too short we can't do it.
@@ -1004,12 +1004,12 @@ xfs_dir2_leaf_to_block(/* * Use up the space at the end of the block (blp/btp). */ -xfs_dir2_data_use_free (tp, dp, dbp, dup, mp->m_dirblksize - size, size, +xfs_dir2_data_use_free (tp, dp, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan);/* * Initialize the block tail. */ - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); btp->count =cpu_to_be32 (leafhdr.count - leafhdr.stale); btp->stale =0 ;xfs_dir2_block_log_tail (tp, dbp);
@@ -1143,13 +1143,13 @@ xfs_dir2_sf_to_block(*/ dup = dp->d_ops->data_unused_p (hdr); needlog = needscan =0 ; -xfs_dir2_data_use_free (tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, - &needscan); +xfs_dir2_data_use_free (tp, dp, bp, dup, args->geo->blksize - i, + i, &needlog, &needscan);ASSERT (needscan ==0 );/* * Fill in the tail. */ - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); btp->count =cpu_to_be32 (sfp->count +2 );/* ., .. */ btp->stale =0 ; blp =xfs_dir2_block_leaf_p (btp);
fs/xfs/xfs_dir2_data.c +10 -7
@@ -80,7 +80,7 @@ __xfs_dir3_data_check(switch (hdr->magic) {case cpu_to_be32 (XFS_DIR3_BLOCK_MAGIC ):case cpu_to_be32 (XFS_DIR2_BLOCK_MAGIC ): - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (geo, hdr); lep =xfs_dir2_block_leaf_p (btp); endp = (char *)lep;
@@ -96,7 +96,7 @@ __xfs_dir3_data_check(break ;case cpu_to_be32 (XFS_DIR3_DATA_MAGIC ):case cpu_to_be32 (XFS_DIR2_DATA_MAGIC ): - endp = (char *)hdr + mp->m_dirblksize; + endp = (char *)hdr + geo->blksize;break ;default :XFS_ERROR_REPORT ("Bad Magic" ,XFS_ERRLEVEL_LOW , mp);
@@ -511,6 +511,7 @@ xfs_dir2_data_freescan(struct xfs_dir2_data_free *bf;char *endp;/* end of block's data */ char *p;/* current entry pointer */ +struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) ||
@@ -529,10 +530,10 @@ xfs_dir2_data_freescan( p = (char *)dp->d_ops->data_entry_p (hdr);if (hdr->magic ==cpu_to_be32 (XFS_DIR2_BLOCK_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_BLOCK_MAGIC )) { - btp =xfs_dir2_block_tail_p (dp->i_mount, hdr); + btp =xfs_dir2_block_tail_p (geo, hdr); endp = (char *)xfs_dir2_block_leaf_p (btp); }else - endp = (char *)hdr + dp->i_mount->m_dirblksize; + endp = (char *)hdr + geo->blksize;/* * Loop over the block's entries. */
@@ -622,7 +623,7 @@ xfs_dir3_data_init( dup = dp->d_ops->data_unused_p (hdr); dup->freetag =cpu_to_be16 (XFS_DIR2_DATA_FREE_TAG ); - t = mp->m_dirblksize - (uint )dp->d_ops->data_entry_offset; + t = args->geo->blksize - (uint )dp->d_ops->data_entry_offset; bf[0 ].length =cpu_to_be16 (t); dup->length =cpu_to_be16 (t); *xfs_dir2_data_unused_tag_p (dup) =cpu_to_be16 ((char *)dup - (char *)hdr);
@@ -732,22 +733,24 @@ xfs_dir2_data_make_free(xfs_dir2_data_unused_t *postdup;/* unused entry after us */ xfs_dir2_data_unused_t *prevdup;/* unused entry before us */ struct xfs_dir2_data_free *bf; +struct xfs_da_geometry *geo; mp = tp->t_mountp; hdr = bp->b_addr; + geo = mp->m_dir_geo;/* * Figure out where the end of the data area is. */ if (hdr->magic ==cpu_to_be32 (XFS_DIR2_DATA_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_DATA_MAGIC )) - endptr = (char *)hdr + mp->m_dirblksize; + endptr = (char *)hdr + geo->blksize;else {xfs_dir2_block_tail_t *btp;/* block tail */ ASSERT (hdr->magic ==cpu_to_be32 (XFS_DIR2_BLOCK_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_BLOCK_MAGIC )); - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p (btp); }/*
fs/xfs/xfs_dir2_leaf.c +18 -17
@@ -92,6 +92,7 @@ xfs_dir3_leaf_check_int(int i;const struct xfs_dir_ops *ops;struct xfs_dir3_icleaf_hdr leafhdr; +struct xfs_da_geometry *geo = mp->m_dir_geo;/* * we can be passed a null dp here from a verifier, so we need to go the
@@ -105,14 +106,14 @@ xfs_dir3_leaf_check_int( } ents = ops->leaf_ents_p (leaf); - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (geo, leaf);/* * XXX (dgc): This value is not restrictive enough. * Should factor in the size of the bests table as well. * We can deduce a value for that from di_size. */ -if (hdr->count > ops->leaf_max_ents (mp)) +if (hdr->count > ops->leaf_max_ents (geo))return false;/* Leaves and bests don't overlap in leaf format. */
@@ -323,7 +324,7 @@ xfs_dir3_leaf_init(if (type ==XFS_DIR2_LEAF1_MAGIC ) {struct xfs_dir2_leaf_tail *ltp; - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (mp->m_dir_geo, leaf); ltp->bestcount =0 ; bp->b_ops = &xfs_dir3_leaf1_buf_ops;xfs_trans_buf_set_type (tp, bp,XFS_BLFT_DIR_LEAF1_BUF );
@@ -415,7 +416,7 @@ xfs_dir2_block_to_leaf( leaf = lbp->b_addr; hdr = dbp->b_addr;xfs_dir3_data_check (dp, dbp); - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); blp =xfs_dir2_block_leaf_p (btp); bf = dp->d_ops->data_bestfree_p (hdr); ents = dp->d_ops->leaf_ents_p (leaf);
@@ -443,7 +444,7 @@ xfs_dir2_block_to_leaf(*/ xfs_dir2_data_make_free (tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), - (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), &needlog, &needscan);/*
@@ -461,7 +462,7 @@ xfs_dir2_block_to_leaf(/* * Set up leaf tail and bests table. */ - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf); ltp->bestcount =cpu_to_be32 (1 ); bestsp =xfs_dir2_leaf_bests_p (ltp); bestsp[0 ] = bf[0 ].length;
@@ -653,7 +654,7 @@ xfs_dir2_leaf_addname(*/ index =xfs_dir2_leaf_search_hash (args, lbp); leaf = lbp->b_addr; - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf); ents = dp->d_ops->leaf_ents_p (leaf); dp->d_ops->leaf_hdr_from_disk (&leafhdr, leaf); bestsp =xfs_dir2_leaf_bests_p (ltp);
@@ -1066,7 +1067,7 @@ xfs_dir3_leaf_log_bests(ASSERT (leaf->hdr.info.magic ==cpu_to_be16 (XFS_DIR2_LEAF1_MAGIC ) || leaf->hdr.info.magic ==cpu_to_be16 (XFS_DIR3_LEAF1_MAGIC )); - ltp =xfs_dir2_leaf_tail_p (tp->t_mountp, leaf); + ltp =xfs_dir2_leaf_tail_p (tp->t_mountp->m_dir_geo, leaf); firstb =xfs_dir2_leaf_bests_p (ltp) + first; lastb =xfs_dir2_leaf_bests_p (ltp) + last; xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf),
@@ -1138,9 +1139,9 @@ xfs_dir3_leaf_log_tail( leaf->hdr.info.magic ==cpu_to_be16 (XFS_DIR2_LEAFN_MAGIC ) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (mp->m_dir_geo, leaf);xfs_trans_log_buf (tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dirblksize -1 )); + (uint)(mp->m_dir_geo->blksize -1 )); }/*
@@ -1388,7 +1389,7 @@ xfs_dir2_leaf_removename( xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog =0 ; oldbest =be16_to_cpu (bf[0 ].length); - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf); bestsp =xfs_dir2_leaf_bests_p (ltp);ASSERT (be16_to_cpu (bestsp[db]) == oldbest);/*
@@ -1428,7 +1429,7 @@ xfs_dir2_leaf_removename(* If the data block is now empty then get rid of the data block. */ if (be16_to_cpu (bf[0 ].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset) { + args->geo->blksize - dp->d_ops->data_entry_offset) {ASSERT (db != args->geo->datablk);if ((error =xfs_dir2_shrink_inode (args, db, dbp))) {/*
@@ -1618,7 +1619,7 @@ xfs_dir2_leaf_trim_data(return error; leaf = lbp->b_addr; - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf);#ifdef DEBUG {
@@ -1628,7 +1629,7 @@ xfs_dir2_leaf_trim_data(ASSERT (hdr->magic ==cpu_to_be32 (XFS_DIR2_DATA_MAGIC ) || hdr->magic ==cpu_to_be32 (XFS_DIR3_DATA_MAGIC ));ASSERT (be16_to_cpu (bf[0 ].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset); + args->geo->blksize - dp->d_ops->data_entry_offset); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); }#endif
@@ -1740,7 +1741,7 @@ xfs_dir2_node_to_leaf(/* * If it's not the single leaf block, give up. */ -if (XFS_FSB_TO_B (mp, fo) >XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) +if (XFS_FSB_TO_B (mp, fo) >XFS_DIR2_LEAF_OFFSET + args->geo->blksize)return 0 ; lbp = state->path.blk[0 ].bp; leaf = lbp->b_addr;
@@ -1764,7 +1765,7 @@ xfs_dir2_node_to_leaf(* Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ -if (xfs_dir3_leaf_size (&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { +if (xfs_dir3_leaf_size (&leafhdr, freehdr.nvalid) > args->geo->blksize) {xfs_trans_brelse (tp, fbp);return 0 ; }
@@ -1784,7 +1785,7 @@ xfs_dir2_node_to_leaf(/* * Set up the leaf tail from the freespace block. */ - ltp =xfs_dir2_leaf_tail_p (mp, leaf); + ltp =xfs_dir2_leaf_tail_p (args->geo, leaf); ltp->bestcount =cpu_to_be32 (freehdr.nvalid);/*
fs/xfs/xfs_dir2_node.c +22 -20
153 lines not on this page · raw message
fs/xfs/xfs_dir2_priv.h +4 -4
@@ -140,17 +140,17 @@ xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da)* Directory tail pointer accessor functions. Based on block geometry. */ static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p (struct xfs_mount *mp,struct xfs_dir2_data_hdr *hdr) +xfs_dir2_block_tail_p (struct xfs_da_geometry *geo,struct xfs_dir2_data_hdr *hdr) {return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) -1 ; + ((char *)hdr + geo->blksize)) -1 ; }static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p (struct xfs_mount *mp,struct xfs_dir2_leaf *lp) +xfs_dir2_leaf_tail_p (struct xfs_da_geometry *geo,struct xfs_dir2_leaf *lp) {return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - + ((char *)lp + geo->blksize -sizeof (struct xfs_dir2_leaf_tail )); }
fs/xfs/xfs_dir2_readdir.c +5 -6
@@ -216,7 +216,7 @@ xfs_dir2_block_getdents(/* * Set up values for the loop. */ - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (geo, hdr); ptr = (char *)dp->d_ops->data_entry_p (hdr); endptr = (char *)xfs_dir2_block_leaf_p (btp);
@@ -338,7 +338,7 @@ xfs_dir2_leaf_readbuf(/* * Recalculate the readahead blocks wanted. */ - mip->ra_want =howmany (bufsize + mp->m_dirblksize, + mip->ra_want =howmany (bufsize + geo->blksize, mp->m_sb.sb_blocksize) -1 ;ASSERT (mip->ra_want >=0 );
@@ -526,8 +526,7 @@ xfs_dir2_leaf_getdents(* buffer size, the directory block size, and the filesystem * block size. */ - length =howmany (bufsize + mp->m_dirblksize, - mp->m_sb.sb_blocksize); + length =howmany (bufsize + geo->blksize, mp->m_sb.sb_blocksize); map_info =kmem_zalloc (offsetof(struct xfs_dir2_leaf_map_info , map) + (length *sizeof (struct xfs_bmbt_irec )),KM_SLEEP |KM_NOFS );
@@ -557,7 +556,7 @@ xfs_dir2_leaf_getdents(* If we have no buffer, or we're off the end of the * current buffer, need to get another one. */ -if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { +if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { error =xfs_dir2_leaf_readbuf (dp, bufsize, map_info, &curoff, &bp);
@@ -618,7 +617,7 @@ xfs_dir2_leaf_getdents(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) { +if (ptr >= (char *)hdr + geo->blksize) {continue ; } }
fs/xfs/xfs_dir2_sf.c +8 -6
@@ -82,8 +82,10 @@ xfs_dir2_block_sfsize(xfs_ino_t parent =0 ;/* parent inode number */ int size=0 ;/* total computed size */ int has_ftype; +struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo;/* * if there is a filetype field, add the extra byte to the namelen
@@ -92,7 +94,7 @@ xfs_dir2_block_sfsize( has_ftype =xfs_sb_version_hasftype (&mp->m_sb) ?1 :0 ; count = i8count = namelen =0 ; - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (geo, hdr); blp =xfs_dir2_block_leaf_p (btp);/*
@@ -105,7 +107,7 @@ xfs_dir2_block_sfsize(* Calculate the pointer to the entry at hand. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + -xfs_dir2_dataptr_to_off (mp->m_dir_geo, addr)); +xfs_dir2_dataptr_to_off (geo, addr));/* * Detect . and .., so we can special-case them. * . is not included in sf directories.
@@ -195,7 +197,7 @@ xfs_dir2_block_to_sf(/* * Set up to loop over the block's entries. */ - btp =xfs_dir2_block_tail_p (mp, hdr); + btp =xfs_dir2_block_tail_p (args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p (hdr); endptr = (char *)xfs_dir2_block_leaf_p (btp); sfep =xfs_dir2_sf_firstentry (sfp);
@@ -586,7 +588,7 @@ xfs_dir2_sf_addname_pick(* we'll go back, convert to block, then try the insert and convert * to leaf. */ -if (used + (holefit ?0 : size) > mp->m_dirblksize) +if (used + (holefit ?0 : size) > args->geo->blksize)return 0 ;/* * If changing the inode number size, do it the hard way.
@@ -601,7 +603,7 @@ xfs_dir2_sf_addname_pick(/* * If it won't fit at the end then do it the hard way (use the hole). */ -if (used + size > mp->m_dirblksize) +if (used + size > args->geo->blksize)return 2 ;/* * Do it the easy way.
@@ -652,7 +654,7 @@ xfs_dir2_sf_check(ASSERT ((char *)sfep - (char *)sfp == dp->i_d.di_size);ASSERT (offset + (sfp->count +2 ) * (uint )sizeof (xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); }#endif /* DEBUG */
fs/xfs/xfs_fsops.c +3 -1
@@ -24,6 +24,8 @@#include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h"
@@ -105,7 +107,7 @@ xfs_fs_geometry( geo->logsectsize =xfs_sb_version_hassector (&mp->m_sb) ? mp->m_sb.sb_logsectsize :BBSIZE ; geo->rtsectsize = mp->m_sb.sb_blocksize; - geo->dirblocksize = mp->m_dirblksize; + geo->dirblocksize = mp->m_dir_geo->blksize; }if (new_version >=4 ) { geo->flags |=
fs/xfs/xfs_mount.h +0 -1
@@ -154,7 +154,6 @@ typedef struct xfs_mount {const struct xfs_nameops *m_dirnameops;/* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops;/* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops;/* !dir inode ops */ -int m_dirblksize;/* directory block sz--bytes */ uint m_chsize;/* size of next field */ atomic_t m_active_trans;/* number trans frozen */ #ifdef HAVE_PERCPU_SB
fs/xfs/xfs_trans_resv.c +1 -1
@@ -610,7 +610,7 @@ xfs_calc_addafork_reservation(return XFS_DQUOT_LOGRES (mp) +xfs_calc_inode_res (mp,1 ) +xfs_calc_buf_res (2 , mp->m_sb.sb_sectsize) + -xfs_calc_buf_res (1 , mp->m_dirblksize) + +xfs_calc_buf_res (1 , mp->m_dir_geo->blksize) +xfs_calc_buf_res (XFS_DAENTER_BMAP1B (mp,XFS_DATA_FORK ) +1 ,XFS_FSB_TO_B (mp,1 )) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1),
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 10/16 xfs: convert dir/attr btree threshold to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_dir2.c | 2 -- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_mount.h | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-)
fs/xfs/xfs_attr_leaf.c +1 -1
@@ -1949,7 +1949,7 @@ xfs_attr3_leaf_remove( tmp = ichdr.usedbytes +xfs_attr3_leaf_hdr_size (leaf) + ichdr.count *sizeof (xfs_attr_leaf_entry_t); -return tmp < mp->m_attr_magicpct;/* leaf is < 37% full */ +return tmp < args->geo->magicpct;/* leaf is < 37% full */ }/*
fs/xfs/xfs_dir2.c +0 -2
@@ -146,9 +146,7 @@ xfs_da_mount(/* XXX: these are to be removed as code is converted to use geo */ mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; - mp->m_attr_magicpct = mp->m_attr_geo->magicpct;return 0 ; }
fs/xfs/xfs_dir2_node.c +1 -1
@@ -1312,7 +1312,7 @@ xfs_dir2_leafn_remove(*/ *rval = (dp->d_ops->leaf_hdr_size + (uint )sizeof (ents[0 ]) * (leafhdr.count - leafhdr.stale)) < - mp->m_dir_magicpct; + args->geo->magicpct;return 0 ; }
fs/xfs/xfs_mount.h +0 -2
@@ -148,8 +148,6 @@ typedef struct xfs_mount {int m_dalign;/* stripe unit */ int m_swidth;/* stripe width */ int m_sinoalign;/* stripe unit inode alignment */ -int m_attr_magicpct;/* 37% of the blocksize */ -int m_dir_magicpct;/* 37% of the dir blocksize */ __uint8_t m_sectbb_log;/* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops;/* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops;/* vector of dir inode ops */
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 11/16 xfs: move node entry counts to xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_attr.c | 8 ++++---- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_dir2.c | 3 --- fs/xfs/xfs_dir2_node.c | 10 +++++----- fs/xfs/xfs_mount.h | 2 -- 5 files changed, 11 insertions(+), 16 deletions(-)
fs/xfs/xfs_attr.c +4 -4
@@ -899,7 +899,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents;/* * Search to see if name already exists, and get back a pointer
@@ -1078,7 +1078,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; state->inleaf =0 ; error =xfs_da3_node_lookup_int (state, &retval);if (error)
@@ -1170,7 +1170,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state->args = args; state->mp = dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it.
@@ -1433,7 +1433,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state->args = args; state->mp = args->dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it.
fs/xfs/xfs_da_btree.c +2 -2
@@ -167,8 +167,8 @@ xfs_da3_node_verify(* we don't know if the node is for and attribute or directory tree, * so only fail if the count is outside both bounds */ -if (ichdr.count > mp->m_dir_node_ents && - ichdr.count > mp->m_attr_node_ents) +if (ichdr.count > mp->m_dir_geo->node_ents && + ichdr.count > mp->m_attr_geo->node_ents)return false;/* XXX: hash order check? */
fs/xfs/xfs_dir2.c +0 -3
@@ -144,9 +144,6 @@ xfs_da_mount(else mp->m_dirnameops = &xfs_default_nameops; -/* XXX: these are to be removed as code is converted to use geo */ - mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_attr_node_ents = mp->m_attr_geo->node_ents;return 0 ; }
fs/xfs/xfs_dir2_node.c +5 -5
@@ -1596,8 +1596,8 @@ xfs_dir2_node_addname( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->blocksize = args->geo->blksize; + state->node_ents = args->geo->node_ents;/* * Look up the name. We're not supposed to find it, but * this gives us the insertion point.
@@ -2043,7 +2043,7 @@ xfs_dir2_node_lookup( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents;/* * Fill in the path to the entry in the cursor. */
@@ -2098,7 +2098,7 @@ xfs_dir2_node_removename( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents;/* Look up the entry we're deleting, set up the cursor. */ error =xfs_da3_node_lookup_int (state, &rval);
@@ -2168,7 +2168,7 @@ xfs_dir2_node_replace( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; inum = args->inumber;/* * Lookup the entry to change in the btree.
fs/xfs/xfs_mount.h +0 -2
@@ -134,8 +134,6 @@ typedef struct xfs_mount {int m_fixedfsid[2 ];/* unchanged for life of FS */ uint m_dmevmask;/* DMI events for this FS */ __uint64_t m_flags;/* global mount flags */ -uint m_dir_node_ents;/* #entries in a dir danode */ -uint m_attr_node_ents;/* #entries in attr danode */ int m_ialloc_inos;/* inodes in inode allocation */ int m_ialloc_blks;/* blocks in inode allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 12/16 xfs: reduce direct usage of mp->m_dir_geo
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
There are many places in the directory code were we don't pass the args into and so have to extract the geometry direct from the mount structure. Push the args or the geometry into these leaf functions so that we don't need to grab it from the struct xfs_mount.
This, in turn, brings use to the point where directory geometry is no longer a property of the struct xfs_mount; it is not a global property anymore, and hence we can start to consider per-directory configuration of physical geometries.
Start by converting the xfs_dir_isblock/leaf code - pass in the xfs_da_args and convert the readdir code to use xfs_da_args like the rest of the directory code to pass information around.
--- fs/xfs/xfs_dir2.c | 50 +++++++++++++--------------- fs/xfs/xfs_dir2.h | 4 +-- fs/xfs/xfs_dir2_readdir.c | 85 ++++++++++++++++++++++------------------------- 3 files changed, 65 insertions(+), 74 deletions(-)
fs/xfs/xfs_dir2.c +23 -27
@@ -282,7 +282,7 @@ xfs_dir_createname( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {
@@ -290,7 +290,7 @@ xfs_dir_createname( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)
@@ -375,7 +375,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {
@@ -383,7 +383,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)
@@ -448,7 +448,7 @@ xfs_dir_removename( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {
@@ -456,7 +456,7 @@ xfs_dir_removename( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)
@@ -513,7 +513,7 @@ xfs_dir_replace( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {
@@ -521,7 +521,7 @@ xfs_dir_replace( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)
@@ -573,7 +573,7 @@ xfs_dir_canenter( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {
@@ -581,7 +581,7 @@ xfs_dir_canenter( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)
@@ -649,18 +649,16 @@ xfs_dir2_grow_inode(*/ int xfs_dir2_isblock ( -xfs_inode_t *dp, -int *vp)/* out: 1 is block, 0 is not block */ +struct xfs_da_args *args, +int *vp)/* out: 1 is block, 0 is not block */ { -xfs_fileoff_t last;/* last file offset */ -xfs_mount_t *mp; -int rval; +xfs_fileoff_t last;/* last file offset */ +int rval; - mp = dp->i_mount; -if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK ))) +if ((rval =xfs_bmap_last_offset (args->dp, &last,XFS_DATA_FORK )))return rval; - rval =XFS_FSB_TO_B (mp, last) == mp->m_dir_geo->blksize; -ASSERT (rval ==0 || dp->i_d.di_size == mp->m_dir_geo->blksize); + rval =XFS_FSB_TO_B (args->dp->i_mount, last) == args->geo->blksize; +ASSERT (rval ==0 || args->dp->i_d.di_size == args->geo->blksize); *vp = rval;return 0 ; }
@@ -670,17 +668,15 @@ xfs_dir2_isblock(*/ int xfs_dir2_isleaf ( -xfs_inode_t *dp, -int *vp)/* out: 1 is leaf, 0 is not leaf */ +struct xfs_da_args *args, +int *vp)/* out: 1 is block, 0 is not block */ { -xfs_fileoff_t last;/* last file offset */ -xfs_mount_t *mp; -int rval; +xfs_fileoff_t last;/* last file offset */ +int rval; - mp = dp->i_mount; -if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK ))) +if ((rval =xfs_bmap_last_offset (args->dp, &last,XFS_DATA_FORK )))return rval; - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == args->geo->leafblk + args->geo->fsbcount;return 0 ; }
fs/xfs/xfs_dir2.h +2 -2
@@ -146,8 +146,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args);/* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock (struct xfs_inode *dp,int *r); -extern int xfs_dir2_isleaf (struct xfs_inode *dp,int *r); +extern int xfs_dir2_isblock (struct xfs_da_args *args,int *r); +extern int xfs_dir2_isleaf (struct xfs_da_args *args,int *r);extern int xfs_dir2_shrink_inode (struct xfs_da_args *args,xfs_dir2_db_t db,struct xfs_buf *bp);
fs/xfs/xfs_dir2_readdir.c +40 -45
255 lines not on this page · raw message
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo
Quoted 12 lines · Dave Chinner
From: Dave Chinner <[email protected]>
There are many places in the directory code were we don't pass the args into and so have to extract the geometry direct from the mount structure. Push the args or the geometry into these leaf functions so that we don't need to grab it from the struct
xfs_mount.This, in turn, brings use to the point where directory geometry is no longer a property of the struct
xfs_mount; it is not a global property anymore, and hence we can start to consider per-directory configuration of physical geometries.
Quoted 6 lines
Start by converting the xfs_dir_isblock/leaf code - pass in the
xfs_da_argsand convert the readdir code to usexfs_da_argslike the rest of the directory code to pass information around.Signed-off-by Dave Chinner <[email protected]>---
Quoted 449 lines
fs/xfs/xfs_dir2.c | 50 +++++++++++++--------------- fs/xfs/xfs_dir2.h | 4 +-- fs/xfs/xfs_dir2_readdir.c | 85 ++++++++++++++++++++++------------------------- 3 files changed, 65 insertions(+), 74 deletions(-)fs/xfs/xfs_dir2.c +23
-27@@ -282,7 +282,7 @@ xfs_dir_createname( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {@@ -290,7 +290,7 @@ xfs_dir_createname( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)@@ -375,7 +375,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {@@ -383,7 +383,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)@@ -448,7 +448,7 @@ xfs_dir_removename( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {@@ -456,7 +456,7 @@ xfs_dir_removename( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)@@ -513,7 +513,7 @@ xfs_dir_replace( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {@@ -521,7 +521,7 @@ xfs_dir_replace( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)@@ -573,7 +573,7 @@ xfs_dir_canenter( goto out_free; } - rval =xfs_dir2_isblock (dp, &v); + rval =xfs_dir2_isblock (args, &v);if (rval) goto out_free;if (v) {@@ -581,7 +581,7 @@ xfs_dir_canenter( goto out_free; } - rval =xfs_dir2_isleaf (dp, &v); + rval =xfs_dir2_isleaf (args, &v);if (rval) goto out_free;if (v)@@ -649,18 +649,16 @@ xfs_dir2_grow_inode(*/ int xfs_dir2_isblock ( -xfs_inode_t *dp, -int *vp)/* out: 1 is block, 0 is not block */ +struct xfs_da_args *args, +int *vp)/* out: 1 is block, 0 is not block */ { -xfs_fileoff_t last;/* last file offset */ -xfs_mount_t *mp; -int rval; +xfs_fileoff_t last;/* last file offset */ +int rval; - mp = dp->i_mount; -if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK ))) +if ((rval =xfs_bmap_last_offset (args->dp, &last,XFS_DATA_FORK )))return rval; - rval =XFS_FSB_TO_B (mp, last) == mp->m_dir_geo->blksize; -ASSERT (rval ==0 || dp->i_d.di_size == mp->m_dir_geo->blksize); + rval =XFS_FSB_TO_B (args->dp->i_mount, last) == args->geo->blksize; +ASSERT (rval ==0 || args->dp->i_d.di_size == args->geo->blksize); *vp = rval;return 0 ; }@@ -670,17 +668,15 @@ xfs_dir2_isblock(*/ int xfs_dir2_isleaf ( -xfs_inode_t *dp, -int *vp)/* out: 1 is leaf, 0 is not leaf */ +struct xfs_da_args *args, +int *vp)/* out: 1 is block, 0 is not block */ { -xfs_fileoff_t last;/* last file offset */ -xfs_mount_t *mp; -int rval; +xfs_fileoff_t last;/* last file offset */ +int rval; - mp = dp->i_mount; -if ((rval =xfs_bmap_last_offset (dp, &last,XFS_DATA_FORK ))) +if ((rval =xfs_bmap_last_offset (args->dp, &last,XFS_DATA_FORK )))return rval; - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == args->geo->leafblk + args->geo->fsbcount;return 0 ; }fs/xfs/xfs_dir2.h +2
-2@@ -146,8 +146,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args);/* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock (struct xfs_inode *dp,int *r); -extern int xfs_dir2_isleaf (struct xfs_inode *dp,int *r); +extern int xfs_dir2_isblock (struct xfs_da_args *args,int *r); +extern int xfs_dir2_isleaf (struct xfs_da_args *args,int *r);extern int xfs_dir2_shrink_inode (struct xfs_da_args *args,xfs_dir2_db_t db,struct xfs_buf *bp);fs/xfs/xfs_dir2_readdir.c +40
-45@@ -76,28 +76,25 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { STATIC intxfs_dir2_sf_getdents ( -xfs_inode_t *dp,/* incore directory inode */ +struct xfs_da_args *args,struct dir_context *ctx) {int i;/* shortform entry number */ -xfs_mount_t *mp;/* filesystem mount point */ +struct xfs_inode *dp = args->dp;/* incore directory inode */ xfs_dir2_dataptr_t off;/* current entry's offset */ xfs_dir2_sf_entry_t *sfep;/* shortform directory entry */ xfs_dir2_sf_hdr_t *sfp;/* shortform structure */ 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; +struct xfs_da_geometry *geo = args->geo;ASSERT (dp->i_df.if_flags &XFS_IFINLINE );/* * Give up if the directory is way too short. */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t , parent)) { -ASSERT (XFS_FORCED_SHUTDOWN (mp)); +ASSERT (XFS_FORCED_SHUTDOWN (dp->i_mount));return XFS_ERROR (EIO ); }@@ -163,13 +160,13 @@ xfs_dir2_sf_getdents( filetype = dp->d_ops->sf_get_ftype (sfep); ctx->pos = off &0x7fffffff ;if (!dir_emit (ctx, (char *)sfep->name, sfep->namelen, ino, -xfs_dir3_get_dtype (mp, filetype))) +xfs_dir3_get_dtype (dp->i_mount, filetype)))return 0 ; sfep = dp->d_ops->sf_nextentry (sfp, sfep); } ctx->pos =xfs_dir2_db_off_to_dataptr (geo, geo->datablk +1 ,0 ) & -0x7fffffff ; +0x7fffffff ;return 0 ; }@@ -178,9 +175,10 @@ xfs_dir2_sf_getdents(*/ STATIC intxfs_dir2_block_getdents ( -xfs_inode_t *dp,/* incore inode */ +struct xfs_da_args *args,struct dir_context *ctx) { +struct xfs_inode *dp = args->dp;/* incore directory inode */ xfs_dir2_data_hdr_t *hdr;/* block header */ struct xfs_buf *bp;/* buffer for block */ xfs_dir2_block_tail_t *btp;/* block tail */ @@ -188,14 +186,11 @@ xfs_dir2_block_getdents(xfs_dir2_data_unused_t *dup;/* block unused entry */ char *endptr;/* end of the data entries */ int error;/* error return value */ -xfs_mount_t *mp;/* filesystem mount point */ char *ptr;/* current data entry */ int wantoff;/* starting block offset */ xfs_off_t cook; -struct xfs_da_geometry *geo; +struct xfs_da_geometry *geo = args->geo; - mp = dp->i_mount; - geo = mp->m_dir_geo;/* * If the block number in the offset is out of range, we're done. */ @@ -258,7 +253,7 @@ xfs_dir2_block_getdents(*/ if (!dir_emit (ctx, (char *)dep->name, dep->namelen,be64_to_cpu (dep->inumber), -xfs_dir3_get_dtype (mp, filetype))) { +xfs_dir3_get_dtype (dp->i_mount, filetype))) {xfs_trans_brelse (NULL , bp);return 0 ; }@@ -269,7 +264,7 @@ xfs_dir2_block_getdents(* Set the offset to a non-existent block 1 and return. */ ctx->pos =xfs_dir2_db_off_to_dataptr (geo, geo->datablk +1 ,0 ) & -0x7fffffff ; +0x7fffffff ;xfs_trans_brelse (NULL , bp);return 0 ; }@@ -290,13 +285,13 @@ struct xfs_dir2_leaf_map_info { STATIC intxfs_dir2_leaf_readbuf ( -struct xfs_inode *dp, +struct xfs_da_args *args,size_t bufsize,struct xfs_dir2_leaf_map_info *mip,xfs_dir2_off_t *curoff,struct xfs_buf **bpp) { -struct xfs_mount *mp = dp->i_mount; +struct xfs_inode *dp = args->dp;struct xfs_buf *bp = *bpp;struct xfs_bmbt_irec *map = mip->map;struct blk_plug plug;@@ -304,7 +299,7 @@ xfs_dir2_leaf_readbuf(int length;int i;int j; -struct xfs_da_geometry *geo = mp->m_dir_geo; +struct xfs_da_geometry *geo = args->geo;/* * If we have a buffer, we need to release it and @@ -338,8 +333,7 @@ xfs_dir2_leaf_readbuf(/* * Recalculate the readahead blocks wanted. */ - mip->ra_want =howmany (bufsize + geo->blksize, - mp->m_sb.sb_blocksize) -1 ; + mip->ra_want =howmany (bufsize + geo->blksize, (1 << geo->fsblog)) -1 ;ASSERT (mip->ra_want >=0 );/* @@ -411,8 +405,8 @@ xfs_dir2_leaf_readbuf( mip->curdb =xfs_dir2_da_to_db (geo, map->br_startoff); error =xfs_dir3_data_read (NULL , dp, map->br_startoff, map->br_blockcount >= geo->fsbcount ? -XFS_FSB_TO_DADDR (mp, map->br_startblock) :-1 , &bp); - +XFS_FSB_TO_DADDR (dp->i_mount, map->br_startblock) : +-1 , &bp);/* * Should just skip over the data block instead of giving up. */ @@ -441,7 +435,7 @@ xfs_dir2_leaf_readbuf( 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, +XFS_FSB_TO_DADDR (dp->i_mount, map[mip->ra_index].br_startblock + mip->ra_offset)); mip->ra_current = i;@@ -493,23 +487,23 @@ out:*/ STATIC intxfs_dir2_leaf_getdents ( -xfs_inode_t *dp,/* incore directory inode */ +struct xfs_da_args *args,struct dir_context *ctx,size_t bufsize) { +struct xfs_inode *dp = args->dp;struct xfs_buf *bp =NULL ;/* data block buffer */ 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 */ int error =0 ;/* error return value */ int length;/* temporary length value */ -xfs_mount_t *mp;/* filesystem mount point */ int byteoff;/* offset in current block */ xfs_dir2_off_t curoff;/* current overall offset */ 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; +struct xfs_da_geometry *geo = args->geo;/* * If the offset is at or past the largest allowed value, @@ -518,15 +512,12 @@ xfs_dir2_leaf_getdents(if (ctx->pos >=XFS_DIR2_MAX_DATAPTR )return 0 ; - mp = dp->i_mount; - geo = mp->m_dir_geo; -/* * Set up to bmap a number of blocks based on the caller's * buffer size, the directory block size, and the filesystem * block size. */ - length =howmany (bufsize + geo->blksize, mp->m_sb.sb_blocksize); + length =howmany (bufsize + geo->blksize, (1 << geo->fsblog)); map_info =kmem_zalloc (offsetof(struct xfs_dir2_leaf_map_info , map) + (length *sizeof (struct xfs_bmbt_irec )),KM_SLEEP |KM_NOFS );@@ -558,7 +549,7 @@ xfs_dir2_leaf_getdents(*/ if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { - error =xfs_dir2_leaf_readbuf (dp, bufsize, map_info, + error =xfs_dir2_leaf_readbuf (args, bufsize, map_info, &curoff, &bp);if (error || !map_info->map_valid)break ;@@ -566,7 +557,7 @@ xfs_dir2_leaf_getdents(/* * Having done a read, we need to set a new offset. */ - newoff =xfs_dir2_db_off_to_byte (mp->m_dir_geo, + newoff =xfs_dir2_db_off_to_byte (geo, map_info->curdb,0 );/* * Start of the current block. @@ -585,7 +576,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->m_dir_geo, curoff); + byteoff =xfs_dir2_byte_to_off (geo, curoff);/* * Skip past the header. */ @@ -644,7 +635,7 @@ xfs_dir2_leaf_getdents( 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))) +xfs_dir3_get_dtype (dp->i_mount, filetype)))break ;/* @@ -674,13 +665,14 @@ xfs_dir2_leaf_getdents(*/ int xfs_readdir ( -xfs_inode_t *dp, -struct dir_context *ctx, -size_t bufsize) +struct xfs_inode *dp, +struct dir_context *ctx, +size_t bufsize) { -int rval;/* return value */ -int v;/* type-checking value */ -uint lock_mode; +struct xfs_da_args args = {0 }; +int rval; +int v; +uint lock_mode;trace_xfs_readdir (dp);@@ -690,15 +682,18 @@ xfs_readdir(ASSERT (S_ISDIR (dp->i_d.di_mode));XFS_STATS_INC (xs_dir_getdents); + args.dp = dp; + args.geo = dp->i_mount->m_dir_geo; + 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 (dp, &v))) + rval =xfs_dir2_sf_getdents (&args, ctx); +else if ((rval =xfs_dir2_isblock (&args, &v))) ;else if (v) - rval =xfs_dir2_block_getdents (dp, ctx); + rval =xfs_dir2_block_getdents (&args, ctx);else - rval =xfs_dir2_leaf_getdents (dp, ctx, bufsize); + rval =xfs_dir2_leaf_getdents (&args, ctx, bufsize);xfs_iunlock (dp, lock_mode);return rval;Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 13/16 xfs: remove mp->m_dir_geo from directory logging
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
We don't pass the xfs_da_args or the geometry all the way down to the directory buffer logging code, hence we have to use mp->m_dir_geo here. Fix this to use the geometry passed via the xfs_da_args, and convert all the directory logging functions for consistency.
--- fs/xfs/xfs_dir2.h | 12 +++--- fs/xfs/xfs_dir2_block.c | 39 +++++++++--------- fs/xfs/xfs_dir2_data.c | 59 ++++++++++++--------------- fs/xfs/xfs_dir2_leaf.c | 103 +++++++++++++++++++++++++----------------------- fs/xfs/xfs_dir2_node.c | 68 +++++++++++++++----------------- fs/xfs/xfs_dir2_priv.h | 4 +- 6 files changed, 137 insertions(+), 148 deletions(-)
fs/xfs/xfs_dir2.h +6 -6
@@ -153,16 +153,16 @@ extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db,extern void xfs_dir2_data_freescan (struct xfs_inode *dp,struct xfs_dir2_data_hdr *hdr,int *loghead); -extern void xfs_dir2_data_log_entry (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir2_data_log_entry (struct xfs_da_args *args,struct xfs_buf *bp,struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir2_data_log_header (struct xfs_da_args *args,struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused (struct xfs_trans *tp,struct xfs_buf *bp, -struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir2_data_log_unused (struct xfs_da_args *args, +struct xfs_buf *bp,struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free (struct xfs_da_args *args,struct xfs_buf *bp,xfs_dir2_data_aoff_t offset,xfs_dir2_data_aoff_t len,int *needlogp,int *needscanp); -extern void xfs_dir2_data_use_free (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir2_data_use_free (struct xfs_da_args *args,struct xfs_buf *bp,struct xfs_dir2_data_unused *dup,xfs_dir2_data_aoff_t offset,xfs_dir2_data_aoff_t len,int *needlogp,int *needscanp);
fs/xfs/xfs_dir2_block.c +19 -20
@@ -281,8 +281,7 @@ out:*/ static void xfs_dir2_block_compact( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp,
@@ -315,7 +314,7 @@ xfs_dir2_block_compact( *lfloglow = toidx +1 - (be32_to_cpu (btp->stale) -1 ); *lfloghigh -=be32_to_cpu (btp->stale) -1 ;be32_add_cpu (&btp->count, -(be32_to_cpu (btp->stale) -1 )); -xfs_dir2_data_make_free (tp, dp, bp, +xfs_dir2_data_make_free (args, bp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((be32_to_cpu (btp->stale) -1 ) *sizeof (*blp)), needlog, &needscan);
@@ -325,7 +324,7 @@ xfs_dir2_block_compact(* This needs to happen before the next call to use_free. */ if (needscan) -xfs_dir2_data_freescan (dp, hdr, needlog); +xfs_dir2_data_freescan (args->dp, hdr, needlog); }/*
@@ -420,7 +419,7 @@ xfs_dir2_block_addname(* If need to compact the leaf entries, do it now. */ if (compact) { -xfs_dir2_block_compact (tp, dp, bp, hdr, btp, blp, &needlog, +xfs_dir2_block_compact (args, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow);/* recalculate blp post-compaction */ blp =xfs_dir2_block_leaf_p (btp);
@@ -455,7 +454,7 @@ xfs_dir2_block_addname(/* * Mark the space needed for the new leaf entry, now in use. */ - xfs_dir2_data_use_free(tp, dp, bp, enddup, + xfs_dir2_data_use_free(args, bp, enddup, (xfs_dir2_data_aoff_t) ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)),
@@ -542,7 +541,7 @@ xfs_dir2_block_addname(/* * Mark space for the data entry used. */ -xfs_dir2_data_use_free (tp, dp, bp, dup, +xfs_dir2_data_use_free (args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t )len, &needlog, &needscan);/*
@@ -560,9 +559,9 @@ xfs_dir2_block_addname(if (needscan)xfs_dir2_data_freescan (dp, hdr, &needlog);if (needlog) -xfs_dir2_data_log_header (tp, dp, bp); +xfs_dir2_data_log_header (args, bp);xfs_dir2_block_log_tail (tp, bp); -xfs_dir2_data_log_entry (tp, dp, bp, dep); +xfs_dir2_data_log_entry (args, bp, dep);xfs_dir3_data_check (dp, bp);return 0 ; }
@@ -803,7 +802,7 @@ xfs_dir2_block_removename(* Mark the data entry's space free. */ needlog = needscan =0 ; -xfs_dir2_data_make_free (tp, dp, bp, +xfs_dir2_data_make_free (args, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize (dep->namelen), &needlog, &needscan);/*
@@ -822,7 +821,7 @@ xfs_dir2_block_removename(if (needscan)xfs_dir2_data_freescan (dp, hdr, &needlog);if (needlog) -xfs_dir2_data_log_header (tp, dp, bp); +xfs_dir2_data_log_header (args, bp);xfs_dir3_data_check (dp, bp);/* * See if the size as a shortform is good enough.
@@ -881,7 +880,7 @@ xfs_dir2_block_replace(*/ dep->inumber =cpu_to_be64 (args->inumber); dp->d_ops->data_put_ftype (dep, args->filetype); -xfs_dir2_data_log_entry (args->trans, dp, bp, dep); +xfs_dir2_data_log_entry (args, bp, dep);xfs_dir3_data_check (dp, bp);return 0 ; }
@@ -1004,7 +1003,7 @@ xfs_dir2_leaf_to_block(/* * Use up the space at the end of the block (blp/btp). */ -xfs_dir2_data_use_free (tp, dp, dbp, dup, args->geo->blksize - size, size, +xfs_dir2_data_use_free (args, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan);/* * Initialize the block tail.
@@ -1030,7 +1029,7 @@ xfs_dir2_leaf_to_block(if (needscan)xfs_dir2_data_freescan (dp, hdr, &needlog);if (needlog) -xfs_dir2_data_log_header (tp, dp, dbp); +xfs_dir2_data_log_header (args, dbp);/* * Pitch the old leaf block. */
@@ -1143,7 +1142,7 @@ xfs_dir2_sf_to_block(*/ dup = dp->d_ops->data_unused_p (hdr); needlog = needscan =0 ; -xfs_dir2_data_use_free (tp, dp, bp, dup, args->geo->blksize - i, +xfs_dir2_data_use_free (args, bp, dup, args->geo->blksize - i, i, &needlog, &needscan);ASSERT (needscan ==0 );/*
@@ -1157,7 +1156,7 @@ xfs_dir2_sf_to_block(/* * Remove the freespace, we'll manage it. */ -xfs_dir2_data_use_free (tp, dp, bp, dup, +xfs_dir2_data_use_free (args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),be16_to_cpu (dup->length), &needlog, &needscan);/*
@@ -1170,7 +1169,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype (dep,XFS_DIR3_FT_DIR ); tagp = dp->d_ops->data_entry_tag_p (dep); *tagp =cpu_to_be16 ((char *)dep - (char *)hdr); -xfs_dir2_data_log_entry (tp, dp, bp, dep); +xfs_dir2_data_log_entry (args, bp, dep); blp[0 ].hashval =cpu_to_be32 (xfs_dir_hash_dot); blp[0 ].address =cpu_to_be32 (xfs_dir2_byte_to_dataptr ( (char *)dep - (char *)hdr));
@@ -1184,7 +1183,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype (dep,XFS_DIR3_FT_DIR ); tagp = dp->d_ops->data_entry_tag_p (dep); *tagp =cpu_to_be16 ((char *)dep - (char *)hdr); -xfs_dir2_data_log_entry (tp, dp, bp, dep); +xfs_dir2_data_log_entry (args, bp, dep); blp[1 ].hashval =cpu_to_be32 (xfs_dir_hash_dotdot); blp[1 ].address =cpu_to_be32 (xfs_dir2_byte_to_dataptr ( (char *)dep - (char *)hdr));
@@ -1218,7 +1217,7 @@ xfs_dir2_sf_to_block( dup->length =cpu_to_be16 (newoffset - offset); *xfs_dir2_data_unused_tag_p (dup) =cpu_to_be16 ( ((char *)dup - (char *)hdr)); -xfs_dir2_data_log_unused (tp, bp, dup); +xfs_dir2_data_log_unused (args, bp, dup);xfs_dir2_data_freeinsert (hdr, dp->d_ops->data_bestfree_p (hdr), dup, &dummy);
@@ -1235,7 +1234,7 @@ xfs_dir2_sf_to_block(memcpy (dep->name, sfep->name, dep->namelen); tagp = dp->d_ops->data_entry_tag_p (dep); *tagp =cpu_to_be16 ((char *)dep - (char *)hdr); -xfs_dir2_data_log_entry (tp, dp, bp, dep); +xfs_dir2_data_log_entry (args, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops->
fs/xfs/xfs_dir2_data.c +26 -33
207 lines not on this page · raw message
fs/xfs/xfs_dir2_leaf.c +53 -50
290 lines not on this page · raw message
fs/xfs/xfs_dir2_node.c +31 -37
228 lines not on this page · raw message
fs/xfs/xfs_dir2_priv.h +2 -2
@@ -211,9 +211,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp);extern int xfs_dir3_leaf_get_buf (struct xfs_da_args *args,xfs_dir2_db_t bno,struct xfs_buf **bpp,__uint16_t magic); -extern void xfs_dir3_leaf_log_ents (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_ents (struct xfs_da_args *args,struct xfs_buf *bp,int first,int last); -extern void xfs_dir3_leaf_log_header (struct xfs_trans *tp,struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_header (struct xfs_da_args *args,struct xfs_buf *bp);extern int xfs_dir2_leaf_lookup (struct xfs_da_args *args);extern int xfs_dir2_leaf_removename (struct xfs_da_args *args);
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 14/16 xfs: use xfs_da_geometry for block size in attr code
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Rather than using the superblock value obtained through the xfs_mount.
--- fs/xfs/xfs_attr.c | 12 ++++++------ fs/xfs/xfs_attr_leaf.c | 6 +++--- fs/xfs/xfs_log_rlimit.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-)
fs/xfs/xfs_attr.c +6 -6
@@ -175,11 +175,11 @@ xfs_attr_calc_size(* "local" or "remote" (note: local != inline). */ size =xfs_attr_leaf_newentsize (args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, local); + args->geo->blksize, local); nblks =XFS_DAENTER_SPACE_RES (mp,XFS_ATTR_FORK );if (*local) { -if (size > (mp->m_sb.sb_blocksize >>1 )) { +if (size > (args->geo->blksize /2 )) {/* Double split possible */ nblks *=2 ; }
@@ -898,7 +898,7 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents;/*
@@ -1077,7 +1077,7 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; state->inleaf =0 ; error =xfs_da3_node_lookup_int (state, &retval);
@@ -1169,7 +1169,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents;/*
@@ -1432,7 +1432,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents;/*
fs/xfs/xfs_attr_leaf.c +3 -3
@@ -1077,7 +1077,7 @@ xfs_attr3_leaf_add(xfs_attr3_leaf_hdr_from_disk (&ichdr, leaf);ASSERT (args->index >=0 && args->index <= ichdr.count); entsize =xfs_attr_leaf_newentsize (args->namelen, args->valuelen, - args->trans->t_mountp->m_sb.sb_blocksize,NULL ); + args->geo->blksize,NULL );/* * Search through freemap for first-fit on new name length.
@@ -1180,13 +1180,13 @@ xfs_attr3_leaf_add_work(ASSERT ((ichdr->freemap[mapindex].base &0x3 ) ==0 );ASSERT (ichdr->freemap[mapindex].size >=xfs_attr_leaf_newentsize (args->namelen, args->valuelen, - mp->m_sb.sb_blocksize,NULL )); + args->geo->blksize,NULL ));ASSERT (ichdr->freemap[mapindex].size <XFS_LBSIZE (mp));ASSERT ((ichdr->freemap[mapindex].size &0x3 ) ==0 ); ichdr->freemap[mapindex].size -=xfs_attr_leaf_newentsize (args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp); + args->geo->blksize, &tmp); entry->nameidx =cpu_to_be16 (ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size);
fs/xfs/xfs_log_rlimit.c +1 -1
@@ -42,7 +42,7 @@ xfs_log_calc_max_attrsetm_res(int size;int nblks; - size =xfs_attr_leaf_entsize_local_max (mp->m_sb.sb_blocksize) - + size =xfs_attr_leaf_entsize_local_max (mp->m_attr_geo->blksize) -MAXNAMELEN -1 ; nblks =XFS_DAENTER_SPACE_RES (mp,XFS_ATTR_FORK ); nblks +=XFS_B_TO_FSB (mp, size);
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 15/16 xfs: pass xfs_da_args to xfs_attr_leaf_newentsize
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
As it's only ever called from contexts where the xfs_da_args is present and contains all the information needed inside the args structure.
--- fs/xfs/xfs_attr.c | 4 +--- fs/xfs/xfs_attr_leaf.c | 47 +++++++++++++++++------------------------------ fs/xfs/xfs_attr_leaf.h | 3 +-- 3 files changed, 19 insertions(+), 35 deletions(-)
fs/xfs/xfs_attr.c +1 -3
@@ -174,9 +174,7 @@ xfs_attr_calc_size(* Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size =xfs_attr_leaf_newentsize (args->namelen, args->valuelen, - args->geo->blksize, local); - + size =xfs_attr_leaf_newentsize (args, local); nblks =XFS_DAENTER_SPACE_RES (mp,XFS_ATTR_FORK );if (*local) {if (size > (args->geo->blksize /2 )) {
fs/xfs/xfs_attr_leaf.c +17 -30
90 lines not on this page · raw message
fs/xfs/xfs_attr_leaf.h +1 -2
@@ -96,8 +96,7 @@ int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp);xfs_dahash_t xfs_attr_leaf_lasthash (struct xfs_buf *bp,int *count);int xfs_attr_leaf_order (struct xfs_buf *leaf1_bp,struct xfs_buf *leaf2_bp); -int xfs_attr_leaf_newentsize (int namelen,int valuelen,int blocksize, -int *local); +int xfs_attr_leaf_newentsize (struct xfs_da_args *args,int *local);int xfs_attr3_leaf_read (struct xfs_trans *tp,struct xfs_inode *dp,xfs_dablk_t bno,xfs_daddr_t mappedbno,struct xfs_buf **bpp);
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 16/16 xfs: repalce attr LBSIZE with xfs_da_geometry
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
--- fs/xfs/xfs_attr.c | 2 +- fs/xfs/xfs_attr_leaf.c | 114 ++++++++++++++++++++++++----------------------- fs/xfs/xfs_attr_remote.c | 55 ++++++++++++----------- fs/xfs/xfs_da_format.h | 10 ----- 4 files changed, 89 insertions(+), 92 deletions(-)
fs/xfs/xfs_attr.c +1 -1
@@ -863,7 +863,7 @@ xfs_attr_leaf_get(xfs_da_args_t *args) }/*======================================================================== -* External routines when attribute list size > XFS_LBSIZE(mp). +* External routines when attribute list size > geo->blksize *========================================================================*/ /*
fs/xfs/xfs_attr_leaf.c +59 -55
327 lines not on this page · raw message
fs/xfs/xfs_attr_remote.c +29 -26
133 lines not on this page · raw message
fs/xfs/xfs_da_format.h +0 -10
@@ -19,10 +19,6 @@#ifndef __XFS_DA_FORMAT_H__#define __XFS_DA_FORMAT_H__ -/*======================================================================== -* Directory Structure when greater than XFS_LBSIZE(mp) bytes. -*========================================================================*/ -/* * This structure is common to both leaf nodes and non-leaf nodes in the Btree. *
@@ -122,8 +118,6 @@ struct xfs_da3_icnode_hdr {__uint16_t level; }; -#define XFS_LBSIZE (mp) (mp)->m_sb.sb_blocksize -/* * Directory version 2. *
@@ -620,10 +614,6 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp)* of an attribute name may not be unique, we may have duplicate keys. The * internal links in the Btree are logical block offsets into the file. * -*======================================================================== -* Attribute structure when equal to XFS_LBSIZE(mp) bytes. -*======================================================================== -* * Struct leaf_entry's are packed from the top. Name/values grow from the * bottom but are not packed. The freemap contains run-length-encoded entries * for the free bytes after the leaf_entry's, but only the N largest such,
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 8 lines · Dave Chinner
Hi folks,
Version three of the patchset first posted here:
http://oss.sgi.com/pipermail/xfs/2014-May/036125.html
This version addresses the review comments so far.
Quoted 8 lines
Changelog:
Version 3:
- addedxfs_da_unmount
- moved dir2 conversion functions toxfs_dir2_priv.h
- convertedxfs_dir2_readdir.cto use local geo variables
- added a patch to remove newly redundant geometry fields from the structxfs_da_state
I don't see this bit anywhere in the series...
Brian
Quoted 10 lines
Version 2:
- patch removing checks fromxfs_da_read_buf()sent separately
- dropped patch addingxfs_da_geometryto the inode forks as it's not currently needed
- cleared up all the "XXX" notations added in the RFC series
- fixed several bugs in different patches as a result of incorrect conversions
- ensured each patch compiled and passes xfstests individually
Quoted 4 lines
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 11 lines · Brian Foster
Quoted 10 lines · Dave Chinner
Hi folks,
Version three of the patchset first posted here:
http://oss.sgi.com/pipermail/xfs/2014-May/036125.html
This version addresses the review comments so far.
Changelog:
Quoted 8 lines
Quoted 6 lines
Version 3:
- addedxfs_da_unmount
- moved dir2 conversion functions toxfs_dir2_priv.h
- convertedxfs_dir2_readdir.cto use local geo variables
- added a patch to remove newly redundant geometry fields from the structxfs_da_stateI don't see this bit anywhere in the series...
Oops, I got the wrong head commit when patchbombing. I've replied to the original patch 0 with a 17/16....
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
[PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
It's carried in state->args->geo, so there's no need to duplicate it and use more stack space than necessary.
--- fs/xfs/xfs_attr.c | 8 -------- fs/xfs/xfs_attr_leaf.c | 19 ++++++++++--------- fs/xfs/xfs_da_btree.c | 13 +++++++------ fs/xfs/xfs_da_btree.h | 2 -- fs/xfs/xfs_dir2_node.c | 13 +++---------- 5 files changed, 20 insertions(+), 35 deletions(-)
fs/xfs/xfs_attr.c +0 -8
@@ -896,8 +896,6 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name already exists, and get back a pointer
@@ -1075,8 +1073,6 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; state->inleaf =0 ; error =xfs_da3_node_lookup_int (state, &retval);if (error)
@@ -1167,8 +1163,6 @@ xfs_attr_node_removename(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it.
@@ -1430,8 +1424,6 @@ xfs_attr_node_get(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it.
fs/xfs/xfs_attr_leaf.c +10 -9
@@ -1494,8 +1494,8 @@ xfs_attr3_leaf_rebalance(xfs_attr3_leaf_hdr_to_disk (leaf1, &ichdr1);xfs_attr3_leaf_hdr_to_disk (leaf2, &ichdr2); -xfs_trans_log_buf (args->trans, blk1->bp,0 , state->blocksize-1 ); -xfs_trans_log_buf (args->trans, blk2->bp,0 , state->blocksize-1 ); +xfs_trans_log_buf (args->trans, blk1->bp,0 , args->geo->blksize -1 ); +xfs_trans_log_buf (args->trans, blk2->bp,0 , args->geo->blksize -1 );/* * Copy out last hashval in each block for B-tree code.
@@ -1592,7 +1592,7 @@ xfs_attr3_leaf_figure_balance( half += ichdr1->usedbytes + ichdr2->usedbytes +xfs_attr_leaf_newentsize (state->args,NULL ); half /=2 ; - lastdelta = state->blocksize; + lastdelta = state->args->geo->blksize; entry =xfs_attr3_leaf_entryp (leaf1);for (count = index =0 ; count < max; entry++, index++, count++) {
@@ -1690,7 +1690,7 @@ xfs_attr3_leaf_toosmall( bytes =xfs_attr3_leaf_hdr_size (leaf) + ichdr.count *sizeof (xfs_attr_leaf_entry_t) + ichdr.usedbytes; -if (bytes > (state->blocksize >>1 )) { +if (bytes > (state->args->geo->blksize >>1 )) { *action =0 ;/* blk over 50%, don't try to join */ return (0 ); }
@@ -1744,7 +1744,8 @@ xfs_attr3_leaf_toosmall(xfs_attr3_leaf_hdr_from_disk (&ichdr2, bp->b_addr); - bytes = state->blocksize - (state->blocksize >>2 ) - + bytes = state->args->geo->blksize - + (state->args->geo->blksize >>2 ) - ichdr.usedbytes - ichdr2.usedbytes - ((ichdr.count + ichdr2.count) * sizeof(xfs_attr_leaf_entry_t)) -
@@ -1997,7 +1998,7 @@ xfs_attr3_leaf_unbalance(struct xfs_attr_leafblock *tmp_leaf;struct xfs_attr3_icleaf_hdr tmphdr; - tmp_leaf =kmem_zalloc (state->blocksize,KM_SLEEP ); + tmp_leaf =kmem_zalloc (state->args->geo->blksize,KM_SLEEP );/* * Copy the header into the temp leaf so that all the stuff
@@ -2010,7 +2011,7 @@ xfs_attr3_leaf_unbalance( tmphdr.magic = savehdr.magic; tmphdr.forw = savehdr.forw; tmphdr.back = savehdr.back; - tmphdr.firstused = state->blocksize; + tmphdr.firstused = state->args->geo->blksize;/* write the header to the temp buffer to initialise it */ xfs_attr3_leaf_hdr_to_disk (tmp_leaf, &tmphdr);
@@ -2035,14 +2036,14 @@ xfs_attr3_leaf_unbalance( tmp_leaf, &tmphdr, tmphdr.count, drophdr.count); } -memcpy (save_leaf, tmp_leaf, state->blocksize); +memcpy (save_leaf, tmp_leaf, state->args->geo->blksize); savehdr = tmphdr;/* struct copy */ kmem_free (tmp_leaf); }xfs_attr3_leaf_hdr_to_disk (save_leaf, &savehdr);xfs_trans_log_buf (state->args->trans, save_blk->bp,0 , - state->blocksize -1 ); + state->args->geo->blksize -1 );/* * Copy out last hashval in each block for B-tree code.
fs/xfs/xfs_da_btree.c +7 -6
@@ -663,7 +663,7 @@ xfs_da3_node_split(/* * Do we have to split the node? */ -if (nodehdr.count + newcount > state->node_ents) { +if (nodehdr.count + newcount > state->args->geo->node_ents) {/* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it.
@@ -1089,14 +1089,15 @@ xfs_da3_root_join(* that could occur. For dir3 blocks we also need to update the block * number in the buffer header. */ -memcpy (root_blk->bp->b_addr, bp->b_addr, state->blocksize); +memcpy (root_blk->bp->b_addr, bp->b_addr, state->args->geo->blksize); root_blk->bp->b_ops = bp->b_ops;xfs_trans_buf_copy_type (root_blk->bp, bp);if (oldroothdr.magic ==XFS_DA3_NODE_MAGIC ) {struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; da3->blkno =cpu_to_be64 (root_blk->bp->b_bn); } -xfs_trans_log_buf (args->trans, root_blk->bp,0 , state->blocksize -1 ); +xfs_trans_log_buf (args->trans, root_blk->bp,0 , + state->args->geo->blksize -1 ); error =xfs_da_shrink_inode (args, child, bp);return (error); }
@@ -1139,7 +1140,7 @@ xfs_da3_node_toosmall( info = blk->bp->b_addr; node = (xfs_da_intnode_t *)info; dp->d_ops->node_hdr_from_disk (&nodehdr, node); -if (nodehdr.count > (state->node_ents >>1 )) { +if (nodehdr.count > (state->args->geo->node_ents >>1 )) { *action =0 ;/* blk over 50%, don't try to join */ return (0 );/* blk over 50%, don't try to join */ }
@@ -1176,8 +1177,8 @@ xfs_da3_node_toosmall(* We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - count = state->node_ents; - count -= state->node_ents >>2 ; + count = state->args->geo->node_ents; + count -= state->args->geo->node_ents >>2 ; count -= nodehdr.count;/* start with smaller blk num */
fs/xfs/xfs_da_btree.h +0 -2
@@ -128,8 +128,6 @@ typedef struct xfs_da_state_path { typedef struct xfs_da_state { xfs_da_args_t *args; /* filename arguments */ struct xfs_mount *mp; /* filesystem mount point */ - unsigned int blocksize; /* logical block size */ - unsigned int node_ents; /* how many entries in danode */ xfs_da_state_path_t path; /* search/split paths */ xfs_da_state_path_t altpath; /* alternate path for join */ unsigned char inleaf; /* insert into 1->lf, 0->splf */
fs/xfs/xfs_dir2_node.c +3 -10
@@ -1414,7 +1414,7 @@ xfs_dir2_leafn_toosmall( count = leafhdr.count - leafhdr.stale; bytes = dp->d_ops->leaf_hdr_size + count *sizeof (ents[0 ]); -if (bytes > (state->blocksize >>1 )) { +if (bytes > (state->args->geo->blksize >>1 )) {/* * Blk over 50%, don't try to join. */
@@ -1467,7 +1467,8 @@ xfs_dir2_leafn_toosmall(* Count bytes in the two blocks combined. */ count = leafhdr.count - leafhdr.stale; - bytes = state->blocksize - (state->blocksize >>2 ); + bytes = state->args->geo->blksize - + (state->args->geo->blksize >>2 ); leaf = bp->b_addr; dp->d_ops->leaf_hdr_from_disk (&hdr2, leaf);
@@ -1591,8 +1592,6 @@ xfs_dir2_node_addname( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Look up the name. We're not supposed to find it, but * this gives us the insertion point.
@@ -2037,8 +2036,6 @@ xfs_dir2_node_lookup( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Fill in the path to the entry in the cursor. */
@@ -2092,8 +2089,6 @@ xfs_dir2_node_removename( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* Look up the entry we're deleting, set up the cursor. */ error =xfs_da3_node_lookup_int (state, &rval);
@@ -2162,8 +2157,6 @@ xfs_dir2_node_replace( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; inum = args->inumber;/* * Lookup the entry to change in the btree.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Brian Foster
Reviewed-byRe: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state
Quoted 151 lines · Dave Chinner
From: Dave Chinner <[email protected]>
It's carried in
state->args->geo, so there's no need to duplicate it and use more stack space than necessary.Signed-off-by Dave Chinner <[email protected]>--- fs/xfs/xfs_attr.c | 8 -------- fs/xfs/xfs_attr_leaf.c | 19 ++++++++++--------- fs/xfs/xfs_da_btree.c | 13 +++++++------ fs/xfs/xfs_da_btree.h | 2 -- fs/xfs/xfs_dir2_node.c | 13 +++---------- 5 files changed, 20 insertions(+), 35 deletions(-)fs/xfs/xfs_attr.c +0
-8@@ -896,8 +896,6 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name already exists, and get back a pointer @@ -1075,8 +1073,6 @@ restart: state =xfs_da_state_alloc (); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; state->inleaf =0 ; error =xfs_da3_node_lookup_int (state, &retval);if (error)@@ -1167,8 +1163,6 @@ xfs_attr_node_removename(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it. @@ -1430,8 +1424,6 @@ xfs_attr_node_get(xfs_da_args_t *args) state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Search to see if name exists, and get back a pointer to it. fs/xfs/xfs_attr_leaf.c +10
-9@@ -1494,8 +1494,8 @@ xfs_attr3_leaf_rebalance(xfs_attr3_leaf_hdr_to_disk (leaf1, &ichdr1);xfs_attr3_leaf_hdr_to_disk (leaf2, &ichdr2); -xfs_trans_log_buf (args->trans, blk1->bp,0 , state->blocksize-1 ); -xfs_trans_log_buf (args->trans, blk2->bp,0 , state->blocksize-1 ); +xfs_trans_log_buf (args->trans, blk1->bp,0 , args->geo->blksize -1 ); +xfs_trans_log_buf (args->trans, blk2->bp,0 , args->geo->blksize -1 );/* * Copy out last hashval in each block for B-tree code. @@ -1592,7 +1592,7 @@ xfs_attr3_leaf_figure_balance( half += ichdr1->usedbytes + ichdr2->usedbytes +xfs_attr_leaf_newentsize (state->args,NULL ); half /=2 ; - lastdelta = state->blocksize; + lastdelta = state->args->geo->blksize; entry =xfs_attr3_leaf_entryp (leaf1);for (count = index =0 ; count < max; entry++, index++, count++) {@@ -1690,7 +1690,7 @@ xfs_attr3_leaf_toosmall( bytes =xfs_attr3_leaf_hdr_size (leaf) + ichdr.count *sizeof (xfs_attr_leaf_entry_t) + ichdr.usedbytes; -if (bytes > (state->blocksize >>1 )) { +if (bytes > (state->args->geo->blksize >>1 )) { *action =0 ;/* blk over 50%, don't try to join */ return (0 ); }@@ -1744,7 +1744,8 @@ xfs_attr3_leaf_toosmall(xfs_attr3_leaf_hdr_from_disk (&ichdr2, bp->b_addr); - bytes = state->blocksize - (state->blocksize >>2 ) - + bytes = state->args->geo->blksize - + (state->args->geo->blksize >>2 ) - ichdr.usedbytes - ichdr2.usedbytes - ((ichdr.count + ichdr2.count) * sizeof(xfs_attr_leaf_entry_t)) -@@ -1997,7 +1998,7 @@ xfs_attr3_leaf_unbalance(struct xfs_attr_leafblock *tmp_leaf;struct xfs_attr3_icleaf_hdr tmphdr; - tmp_leaf =kmem_zalloc (state->blocksize,KM_SLEEP ); + tmp_leaf =kmem_zalloc (state->args->geo->blksize,KM_SLEEP );/* * Copy the header into the temp leaf so that all the stuff @@ -2010,7 +2011,7 @@ xfs_attr3_leaf_unbalance( tmphdr.magic = savehdr.magic; tmphdr.forw = savehdr.forw; tmphdr.back = savehdr.back; - tmphdr.firstused = state->blocksize; + tmphdr.firstused = state->args->geo->blksize;/* write the header to the temp buffer to initialise it */ xfs_attr3_leaf_hdr_to_disk (tmp_leaf, &tmphdr);@@ -2035,14 +2036,14 @@ xfs_attr3_leaf_unbalance( tmp_leaf, &tmphdr, tmphdr.count, drophdr.count); } -memcpy (save_leaf, tmp_leaf, state->blocksize); +memcpy (save_leaf, tmp_leaf, state->args->geo->blksize); savehdr = tmphdr;/* struct copy */ kmem_free (tmp_leaf); }xfs_attr3_leaf_hdr_to_disk (save_leaf, &savehdr);xfs_trans_log_buf (state->args->trans, save_blk->bp,0 , - state->blocksize -1 ); + state->args->geo->blksize -1 );/* * Copy out last hashval in each block for B-tree code. fs/xfs/xfs_da_btree.c +1
-2@@ -663,7 +663,7 @@ xfs_da3_node_split(/* * Do we have to split the node? */ -if (nodehdr.count + newcount > state->node_ents) { +if (nodehdr.count + newcount > state->args->geo->node_ents) {/* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it. @@ -1089,14 +1089,15 @@ xfs_da3_root_join(* that could occur. For dir3 blocks we also need to update the block * number in the buffer header. */ -memcpy (root_blk->bp->b_addr, bp->b_addr, state->blocksize);
fs/xfs/xfs_da_btree.c xfs_da3_root_join( · line 1100
Quoted 10 lines
fs/xfs/xfs_da_btree.c +3
-1+memcpy (root_blk->bp->b_addr, bp->b_addr, state->args->geo->blksize); root_blk->bp->b_ops = bp->b_ops;xfs_trans_buf_copy_type (root_blk->bp, bp);if (oldroothdr.magic ==XFS_DA3_NODE_MAGIC ) {struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; da3->blkno =cpu_to_be64 (root_blk->bp->b_bn); } -xfs_trans_log_buf (args->trans, root_blk->bp,0 , state->blocksize -1 ); +xfs_trans_log_buf (args->trans, root_blk->bp,0 , + state->args->geo->blksize -1 );
FYI, you've got a local args pointer in xfs_da3_root_join().
Quoted 96 lines
fs/xfs/xfs_da_btree.c +3
-3error =xfs_da_shrink_inode (args, child, bp);return (error); }@@ -1139,7 +1140,7 @@ xfs_da3_node_toosmall( info = blk->bp->b_addr; node = (xfs_da_intnode_t *)info; dp->d_ops->node_hdr_from_disk (&nodehdr, node); -if (nodehdr.count > (state->node_ents >>1 )) { +if (nodehdr.count > (state->args->geo->node_ents >>1 )) { *action =0 ;/* blk over 50%, don't try to join */ return (0 );/* blk over 50%, don't try to join */ }@@ -1176,8 +1177,8 @@ xfs_da3_node_toosmall(* We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - count = state->node_ents; - count -= state->node_ents >>2 ; + count = state->args->geo->node_ents; + count -= state->args->geo->node_ents >>2 ; count -= nodehdr.count;/* start with smaller blk num */ fs/xfs/xfs_da_btree.h +0
-2@@ -128,8 +128,6 @@ typedef struct xfs_da_state_path { typedef struct xfs_da_state { xfs_da_args_t *args; /* filename arguments */ struct xfs_mount *mp; /* filesystem mount point */ - unsigned int blocksize; /* logical block size */ - unsigned int node_ents; /* how many entries in danode */ xfs_da_state_path_t path; /* search/split paths */ xfs_da_state_path_t altpath; /* alternate path for join */ unsigned char inleaf; /* insert into 1->lf, 0->splf */fs/xfs/xfs_dir2_node.c +3
-10@@ -1414,7 +1414,7 @@ xfs_dir2_leafn_toosmall( count = leafhdr.count - leafhdr.stale; bytes = dp->d_ops->leaf_hdr_size + count *sizeof (ents[0 ]); -if (bytes > (state->blocksize >>1 )) { +if (bytes > (state->args->geo->blksize >>1 )) {/* * Blk over 50%, don't try to join. */ @@ -1467,7 +1467,8 @@ xfs_dir2_leafn_toosmall(* Count bytes in the two blocks combined. */ count = leafhdr.count - leafhdr.stale; - bytes = state->blocksize - (state->blocksize >>2 ); + bytes = state->args->geo->blksize - + (state->args->geo->blksize >>2 ); leaf = bp->b_addr; dp->d_ops->leaf_hdr_from_disk (&hdr2, leaf);@@ -1591,8 +1592,6 @@ xfs_dir2_node_addname( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Look up the name. We're not supposed to find it, but * this gives us the insertion point. @@ -2037,8 +2036,6 @@ xfs_dir2_node_lookup( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* * Fill in the path to the entry in the cursor. */ @@ -2092,8 +2089,6 @@ xfs_dir2_node_removename( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents;/* Look up the entry we're deleting, set up the cursor. */ error =xfs_da3_node_lookup_int (state, &rval);@@ -2162,8 +2157,6 @@ xfs_dir2_node_replace( state =xfs_da_state_alloc (); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; inum = args->inumber;/* * Lookup the entry to change in the btree.
Quoted 4 lines
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state
Quoted 9 lines · Brian Foster
Quoted 8 lines · Dave Chinner
From: Dave Chinner <[email protected]>
It's carried in
state->args->geo, so there's no need to duplicate it and use more stack space than necessary.Signed-off-by Dave Chinner <[email protected]>---
....
Quoted 9 lines
Quoted 9 lines
fs/xfs/xfs_da_btree.c +1
-1@@ -1089,14 +1089,15 @@ xfs_da3_root_join(* that could occur. For dir3 blocks we also need to update the block * number in the buffer header. */ -memcpy (root_blk->bp->b_addr, bp->b_addr, state->blocksize); +memcpy (root_blk->bp->b_addr, bp->b_addr, state->args->geo->blksize); root_blk->bp->b_ops = bp->b_ops;xfs_trans_buf_copy_type (root_blk->bp, bp);if (oldroothdr.magic ==XFS_DA3_NODE_MAGIC ) {
Quoted 8 lines
fs/xfs/xfs_da_btree.c xfs_da3_root_join( · line 1100
Quoted 6 lines
fs/xfs/xfs_da_btree.c +2
-1struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; da3->blkno =cpu_to_be64 (root_blk->bp->b_bn); } -xfs_trans_log_buf (args->trans, root_blk->bp,0 , state->blocksize -1 ); +xfs_trans_log_buf (args->trans, root_blk->bp,0 , + state->args->geo->blksize -1 );FYI, you've got a local args pointer in
xfs_da3_root_join().
Ah, the joys of macro based replacement. I'll fix it up. ;)
Quoted 1 line
Reviewed-by Brian Foster <[email protected]>
Thanks!
-Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs