]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: improve the IOMAP_NOWAIT check for COW inodes
authorChristoph Hellwig <hch@lst.de>
Sat, 19 Oct 2019 16:09:47 +0000 (09:09 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 21 Oct 2019 16:04:58 +0000 (09:04 -0700)
Only bail out once we know that a COW allocation is actually required,
similar to how we handle normal data fork allocations.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_iomap.c

index 6b429bfd5bb8271fd443047cc0f26218a4e42f1e..bf0c7756ac90403b76c0c780d59a782a91c068d0 100644 (file)
@@ -693,15 +693,8 @@ xfs_ilock_for_iomap(
         * COW writes may allocate delalloc space or convert unwritten COW
         * extents, so we need to make sure to take the lock exclusively here.
         */
-       if (xfs_is_cow_inode(ip) && is_write) {
-               /*
-                * FIXME: It could still overwrite on unshared extents and not
-                * need allocation.
-                */
-               if (flags & IOMAP_NOWAIT)
-                       return -EAGAIN;
+       if (xfs_is_cow_inode(ip) && is_write)
                mode = XFS_ILOCK_EXCL;
-       }
 
        /*
         * Extents not yet cached requires exclusive access, don't block.  This
@@ -769,12 +762,6 @@ xfs_direct_write_iomap_begin(
        if (offset + length > i_size_read(inode))
                iomap_flags |= IOMAP_F_DIRTY;
 
-       /*
-        * Lock the inode in the manner required for the specified operation and
-        * check for as many conditions that would result in blocking as
-        * possible. This removes most of the non-blocking checks from the
-        * mapping code below.
-        */
        error = xfs_ilock_for_iomap(ip, flags, &lockmode);
        if (error)
                return error;
@@ -784,11 +771,11 @@ xfs_direct_write_iomap_begin(
        if (error)
                goto out_unlock;
 
-       /*
-        * Break shared extents if necessary. Checks for non-blocking IO have
-        * been done up front, so we don't need to do them here.
-        */
        if (imap_needs_cow(ip, flags, &imap, nimaps)) {
+               error = -EAGAIN;
+               if (flags & IOMAP_NOWAIT)
+                       goto out_unlock;
+
                /* may drop and re-acquire the ilock */
                error = xfs_reflink_allocate_cow(ip, &imap, &cmap, &shared,
                                &lockmode, flags & IOMAP_DIRECT);