xfs: refactor xfs_inode_item_size
authorChristoph Hellwig <hch@infradead.org>
Fri, 13 Dec 2013 00:00:43 +0000 (11:00 +1100)
committerDave Chinner <david@fromorbit.com>
Fri, 13 Dec 2013 00:00:43 +0000 (11:00 +1100)
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>
fs/xfs/xfs_inode_item.c

index 7c0d391..050d254 100644 (file)
@@ -39,27 +39,14 @@ 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);
 }
 
-
-/*
- * This returns the number of iovecs needed to log the given inode item.
- *
- * We need one iovec for the inode log format structure, one for the
- * inode core, and possibly one for the inode data/extents/b-tree root
- * and one for the inode attribute data/extents/b-tree root.
- */
 STATIC void
-xfs_inode_item_size(
-       struct xfs_log_item     *lip,
+xfs_inode_item_data_fork_size(
+       struct xfs_inode_log_item *iip,
        int                     *nvecs,
        int                     *nbytes)
 {
-       struct xfs_inode_log_item *iip = INODE_ITEM(lip);
        struct xfs_inode        *ip = iip->ili_inode;
 
-       *nvecs += 2;
-       *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) &&
@@ -70,7 +57,6 @@ xfs_inode_item_size(
                        *nvecs += 1;
                }
                break;
-
        case XFS_DINODE_FMT_BTREE:
                if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
                    ip->i_df.if_broot_bytes > 0) {
@@ -78,7 +64,6 @@ xfs_inode_item_size(
                        *nvecs += 1;
                }
                break;
-
        case XFS_DINODE_FMT_LOCAL:
                if ((iip->ili_fields & XFS_ILOG_DDATA) &&
                    ip->i_df.if_bytes > 0) {
@@ -90,19 +75,20 @@ xfs_inode_item_size(
        case XFS_DINODE_FMT_DEV:
        case XFS_DINODE_FMT_UUID:
                break;
-
        default:
                ASSERT(0);
                break;
        }
+}
 
-       if (!XFS_IFORK_Q(ip))
-               return;
-
+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;
 
-       /*
-        * Log any necessary attribute data.
-        */
        switch (ip->i_d.di_aformat) {
        case XFS_DINODE_FMT_EXTENTS:
                if ((iip->ili_fields & XFS_ILOG_AEXT) &&
@@ -113,7 +99,6 @@ xfs_inode_item_size(
                        *nvecs += 1;
                }
                break;
-
        case XFS_DINODE_FMT_BTREE:
                if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
                    ip->i_afp->if_broot_bytes > 0) {
@@ -121,7 +106,6 @@ xfs_inode_item_size(
                        *nvecs += 1;
                }
                break;
-
        case XFS_DINODE_FMT_LOCAL:
                if ((iip->ili_fields & XFS_ILOG_ADATA) &&
                    ip->i_afp->if_bytes > 0) {
@@ -129,7 +113,6 @@ xfs_inode_item_size(
                        *nvecs += 1;
                }
                break;
-
        default:
                ASSERT(0);
                break;
@@ -137,6 +120,31 @@ xfs_inode_item_size(
 }
 
 /*
+ * This returns the number of iovecs needed to log the given inode item.
+ *
+ * We need one iovec for the inode log format structure, one for the
+ * inode core, and possibly one for the inode data/extents/b-tree root
+ * and one for the inode attribute data/extents/b-tree root.
+ */
+STATIC void
+xfs_inode_item_size(
+       struct xfs_log_item     *lip,
+       int                     *nvecs,
+       int                     *nbytes)
+{
+       struct xfs_inode_log_item *iip = INODE_ITEM(lip);
+       struct xfs_inode        *ip = iip->ili_inode;
+
+       *nvecs += 2;
+       *nbytes += sizeof(struct xfs_inode_log_format) +
+                  xfs_icdinode_size(ip->i_d.di_version);
+
+       xfs_inode_item_data_fork_size(iip, nvecs, nbytes);
+       if (XFS_IFORK_Q(ip))
+               xfs_inode_item_attr_fork_size(iip, nvecs, nbytes);
+}
+
+/*
  * xfs_inode_item_format_extents - convert in-core extents to on-disk form
  *
  * For either the data or attr fork in extent format, we need to endian convert