[PATCH 5/5] xfs: remove m_attroffset
Felix Blyakher
felixb at sgi.com
Mon Apr 6 17:11:57 CDT 2009
On Mar 18, 2009, at 4:41 AM, Christoph Hellwig wrote:
> With the upcoming v3 inodes the default attroffset needs to be
> calculated
> for each specific inode, so we can't cache it in the superblock
> anymore.
>
> Also replace the assert for wrong inode sizes with a proper error
> check
> also included in non-debug builds. Note that the ENOSYS retourn for
> that might seem odd, but that error is returned by
> xfs_mount_validate_sb
> for all theoretically valid but not supported filesystem geometries.
>
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
Reviewed-by: Felix Blyakher <sgi.com>
>
>
> Index: xfs/fs/xfs/xfs_mount.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.c 2009-03-18 07:37:20.566978952 +0100
> +++ xfs/fs/xfs/xfs_mount.c 2009-03-18 07:47:49.573979000 +0100
> @@ -333,6 +333,22 @@ xfs_mount_validate_sb(
> return XFS_ERROR(ENOSYS);
> }
>
> + /*
> + * Currently only very few inode sizes are supported.
> + */
> + switch (sbp->sb_inodesize) {
> + case 256:
> + case 512:
> + case 1024:
> + case 2048:
> + break;
> + default:
> + xfs_fs_mount_cmn_err(flags,
> + "inode size of %d bytes not supported",
> + sbp->sb_inodesize);
> + return XFS_ERROR(ENOSYS);
> + }
> +
> if (xfs_sb_validate_fsb_count(sbp, sbp->sb_dblocks) ||
> xfs_sb_validate_fsb_count(sbp, sbp->sb_rblocks)) {
> xfs_fs_mount_cmn_err(flags,
> @@ -655,27 +671,6 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb
> mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG;
> mp->m_blockwmask = mp->m_blockwsize - 1;
>
> - /*
> - * Setup for attributes, in case they get created.
> - * This value is for inodes getting attributes for the first time,
> - * the per-inode value is for old attribute values.
> - */
> - ASSERT(sbp->sb_inodesize >= 256 && sbp->sb_inodesize <= 2048);
> - switch (sbp->sb_inodesize) {
> - case 256:
> - mp->m_attroffset = XFS_LITINO(mp) -
> - XFS_BMDR_SPACE_CALC(MINABTPTRS);
> - break;
> - case 512:
> - case 1024:
> - case 2048:
> - mp->m_attroffset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS);
> - break;
> - default:
> - ASSERT(0);
> - }
> - ASSERT(mp->m_attroffset < XFS_LITINO(mp));
> -
> mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1);
> mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0);
> mp->m_alloc_mnr[0] = mp->m_alloc_mxr[0] / 2;
> Index: xfs/fs/xfs/xfs_attr_leaf.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_attr_leaf.c 2009-03-18 07:37:20.570978763
> +0100
> +++ xfs/fs/xfs/xfs_attr_leaf.c 2009-03-18 07:37:23.768978423 +0100
> @@ -155,7 +155,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t
> * minimum offset only needs to be the space required for
> * the btree root.
> */
> - if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset)
> + if (!dp->i_d.di_forkoff && dp->i_df.if_bytes >
> + xfs_default_attroffset(dp))
> dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS);
> break;
>
> Index: xfs/fs/xfs/xfs_bmap.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_bmap.c 2009-03-18 07:37:20.575978772 +0100
> +++ xfs/fs/xfs/xfs_bmap.c 2009-03-18 07:37:23.770978468 +0100
> @@ -3569,6 +3569,27 @@ xfs_bmap_extents_to_btree(
> }
>
> /*
> + * Calculate the default attribute fork offset for newly created
> inodes.
> + */
> +uint
> +xfs_default_attroffset(
> + struct xfs_inode *ip)
> +{
> + struct xfs_mount *mp = ip->i_mount;
> + uint offset;
> +
> + if (mp->m_sb.sb_inodesize == 256) {
> + offset = XFS_LITINO(mp) -
> + XFS_BMDR_SPACE_CALC(MINABTPTRS);
> + } else {
> + offset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS);
> + }
> +
> + ASSERT(offset < XFS_LITINO(mp));
> + return offset;
> +}
> +
> +/*
> * Helper routine to reset inode di_forkoff field when switching
> * attribute fork from local to extent format - we reset it where
> * possible to make space available for inline data fork extents.
> @@ -3580,15 +3601,18 @@ xfs_bmap_forkoff_reset(
> int whichfork)
> {
> if (whichfork == XFS_ATTR_FORK &&
> - (ip->i_d.di_format != XFS_DINODE_FMT_DEV) &&
> - (ip->i_d.di_format != XFS_DINODE_FMT_UUID) &&
> - (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
> - ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) {
> - ip->i_d.di_forkoff = mp->m_attroffset >> 3;
> - ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) /
> - (uint)sizeof(xfs_bmbt_rec_t);
> - ip->i_afp->if_ext_max = XFS_IFORK_ASIZE(ip) /
> - (uint)sizeof(xfs_bmbt_rec_t);
> + ip->i_d.di_format != XFS_DINODE_FMT_DEV &&
> + ip->i_d.di_format != XFS_DINODE_FMT_UUID &&
> + ip->i_d.di_format != XFS_DINODE_FMT_BTREE) {
> + uint dfl_forkoff = xfs_default_attroffset(ip) >> 3;
> +
> + if (dfl_forkoff > ip->i_d.di_forkoff) {
> + ip->i_d.di_forkoff = dfl_forkoff;
> + ip->i_df.if_ext_max =
> + XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t);
> + ip->i_afp->if_ext_max =
> + XFS_IFORK_ASIZE(ip) / sizeof(xfs_bmbt_rec_t);
> + }
> }
> }
>
> @@ -4057,7 +4081,7 @@ xfs_bmap_add_attrfork(
> case XFS_DINODE_FMT_BTREE:
> ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size);
> if (!ip->i_d.di_forkoff)
> - ip->i_d.di_forkoff = mp->m_attroffset >> 3;
> + ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3;
> else if (mp->m_flags & XFS_MOUNT_ATTR2)
> version = 2;
> break;
> @@ -4204,12 +4228,12 @@ xfs_bmap_compute_maxlevels(
> * (a signed 16-bit number, xfs_aextnum_t).
> *
> * Note that we can no longer assume that if we are in ATTR1 that
> - * the fork offset of all the inodes will be (m_attroffset >> 3)
> - * because we could have mounted with ATTR2 and then mounted back
> - * with ATTR1, keeping the di_forkoff's fixed but probably at
> - * various positions. Therefore, for both ATTR1 and ATTR2
> - * we have to assume the worst case scenario of a minimum size
> - * available.
> + * the fork offset of all the inodes will be
> + * (xfs_default_attroffset(ip) >> 3) because we could have mounted
> + * with ATTR2 and then mounted back with ATTR1, keeping the
> + * di_forkoff's fixed but probably at various positions. Therefore,
> + * for both ATTR1 and ATTR2 we have to assume the worst case
> scenario
> + * of a minimum size available.
> */
> if (whichfork == XFS_DATA_FORK) {
> maxleafents = MAXEXTNUM;
> Index: xfs/fs/xfs/xfs_bmap.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_bmap.h 2009-03-18 07:37:20.579979142 +0100
> +++ xfs/fs/xfs/xfs_bmap.h 2009-03-18 07:37:23.772979002 +0100
> @@ -338,6 +338,10 @@ xfs_check_nostate_extents(
> xfs_extnum_t idx,
> xfs_extnum_t num);
>
> +uint
> +xfs_default_attroffset(
> + struct xfs_inode *ip);
> +
> #ifdef __KERNEL__
>
> /*
> Index: xfs/fs/xfs/xfs_mount.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.h 2009-03-18 07:37:20.585978718 +0100
> +++ xfs/fs/xfs/xfs_mount.h 2009-03-18 07:37:23.772979002 +0100
> @@ -198,7 +198,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_attroffset; /* inode attribute offset */
> 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 */
>
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
More information about the xfs
mailing list