Merge tag 'v5.10-rc1' into kvmarm-master/next
[linux-2.6-microblaze.git] / fs / xfs / xfs_inode.c
index 4962497..2bfbcf2 100644 (file)
@@ -698,6 +698,68 @@ out_unlock:
        return error;
 }
 
+/* Propagate di_flags from a parent inode to a child inode. */
+static void
+xfs_inode_inherit_flags(
+       struct xfs_inode        *ip,
+       const struct xfs_inode  *pip)
+{
+       unsigned int            di_flags = 0;
+       umode_t                 mode = VFS_I(ip)->i_mode;
+
+       if (S_ISDIR(mode)) {
+               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;
+               }
+               if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
+                       di_flags |= XFS_DIFLAG_PROJINHERIT;
+       } else if (S_ISREG(mode)) {
+               if ((pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) &&
+                   xfs_sb_version_hasrealtime(&ip->i_mount->m_sb))
+                       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_NOATIME) &&
+           xfs_inherit_noatime)
+               di_flags |= XFS_DIFLAG_NOATIME;
+       if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
+           xfs_inherit_nodump)
+               di_flags |= XFS_DIFLAG_NODUMP;
+       if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
+           xfs_inherit_sync)
+               di_flags |= XFS_DIFLAG_SYNC;
+       if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
+           xfs_inherit_nosymlinks)
+               di_flags |= XFS_DIFLAG_NOSYMLINKS;
+       if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) &&
+           xfs_inherit_nodefrag)
+               di_flags |= XFS_DIFLAG_NODEFRAG;
+       if (pip->i_d.di_flags & XFS_DIFLAG_FILESTREAM)
+               di_flags |= XFS_DIFLAG_FILESTREAM;
+
+       ip->i_d.di_flags |= di_flags;
+}
+
+/* Propagate di_flags2 from a parent inode to a child inode. */
+static void
+xfs_inode_inherit_flags2(
+       struct xfs_inode        *ip,
+       const struct xfs_inode  *pip)
+{
+       if (pip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) {
+               ip->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
+               ip->i_d.di_cowextsize = pip->i_d.di_cowextsize;
+       }
+       if (pip->i_d.di_flags2 & XFS_DIFLAG2_DAX)
+               ip->i_d.di_flags2 |= XFS_DIFLAG2_DAX;
+}
+
 /*
  * 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
@@ -841,54 +903,10 @@ xfs_ialloc(
                break;
        case S_IFREG:
        case S_IFDIR:
-               if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
-                       uint            di_flags = 0;
-
-                       if (S_ISDIR(mode)) {
-                               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;
-                               }
-                               if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
-                                       di_flags |= XFS_DIFLAG_PROJINHERIT;
-                       } else if (S_ISREG(mode)) {
-                               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_NOATIME) &&
-                           xfs_inherit_noatime)
-                               di_flags |= XFS_DIFLAG_NOATIME;
-                       if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
-                           xfs_inherit_nodump)
-                               di_flags |= XFS_DIFLAG_NODUMP;
-                       if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
-                           xfs_inherit_sync)
-                               di_flags |= XFS_DIFLAG_SYNC;
-                       if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
-                           xfs_inherit_nosymlinks)
-                               di_flags |= XFS_DIFLAG_NOSYMLINKS;
-                       if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) &&
-                           xfs_inherit_nodefrag)
-                               di_flags |= XFS_DIFLAG_NODEFRAG;
-                       if (pip->i_d.di_flags & XFS_DIFLAG_FILESTREAM)
-                               di_flags |= XFS_DIFLAG_FILESTREAM;
-
-                       ip->i_d.di_flags |= di_flags;
-               }
-               if (pip && (pip->i_d.di_flags2 & XFS_DIFLAG2_ANY)) {
-                       if (pip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) {
-                               ip->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
-                               ip->i_d.di_cowextsize = pip->i_d.di_cowextsize;
-                       }
-                       if (pip->i_d.di_flags2 & XFS_DIFLAG2_DAX)
-                               ip->i_d.di_flags2 |= XFS_DIFLAG2_DAX;
-               }
+               if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY))
+                       xfs_inode_inherit_flags(ip, pip);
+               if (pip && (pip->i_d.di_flags2 & XFS_DIFLAG2_ANY))
+                       xfs_inode_inherit_flags2(ip, pip);
                /* FALLTHROUGH */
        case S_IFLNK:
                ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS;
@@ -1516,17 +1534,10 @@ xfs_itruncate_extents_flags(
                if (error)
                        goto out;
 
-               /*
-                * Duplicate the transaction that has the permanent
-                * reservation and commit the old transaction.
-                */
+               /* free the just unmapped extents */
                error = xfs_defer_finish(&tp);
                if (error)
                        goto out;
-
-               error = xfs_trans_roll_inode(&tp, ip);
-               if (error)
-                       goto out;
        }
 
        if (whichfork == XFS_DATA_FORK) {