forked from Minki/linux
xfs: refactor xfs_inode_item_size
Split out two helpers to size the data and attribute to make the function more readable. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
7aeb722241
commit
ce9641d6c9
@ -39,6 +39,85 @@ static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip)
|
||||
return container_of(lip, struct xfs_inode_log_item, ili_item);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_inode_item_data_fork_size(
|
||||
struct xfs_inode_log_item *iip,
|
||||
int *nvecs,
|
||||
int *nbytes)
|
||||
{
|
||||
struct xfs_inode *ip = iip->ili_inode;
|
||||
|
||||
switch (ip->i_d.di_format) {
|
||||
case XFS_DINODE_FMT_EXTENTS:
|
||||
if ((iip->ili_fields & XFS_ILOG_DEXT) &&
|
||||
ip->i_d.di_nextents > 0 &&
|
||||
ip->i_df.if_bytes > 0) {
|
||||
/* worst case, doesn't subtract delalloc extents */
|
||||
*nbytes += XFS_IFORK_DSIZE(ip);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
case XFS_DINODE_FMT_BTREE:
|
||||
if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
|
||||
ip->i_df.if_broot_bytes > 0) {
|
||||
*nbytes += ip->i_df.if_broot_bytes;
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
if ((iip->ili_fields & XFS_ILOG_DDATA) &&
|
||||
ip->i_df.if_bytes > 0) {
|
||||
*nbytes += roundup(ip->i_df.if_bytes, 4);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_DEV:
|
||||
case XFS_DINODE_FMT_UUID:
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_inode_item_attr_fork_size(
|
||||
struct xfs_inode_log_item *iip,
|
||||
int *nvecs,
|
||||
int *nbytes)
|
||||
{
|
||||
struct xfs_inode *ip = iip->ili_inode;
|
||||
|
||||
switch (ip->i_d.di_aformat) {
|
||||
case XFS_DINODE_FMT_EXTENTS:
|
||||
if ((iip->ili_fields & XFS_ILOG_AEXT) &&
|
||||
ip->i_d.di_anextents > 0 &&
|
||||
ip->i_afp->if_bytes > 0) {
|
||||
/* worst case, doesn't subtract unused space */
|
||||
*nbytes += XFS_IFORK_ASIZE(ip);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
case XFS_DINODE_FMT_BTREE:
|
||||
if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
|
||||
ip->i_afp->if_broot_bytes > 0) {
|
||||
*nbytes += ip->i_afp->if_broot_bytes;
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
if ((iip->ili_fields & XFS_ILOG_ADATA) &&
|
||||
ip->i_afp->if_bytes > 0) {
|
||||
*nbytes += roundup(ip->i_afp->if_bytes, 4);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This returns the number of iovecs needed to log the given inode item.
|
||||
@ -60,80 +139,9 @@ xfs_inode_item_size(
|
||||
*nbytes += sizeof(struct xfs_inode_log_format) +
|
||||
xfs_icdinode_size(ip->i_d.di_version);
|
||||
|
||||
switch (ip->i_d.di_format) {
|
||||
case XFS_DINODE_FMT_EXTENTS:
|
||||
if ((iip->ili_fields & XFS_ILOG_DEXT) &&
|
||||
ip->i_d.di_nextents > 0 &&
|
||||
ip->i_df.if_bytes > 0) {
|
||||
/* worst case, doesn't subtract delalloc extents */
|
||||
*nbytes += XFS_IFORK_DSIZE(ip);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_BTREE:
|
||||
if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
|
||||
ip->i_df.if_broot_bytes > 0) {
|
||||
*nbytes += ip->i_df.if_broot_bytes;
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
if ((iip->ili_fields & XFS_ILOG_DDATA) &&
|
||||
ip->i_df.if_bytes > 0) {
|
||||
*nbytes += roundup(ip->i_df.if_bytes, 4);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_DEV:
|
||||
case XFS_DINODE_FMT_UUID:
|
||||
break;
|
||||
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!XFS_IFORK_Q(ip))
|
||||
return;
|
||||
|
||||
|
||||
/*
|
||||
* Log any necessary attribute data.
|
||||
*/
|
||||
switch (ip->i_d.di_aformat) {
|
||||
case XFS_DINODE_FMT_EXTENTS:
|
||||
if ((iip->ili_fields & XFS_ILOG_AEXT) &&
|
||||
ip->i_d.di_anextents > 0 &&
|
||||
ip->i_afp->if_bytes > 0) {
|
||||
/* worst case, doesn't subtract unused space */
|
||||
*nbytes += XFS_IFORK_ASIZE(ip);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_BTREE:
|
||||
if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
|
||||
ip->i_afp->if_broot_bytes > 0) {
|
||||
*nbytes += ip->i_afp->if_broot_bytes;
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
if ((iip->ili_fields & XFS_ILOG_ADATA) &&
|
||||
ip->i_afp->if_bytes > 0) {
|
||||
*nbytes += roundup(ip->i_afp->if_bytes, 4);
|
||||
*nvecs += 1;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
}
|
||||
xfs_inode_item_data_fork_size(iip, nvecs, nbytes);
|
||||
if (XFS_IFORK_Q(ip))
|
||||
xfs_inode_item_attr_fork_size(iip, nvecs, nbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user