提交 c01147d9 编写于 作者: D Darrick J. Wong

xfs: replace inode fork size macros with functions

Replace the shouty macros here with typechecked helper functions.
Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
上级 932b42c6
...@@ -590,7 +590,7 @@ xfs_attr_shortform_bytesfit( ...@@ -590,7 +590,7 @@ xfs_attr_shortform_bytesfit(
* to real extents, or the delalloc conversion will take care of the * to real extents, or the delalloc conversion will take care of the
* literal area rebalancing. * literal area rebalancing.
*/ */
if (bytes <= XFS_IFORK_ASIZE(dp)) if (bytes <= xfs_inode_attr_fork_size(dp))
return dp->i_forkoff; return dp->i_forkoff;
/* /*
......
...@@ -880,7 +880,7 @@ xfs_bmap_add_attrfork_btree( ...@@ -880,7 +880,7 @@ xfs_bmap_add_attrfork_btree(
mp = ip->i_mount; mp = ip->i_mount;
if (XFS_BMAP_BMDR_SPACE(block) <= XFS_IFORK_DSIZE(ip)) if (XFS_BMAP_BMDR_SPACE(block) <= xfs_inode_data_fork_size(ip))
*flags |= XFS_ILOG_DBROOT; *flags |= XFS_ILOG_DBROOT;
else { else {
cur = xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK); cur = xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK);
...@@ -920,7 +920,7 @@ xfs_bmap_add_attrfork_extents( ...@@ -920,7 +920,7 @@ xfs_bmap_add_attrfork_extents(
int error; /* error return value */ int error; /* error return value */
if (ip->i_df.if_nextents * sizeof(struct xfs_bmbt_rec) <= if (ip->i_df.if_nextents * sizeof(struct xfs_bmbt_rec) <=
XFS_IFORK_DSIZE(ip)) xfs_inode_data_fork_size(ip))
return 0; return 0;
cur = NULL; cur = NULL;
error = xfs_bmap_extents_to_btree(tp, ip, &cur, 0, flags, error = xfs_bmap_extents_to_btree(tp, ip, &cur, 0, flags,
...@@ -951,7 +951,7 @@ xfs_bmap_add_attrfork_local( ...@@ -951,7 +951,7 @@ xfs_bmap_add_attrfork_local(
{ {
struct xfs_da_args dargs; /* args for dir/attr code */ struct xfs_da_args dargs; /* args for dir/attr code */
if (ip->i_df.if_bytes <= XFS_IFORK_DSIZE(ip)) if (ip->i_df.if_bytes <= xfs_inode_data_fork_size(ip))
return 0; return 0;
if (S_ISDIR(VFS_I(ip)->i_mode)) { if (S_ISDIR(VFS_I(ip)->i_mode)) {
......
...@@ -564,7 +564,7 @@ xfs_bmbt_init_cursor( ...@@ -564,7 +564,7 @@ xfs_bmbt_init_cursor(
if (xfs_has_crc(mp)) if (xfs_has_crc(mp))
cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; cur->bc_flags |= XFS_BTREE_CRC_BLOCKS;
cur->bc_ino.forksize = XFS_IFORK_SIZE(ip, whichfork); cur->bc_ino.forksize = xfs_inode_fork_size(ip, whichfork);
cur->bc_ino.ip = ip; cur->bc_ino.ip = ip;
cur->bc_ino.allocated = 0; cur->bc_ino.allocated = 0;
cur->bc_ino.flags = 0; cur->bc_ino.flags = 0;
......
...@@ -193,7 +193,7 @@ xfs_dir_isempty( ...@@ -193,7 +193,7 @@ xfs_dir_isempty(
ASSERT(S_ISDIR(VFS_I(dp)->i_mode)); ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
if (dp->i_disk_size == 0) /* might happen during shutdown. */ if (dp->i_disk_size == 0) /* might happen during shutdown. */
return 1; return 1;
if (dp->i_disk_size > XFS_IFORK_DSIZE(dp)) if (dp->i_disk_size > xfs_inode_data_fork_size(dp))
return 0; return 0;
sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
return !sfp->count; return !sfp->count;
......
...@@ -842,7 +842,7 @@ xfs_dir2_block_removename( ...@@ -842,7 +842,7 @@ xfs_dir2_block_removename(
* See if the size as a shortform is good enough. * See if the size as a shortform is good enough.
*/ */
size = xfs_dir2_block_sfsize(dp, hdr, &sfh); size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
if (size > XFS_IFORK_DSIZE(dp)) if (size > xfs_inode_data_fork_size(dp))
return 0; return 0;
/* /*
...@@ -1055,7 +1055,7 @@ xfs_dir2_leaf_to_block( ...@@ -1055,7 +1055,7 @@ xfs_dir2_leaf_to_block(
* Now see if the resulting block can be shrunken to shortform. * Now see if the resulting block can be shrunken to shortform.
*/ */
size = xfs_dir2_block_sfsize(dp, hdr, &sfh); size = xfs_dir2_block_sfsize(dp, hdr, &sfh);
if (size > XFS_IFORK_DSIZE(dp)) if (size > xfs_inode_data_fork_size(dp))
return 0; return 0;
return xfs_dir2_block_to_sf(args, dbp, size, &sfh); return xfs_dir2_block_to_sf(args, dbp, size, &sfh);
......
...@@ -237,7 +237,7 @@ xfs_dir2_block_sfsize( ...@@ -237,7 +237,7 @@ xfs_dir2_block_sfsize(
(i8count ? /* inumber */ (i8count ? /* inumber */
count * XFS_INO64_SIZE : count * XFS_INO64_SIZE :
count * XFS_INO32_SIZE); count * XFS_INO32_SIZE);
if (size > XFS_IFORK_DSIZE(dp)) if (size > xfs_inode_data_fork_size(dp))
return size; /* size value is a failure */ return size; /* size value is a failure */
} }
/* /*
...@@ -406,7 +406,7 @@ xfs_dir2_sf_addname( ...@@ -406,7 +406,7 @@ xfs_dir2_sf_addname(
* Won't fit as shortform any more (due to size), * Won't fit as shortform any more (due to size),
* or the pick routine says it won't (due to offset values). * or the pick routine says it won't (due to offset values).
*/ */
if (new_isize > XFS_IFORK_DSIZE(dp) || if (new_isize > xfs_inode_data_fork_size(dp) ||
(pick = (pick =
xfs_dir2_sf_addname_pick(args, objchange, &sfep, &offset)) == 0) { xfs_dir2_sf_addname_pick(args, objchange, &sfep, &offset)) == 0) {
/* /*
...@@ -1031,7 +1031,7 @@ xfs_dir2_sf_replace_needblock( ...@@ -1031,7 +1031,7 @@ xfs_dir2_sf_replace_needblock(
newsize = dp->i_df.if_bytes + (sfp->count + 1) * XFS_INO64_DIFF; newsize = dp->i_df.if_bytes + (sfp->count + 1) * XFS_INO64_DIFF;
return inum > XFS_DIR2_MAX_SHORT_INUM && return inum > XFS_DIR2_MAX_SHORT_INUM &&
sfp->i8count == 0 && newsize > XFS_IFORK_DSIZE(dp); sfp->i8count == 0 && newsize > xfs_inode_data_fork_size(dp);
} }
/* /*
......
...@@ -407,7 +407,7 @@ xfs_iroot_realloc( ...@@ -407,7 +407,7 @@ xfs_iroot_realloc(
(int)new_size); (int)new_size);
ifp->if_broot_bytes = (int)new_size; ifp->if_broot_bytes = (int)new_size;
ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
XFS_IFORK_SIZE(ip, whichfork)); xfs_inode_fork_size(ip, whichfork));
memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t)); memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t));
return; return;
} }
...@@ -461,7 +461,7 @@ xfs_iroot_realloc( ...@@ -461,7 +461,7 @@ xfs_iroot_realloc(
ifp->if_broot_bytes = (int)new_size; ifp->if_broot_bytes = (int)new_size;
if (ifp->if_broot) if (ifp->if_broot)
ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
XFS_IFORK_SIZE(ip, whichfork)); xfs_inode_fork_size(ip, whichfork));
return; return;
} }
...@@ -491,7 +491,7 @@ xfs_idata_realloc( ...@@ -491,7 +491,7 @@ xfs_idata_realloc(
int64_t new_size = ifp->if_bytes + byte_diff; int64_t new_size = ifp->if_bytes + byte_diff;
ASSERT(new_size >= 0); ASSERT(new_size >= 0);
ASSERT(new_size <= XFS_IFORK_SIZE(ip, whichfork)); ASSERT(new_size <= xfs_inode_fork_size(ip, whichfork));
if (byte_diff == 0) if (byte_diff == 0)
return; return;
...@@ -614,7 +614,7 @@ xfs_iflush_fork( ...@@ -614,7 +614,7 @@ xfs_iflush_fork(
if ((iip->ili_fields & dataflag[whichfork]) && if ((iip->ili_fields & dataflag[whichfork]) &&
(ifp->if_bytes > 0)) { (ifp->if_bytes > 0)) {
ASSERT(ifp->if_u1.if_data != NULL); ASSERT(ifp->if_u1.if_data != NULL);
ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); ASSERT(ifp->if_bytes <= xfs_inode_fork_size(ip, whichfork));
memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes); memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes);
} }
break; break;
...@@ -633,7 +633,7 @@ xfs_iflush_fork( ...@@ -633,7 +633,7 @@ xfs_iflush_fork(
(ifp->if_broot_bytes > 0)) { (ifp->if_broot_bytes > 0)) {
ASSERT(ifp->if_broot != NULL); ASSERT(ifp->if_broot != NULL);
ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
XFS_IFORK_SIZE(ip, whichfork)); xfs_inode_fork_size(ip, whichfork));
xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes,
(xfs_bmdr_block_t *)cp, (xfs_bmdr_block_t *)cp,
XFS_DFORK_SIZE(dip, mp, whichfork)); XFS_DFORK_SIZE(dip, mp, whichfork));
......
...@@ -77,21 +77,8 @@ struct xfs_ifork { ...@@ -77,21 +77,8 @@ struct xfs_ifork {
/* /*
* Fork handling. * Fork handling.
*/ */
#define XFS_IFORK_BOFF(ip) ((int)((ip)->i_forkoff << 3))
#define XFS_IFORK_DSIZE(ip) \
(xfs_inode_has_attr_fork(ip) ? XFS_IFORK_BOFF(ip) : XFS_LITINO((ip)->i_mount))
#define XFS_IFORK_ASIZE(ip) \
(xfs_inode_has_attr_fork(ip) ? XFS_LITINO((ip)->i_mount) - XFS_IFORK_BOFF(ip) : 0)
#define XFS_IFORK_SIZE(ip,w) \
((w) == XFS_DATA_FORK ? \
XFS_IFORK_DSIZE(ip) : \
((w) == XFS_ATTR_FORK ? \
XFS_IFORK_ASIZE(ip) : \
0))
#define XFS_IFORK_MAXEXT(ip, w) \ #define XFS_IFORK_MAXEXT(ip, w) \
(XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) (xfs_inode_fork_size(ip, w) / sizeof(xfs_bmbt_rec_t))
static inline bool xfs_ifork_has_extents(struct xfs_ifork *ifp) static inline bool xfs_ifork_has_extents(struct xfs_ifork *ifp)
{ {
......
...@@ -52,8 +52,8 @@ xchk_symlink( ...@@ -52,8 +52,8 @@ xchk_symlink(
/* Inline symlink? */ /* Inline symlink? */
if (ifp->if_format == XFS_DINODE_FMT_LOCAL) { if (ifp->if_format == XFS_DINODE_FMT_LOCAL) {
if (len > XFS_IFORK_DSIZE(ip) || if (len > xfs_inode_data_fork_size(ip) ||
len > strnlen(ifp->if_u1.if_data, XFS_IFORK_DSIZE(ip))) len > strnlen(ifp->if_u1.if_data, xfs_inode_data_fork_size(ip)))
xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, 0); xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, 0);
goto out; goto out;
} }
......
...@@ -1321,7 +1321,7 @@ xfs_swap_extents_check_format( ...@@ -1321,7 +1321,7 @@ xfs_swap_extents_check_format(
*/ */
if (tifp->if_format == XFS_DINODE_FMT_BTREE) { if (tifp->if_format == XFS_DINODE_FMT_BTREE) {
if (xfs_inode_has_attr_fork(ip) && if (xfs_inode_has_attr_fork(ip) &&
XFS_BMAP_BMDR_SPACE(tifp->if_broot) > XFS_IFORK_BOFF(ip)) XFS_BMAP_BMDR_SPACE(tifp->if_broot) > xfs_inode_fork_boff(ip))
return -EINVAL; return -EINVAL;
if (tifp->if_nextents <= XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK)) if (tifp->if_nextents <= XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK))
return -EINVAL; return -EINVAL;
...@@ -1330,7 +1330,7 @@ xfs_swap_extents_check_format( ...@@ -1330,7 +1330,7 @@ xfs_swap_extents_check_format(
/* Reciprocal target->temp btree format checks */ /* Reciprocal target->temp btree format checks */
if (ifp->if_format == XFS_DINODE_FMT_BTREE) { if (ifp->if_format == XFS_DINODE_FMT_BTREE) {
if (xfs_inode_has_attr_fork(tip) && if (xfs_inode_has_attr_fork(tip) &&
XFS_BMAP_BMDR_SPACE(ip->i_df.if_broot) > XFS_IFORK_BOFF(tip)) XFS_BMAP_BMDR_SPACE(ip->i_df.if_broot) > xfs_inode_fork_boff(tip))
return -EINVAL; return -EINVAL;
if (ifp->if_nextents <= XFS_IFORK_MAXEXT(tip, XFS_DATA_FORK)) if (ifp->if_nextents <= XFS_IFORK_MAXEXT(tip, XFS_DATA_FORK))
return -EINVAL; return -EINVAL;
......
...@@ -102,6 +102,41 @@ xfs_ifork_ptr( ...@@ -102,6 +102,41 @@ xfs_ifork_ptr(
} }
} }
static inline unsigned int xfs_inode_fork_boff(struct xfs_inode *ip)
{
return ip->i_forkoff << 3;
}
static inline unsigned int xfs_inode_data_fork_size(struct xfs_inode *ip)
{
if (xfs_inode_has_attr_fork(ip))
return xfs_inode_fork_boff(ip);
return XFS_LITINO(ip->i_mount);
}
static inline unsigned int xfs_inode_attr_fork_size(struct xfs_inode *ip)
{
if (xfs_inode_has_attr_fork(ip))
return XFS_LITINO(ip->i_mount) - xfs_inode_fork_boff(ip);
return 0;
}
static inline unsigned int
xfs_inode_fork_size(
struct xfs_inode *ip,
int whichfork)
{
switch (whichfork) {
case XFS_DATA_FORK:
return xfs_inode_data_fork_size(ip);
case XFS_ATTR_FORK:
return xfs_inode_attr_fork_size(ip);
default:
return 0;
}
}
/* Convert from vfs inode to xfs inode */ /* Convert from vfs inode to xfs inode */
static inline struct xfs_inode *XFS_I(struct inode *inode) static inline struct xfs_inode *XFS_I(struct inode *inode)
{ {
......
...@@ -57,7 +57,7 @@ xfs_inode_item_data_fork_size( ...@@ -57,7 +57,7 @@ xfs_inode_item_data_fork_size(
ip->i_df.if_nextents > 0 && ip->i_df.if_nextents > 0 &&
ip->i_df.if_bytes > 0) { ip->i_df.if_bytes > 0) {
/* worst case, doesn't subtract delalloc extents */ /* worst case, doesn't subtract delalloc extents */
*nbytes += XFS_IFORK_DSIZE(ip); *nbytes += xfs_inode_data_fork_size(ip);
*nvecs += 1; *nvecs += 1;
} }
break; break;
...@@ -98,7 +98,7 @@ xfs_inode_item_attr_fork_size( ...@@ -98,7 +98,7 @@ xfs_inode_item_attr_fork_size(
ip->i_af.if_nextents > 0 && ip->i_af.if_nextents > 0 &&
ip->i_af.if_bytes > 0) { ip->i_af.if_bytes > 0) {
/* worst case, doesn't subtract unused space */ /* worst case, doesn't subtract unused space */
*nbytes += XFS_IFORK_ASIZE(ip); *nbytes += xfs_inode_attr_fork_size(ip);
*nvecs += 1; *nvecs += 1;
} }
break; break;
......
...@@ -112,7 +112,7 @@ xfs_bulkstat_one_int( ...@@ -112,7 +112,7 @@ xfs_bulkstat_one_int(
xfs_bulkstat_health(ip, buf); xfs_bulkstat_health(ip, buf);
buf->bs_aextents = xfs_ifork_nextents(&ip->i_af); buf->bs_aextents = xfs_ifork_nextents(&ip->i_af);
buf->bs_forkoff = XFS_IFORK_BOFF(ip); buf->bs_forkoff = xfs_inode_fork_boff(ip);
buf->bs_version = XFS_BULKSTAT_VERSION_V5; buf->bs_version = XFS_BULKSTAT_VERSION_V5;
if (xfs_has_v3inodes(mp)) { if (xfs_has_v3inodes(mp)) {
......
...@@ -256,7 +256,7 @@ xfs_symlink( ...@@ -256,7 +256,7 @@ xfs_symlink(
/* /*
* If the symlink will fit into the inode, write it inline. * If the symlink will fit into the inode, write it inline.
*/ */
if (pathlen <= XFS_IFORK_DSIZE(ip)) { if (pathlen <= xfs_inode_data_fork_size(ip)) {
xfs_init_local_fork(ip, XFS_DATA_FORK, target_path, pathlen); xfs_init_local_fork(ip, XFS_DATA_FORK, target_path, pathlen);
ip->i_disk_size = pathlen; ip->i_disk_size = pathlen;
......
...@@ -2171,7 +2171,7 @@ DECLARE_EVENT_CLASS(xfs_swap_extent_class, ...@@ -2171,7 +2171,7 @@ DECLARE_EVENT_CLASS(xfs_swap_extent_class,
__entry->format = ip->i_df.if_format; __entry->format = ip->i_df.if_format;
__entry->nex = ip->i_df.if_nextents; __entry->nex = ip->i_df.if_nextents;
__entry->broot_size = ip->i_df.if_broot_bytes; __entry->broot_size = ip->i_df.if_broot_bytes;
__entry->fork_off = XFS_IFORK_BOFF(ip); __entry->fork_off = xfs_inode_fork_boff(ip);
), ),
TP_printk("dev %d:%d ino 0x%llx (%s), %s format, num_extents %llu, " TP_printk("dev %d:%d ino 0x%llx (%s), %s format, num_extents %llu, "
"broot size %d, forkoff 0x%x", "broot size %d, forkoff 0x%x",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册