OSDN Git Service

xfs: move extent zeroing to xfs_bmapi_allocate
authorChristoph Hellwig <hch@lst.de>
Wed, 30 Oct 2019 19:25:00 +0000 (12:25 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sun, 3 Nov 2019 18:22:30 +0000 (10:22 -0800)
Move the extent zeroing case there for the XFS_BMAPI_ZERO flag outside
the low-level allocator and into xfs_bmapi_allocate, where is still
is in transaction context, but outside the very lowlevel code where
it doesn't belong.

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/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/xfs_bmap_util.c

index 84866c1..0539d61 100644 (file)
@@ -3084,13 +3084,6 @@ xfs_alloc_vextent(
                        args->len);
 #endif
 
-               /* Zero the extent if we were asked to do so */
-               if (args->datatype & XFS_ALLOC_USERDATA_ZERO) {
-                       error = xfs_zero_extent(args->ip, args->fsbno, args->len);
-                       if (error)
-                               goto error0;
-               }
-
        }
        xfs_perag_put(args->pag);
        return 0;
index d6ed5d2..626384d 100644 (file)
@@ -54,7 +54,6 @@ typedef struct xfs_alloc_arg {
        struct xfs_mount *mp;           /* file system mount point */
        struct xfs_buf  *agbp;          /* buffer for a.g. freelist header */
        struct xfs_perag *pag;          /* per-ag struct for this agno */
-       struct xfs_inode *ip;           /* for userdata zeroing method */
        xfs_fsblock_t   fsbno;          /* file system block number */
        xfs_agnumber_t  agno;           /* allocation group number */
        xfs_agblock_t   agbno;          /* allocation group-relative block # */
@@ -83,8 +82,7 @@ typedef struct xfs_alloc_arg {
  */
 #define XFS_ALLOC_USERDATA             (1 << 0)/* allocation is for user data*/
 #define XFS_ALLOC_INITIAL_USER_DATA    (1 << 1)/* special case start of file */
-#define XFS_ALLOC_USERDATA_ZERO                (1 << 2)/* zero extent on allocation */
-#define XFS_ALLOC_NOBUSY               (1 << 3)/* Busy extents not allowed */
+#define XFS_ALLOC_NOBUSY               (1 << 2)/* Busy extents not allowed */
 
 static inline bool
 xfs_alloc_is_userdata(int datatype)
index 6af74f0..3fcc910 100644 (file)
@@ -3518,8 +3518,6 @@ xfs_bmap_btalloc(
        args.wasdel = ap->wasdel;
        args.resv = XFS_AG_RESV_NONE;
        args.datatype = ap->datatype;
-       if (ap->datatype & XFS_ALLOC_USERDATA_ZERO)
-               args.ip = ap->ip;
 
        error = xfs_alloc_vextent(&args);
        if (error)
@@ -3974,8 +3972,6 @@ xfs_bmap_alloc_userdata(
         * the busy list.
         */
        bma->datatype = XFS_ALLOC_NOBUSY;
-       if (bma->flags & XFS_BMAPI_ZERO)
-               bma->datatype |= XFS_ALLOC_USERDATA_ZERO;
        if (whichfork == XFS_DATA_FORK) {
                if (bma->offset == 0)
                        bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
@@ -4034,6 +4030,12 @@ xfs_bmapi_allocate(
        if (error || bma->blkno == NULLFSBLOCK)
                return error;
 
+       if (bma->flags & XFS_BMAPI_ZERO) {
+               error = xfs_zero_extent(bma->ip, bma->blkno, bma->length);
+               if (error)
+                       return error;
+       }
+
        if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur)
                bma->cur = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork);
        /*
index 4f7bce9..9d731b7 100644 (file)
@@ -165,13 +165,6 @@ xfs_bmap_rtalloc(
                xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
                        ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
                                        XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
-
-               /* Zero the extent if we were asked to do so */
-               if (ap->datatype & XFS_ALLOC_USERDATA_ZERO) {
-                       error = xfs_zero_extent(ap->ip, ap->blkno, ap->length);
-                       if (error)
-                               return error;
-               }
        } else {
                ap->length = 0;
        }