]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: refactor inode flags propagation code
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 30 Sep 2020 14:59:15 +0000 (10:59 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 30 Sep 2020 14:59:15 +0000 (10:59 -0400)
Hoist the code that propagates di_flags from a parent to a new child
into a separate function.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/util.c

index 85907d16372bdb0453f61ecf17c004436a221869..3967ef1bd816c2393b5dd778d18638571be47907 100644 (file)
@@ -207,6 +207,36 @@ xfs_flags2diflags2(
        return di_flags2;
 }
 
+/* Propagate di_flags from a parent inode to a child inode. */
+static void
+xfs_inode_propagate_flags(
+       struct xfs_inode        *ip,
+       const struct xfs_inode  *pip)
+{
+       unsigned int            di_flags = 0;
+       umode_t                 mode = VFS_I(ip)->i_mode;
+
+       if ((mode & S_IFMT) == S_IFDIR) {
+               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
+                       di_flags |= XFS_DIFLAG_RTINHERIT;
+               if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
+                       di_flags |= XFS_DIFLAG_EXTSZINHERIT;
+                       ip->i_d.di_extsize = pip->i_d.di_extsize;
+               }
+       } else {
+               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
+                       di_flags |= XFS_DIFLAG_REALTIME;
+               }
+               if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
+                       di_flags |= XFS_DIFLAG_EXTSIZE;
+                       ip->i_d.di_extsize = pip->i_d.di_extsize;
+               }
+       }
+       if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+               di_flags |= XFS_DIFLAG_PROJINHERIT;
+       ip->i_d.di_flags |= di_flags;
+}
+
 /*
  * Allocate an inode on disk and return a copy of its in-core version.
  * Set mode, nlink, and rdev appropriately within the inode.
@@ -299,29 +329,8 @@ libxfs_ialloc(
                break;
        case S_IFREG:
        case S_IFDIR:
-               if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
-                       uint    di_flags = 0;
-
-                       if ((mode & S_IFMT) == S_IFDIR) {
-                               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
-                                       di_flags |= XFS_DIFLAG_RTINHERIT;
-                               if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
-                                       di_flags |= XFS_DIFLAG_EXTSZINHERIT;
-                                       ip->i_d.di_extsize = pip->i_d.di_extsize;
-                               }
-                       } else {
-                               if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) {
-                                       di_flags |= XFS_DIFLAG_REALTIME;
-                               }
-                               if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
-                                       di_flags |= XFS_DIFLAG_EXTSIZE;
-                                       ip->i_d.di_extsize = pip->i_d.di_extsize;
-                               }
-                       }
-                       if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
-                               di_flags |= XFS_DIFLAG_PROJINHERIT;
-                       ip->i_d.di_flags |= di_flags;
-               }
+               if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY))
+                       xfs_inode_propagate_flags(ip, pip);
                /* FALLTHROUGH */
        case S_IFLNK:
                ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS;