|
@@ -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,13 +113,37 @@ xfs_inode_item_size(
|
|
|
*nvecs += 1;
|
|
|
}
|
|
|
break;
|
|
|
-
|
|
|
default:
|
|
|
ASSERT(0);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * 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
|
|
|
*
|