[PATCH 06/22] xfs: refactor kernel-specific parts of xfs_ialloc

Darrick J. Wong
2019-01-01T02:19:47Z

Move the kernel-specific parts of xfs_ialloc into a separate function in
preparation for hoisting xfs_ialloc to libxfs.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/xfs_inode.c | 45 ++++++++++++++++++++++++++++++++++++---------
1 file changed, 36 insertions(+), 9 deletions(-)

diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 403eb8fa2f1f..b635d43caeed 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -621,6 +621,32 @@ xfs_lookup(
return error;
}

+/* Return an exclusive ILOCK'd in-core inode. */
+static int
+xfs_ialloc_iget(
+ struct xfs_mount *mp,
+ struct xfs_trans *tp,
+ xfs_ino_t ino,
+ struct xfs_inode **ipp)
+{
+ return xfs_iget(mp, tp, ino, XFS_IGET_CREATE, XFS_ILOCK_EXCL, ipp);
+}
+
+/* Propagate platform-specific inode properties into the new child. */
+static void
+xfs_ialloc_platform_init(
+ struct xfs_trans *tp,
+ const struct xfs_ialloc_args *args,
+ struct xfs_inode *ip)
+{
+ struct timespec64 tv;
+
+ tv = current_time(VFS_I(ip));
+ VFS_I(ip)->i_mtime = tv;
+ VFS_I(ip)->i_atime = tv;
+ VFS_I(ip)->i_ctime = tv;
+}
+
/*
* Allocate an inode on disk and return a copy of its in-core version.
* The in-core inode is locked exclusively. Set mode, nlink, and rdev
@@ -666,7 +692,6 @@ xfs_ialloc(
xfs_ino_t ino;
uint flags;
int error;
- struct timespec64 tv;

/*
* Call the space management code to pick
@@ -699,8 +724,7 @@ xfs_ialloc(
* This is because we're setting fields here we need
* to prevent others from looking at until we're done.
*/
- error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE,
- XFS_ILOCK_EXCL, &ip);
+ error = xfs_ialloc_iget(mp, tp, ino, &ip);
if (error)
return error;
ASSERT(ip != NULL);
@@ -741,10 +765,12 @@ xfs_ialloc(
ip->i_d.di_nextents = 0;
ASSERT(ip->i_d.di_nblocks == 0);

- tv = current_time(inode);
- inode->i_mtime = tv;
- inode->i_atime = tv;
- inode->i_ctime = tv;
+ inode->i_mtime.tv_sec = 0;
+ inode->i_mtime.tv_nsec = 0;
+ inode->i_atime.tv_sec = 0;
+ inode->i_atime.tv_nsec = 0;
+ inode->i_ctime.tv_sec = 0;
+ inode->i_ctime.tv_nsec = 0;

ip->i_d.di_extsize = 0;
ip->i_d.di_dmevmask = 0;
@@ -755,10 +781,11 @@ xfs_ialloc(
inode_set_iversion(inode, 1);
ip->i_d.di_flags2 = 0;
ip->i_d.di_cowextsize = 0;
- ip->i_d.di_crtime.t_sec = (int32_t)tv.tv_sec;
- ip->i_d.di_crtime.t_nsec = (int32_t)tv.tv_nsec;
+ ip->i_d.di_crtime.t_sec = 0;
+ ip->i_d.di_crtime.t_nsec = 0;
}

+ xfs_ialloc_platform_init(tp, args, ip);

flags = XFS_ILOG_CORE;
switch (args->mode & S_IFMT) {