From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> 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@xxxxxxxxxx> --- 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) {