]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: set prealloc flag in xfs_alloc_file_space()
authorDave Chinner <dchinner@redhat.com>
Sat, 18 Mar 2023 10:15:20 +0000 (12:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Mar 2023 12:30:07 +0000 (13:30 +0100)
commit 0b02c8c0d75a738c98c35f02efb36217c170d78c upstream.

[backport for 5.10.y]

Now that we only call xfs_update_prealloc_flags() from
xfs_file_fallocate() in the case where we need to set the
preallocation flag, do this in xfs_alloc_file_space() where we
already have the inode joined into a transaction and get
rid of the call to xfs_update_prealloc_flags() from the fallocate
code.

This also means that we now correctly avoid setting the
XFS_DIFLAG_PREALLOC flag when xfs_is_always_cow_inode() is true, as
these inodes will never have preallocated extents.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_file.c

index 7371a7f7c652943ea4b06baef0dea79de1ace5db..fbab1042bc90b7e5d83912a2124136a41dec9daf 100644 (file)
@@ -800,9 +800,6 @@ xfs_alloc_file_space(
                        quota_flag = XFS_QMOPT_RES_REGBLKS;
                }
 
-               /*
-                * Allocate and setup the transaction.
-                */
                error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks,
                                resrtextents, 0, &tp);
 
@@ -830,9 +827,9 @@ xfs_alloc_file_space(
                if (error)
                        goto error0;
 
-               /*
-                * Complete the transaction
-                */
+               ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC;
+               xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+
                error = xfs_trans_commit(tp);
                xfs_iunlock(ip, XFS_ILOCK_EXCL);
                if (error)
index a95af57a59a7cb438939069bc2f87fffcd4d047d..9b6c5ba5fdfb6d1cb792c78b18fb08f879df71dd 100644 (file)
@@ -850,7 +850,6 @@ xfs_file_fallocate(
        struct inode            *inode = file_inode(file);
        struct xfs_inode        *ip = XFS_I(inode);
        long                    error;
-       enum xfs_prealloc_flags flags = 0;
        uint                    iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
        loff_t                  new_size = 0;
        bool                    do_file_insert = false;
@@ -948,8 +947,6 @@ xfs_file_fallocate(
                }
                do_file_insert = true;
        } else {
-               flags |= XFS_PREALLOC_SET;
-
                if (!(mode & FALLOC_FL_KEEP_SIZE) &&
                    offset + len > i_size_read(inode)) {
                        new_size = offset + len;
@@ -1000,11 +997,6 @@ xfs_file_fallocate(
                        if (error)
                                goto out_unlock;
                }
-
-               error = xfs_update_prealloc_flags(ip, XFS_PREALLOC_SET);
-               if (error)
-                       goto out_unlock;
-
        }
 
        /* Change file size if needed */