diff mbox series

xfs: revert 1baa2800e62d ("xfs: remove the unused XFS_ALLOC_USERDATA flag")

Message ID 20190923235224.GW2229799@magnolia (mailing list archive)
State Accepted
Headers show
Series xfs: revert 1baa2800e62d ("xfs: remove the unused XFS_ALLOC_USERDATA flag") | expand

Commit Message

Darrick J. Wong Sept. 23, 2019, 11:52 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

Revert this commit, as it caused periodic regressions in xfs/173 w/
1k blocks[1].

[1] https://lore.kernel.org/lkml/20190919014602.GN15734@shao2-debian/

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_alloc.h |    7 ++++---
 fs/xfs/libxfs/xfs_bmap.c  |    8 ++++++--
 2 files changed, 10 insertions(+), 5 deletions(-)

Comments

Brian Foster Sept. 24, 2019, 9:39 a.m. UTC | #1
On Mon, Sep 23, 2019 at 04:52:24PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Revert this commit, as it caused periodic regressions in xfs/173 w/
> 1k blocks[1].
> 
> [1] https://lore.kernel.org/lkml/20190919014602.GN15734@shao2-debian/
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  fs/xfs/libxfs/xfs_alloc.h |    7 ++++---
>  fs/xfs/libxfs/xfs_bmap.c  |    8 ++++++--
>  2 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h
> index 58fa85cec325..d6ed5d2c07c2 100644
> --- a/fs/xfs/libxfs/xfs_alloc.h
> +++ b/fs/xfs/libxfs/xfs_alloc.h
> @@ -81,9 +81,10 @@ typedef struct xfs_alloc_arg {
>  /*
>   * Defines for datatype
>   */
> -#define XFS_ALLOC_INITIAL_USER_DATA	(1 << 0)/* special case start of file */
> -#define XFS_ALLOC_USERDATA_ZERO		(1 << 1)/* zero extent on allocation */
> -#define XFS_ALLOC_NOBUSY		(1 << 2)/* Busy extents not allowed */
> +#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 */
>  
>  static inline bool
>  xfs_alloc_is_userdata(int datatype)
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index eaf2d4250a26..4edc25a2ba80 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -4042,8 +4042,12 @@ xfs_bmapi_allocate(
>  	 */
>  	if (!(bma->flags & XFS_BMAPI_METADATA)) {
>  		bma->datatype = XFS_ALLOC_NOBUSY;
> -		if (whichfork == XFS_DATA_FORK && bma->offset == 0)
> -			bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
> +		if (whichfork == XFS_DATA_FORK) {
> +			if (bma->offset == 0)
> +				bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
> +			else
> +				bma->datatype |= XFS_ALLOC_USERDATA;
> +		}
>  		if (bma->flags & XFS_BMAPI_ZERO)
>  			bma->datatype |= XFS_ALLOC_USERDATA_ZERO;
>  	}
Christoph Hellwig Sept. 24, 2019, 9:30 p.m. UTC | #2
Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>
Eric Sandeen Dec. 4, 2019, 4:59 p.m. UTC | #3
On 9/23/19 6:52 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Revert this commit, as it caused periodic regressions in xfs/173 w/
> 1k blocks[1].
> 
> [1] https://lore.kernel.org/lkml/20190919014602.GN15734@shao2-debian/
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Came across this randomly ... since there's no explanation in the changelog
as to /why/ this broke things, I think it's due to:

static inline bool
xfs_alloc_is_userdata(int datatype)
{
        return (datatype & ~XFS_ALLOC_NOBUSY) != 0;
}

which would previously have returned true if (datatype & XFS_ALLOC_USERDATA),
but without the any flag set returned false.  So failing to set
XFS_ALLOC_USERDATA indirectly changed the result of this test.

So, you're welcome, future code archaeologists.  :)

-Eric
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h
index 58fa85cec325..d6ed5d2c07c2 100644
--- a/fs/xfs/libxfs/xfs_alloc.h
+++ b/fs/xfs/libxfs/xfs_alloc.h
@@ -81,9 +81,10 @@  typedef struct xfs_alloc_arg {
 /*
  * Defines for datatype
  */
-#define XFS_ALLOC_INITIAL_USER_DATA	(1 << 0)/* special case start of file */
-#define XFS_ALLOC_USERDATA_ZERO		(1 << 1)/* zero extent on allocation */
-#define XFS_ALLOC_NOBUSY		(1 << 2)/* Busy extents not allowed */
+#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 */
 
 static inline bool
 xfs_alloc_is_userdata(int datatype)
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index eaf2d4250a26..4edc25a2ba80 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -4042,8 +4042,12 @@  xfs_bmapi_allocate(
 	 */
 	if (!(bma->flags & XFS_BMAPI_METADATA)) {
 		bma->datatype = XFS_ALLOC_NOBUSY;
-		if (whichfork == XFS_DATA_FORK && bma->offset == 0)
-			bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
+		if (whichfork == XFS_DATA_FORK) {
+			if (bma->offset == 0)
+				bma->datatype |= XFS_ALLOC_INITIAL_USER_DATA;
+			else
+				bma->datatype |= XFS_ALLOC_USERDATA;
+		}
 		if (bma->flags & XFS_BMAPI_ZERO)
 			bma->datatype |= XFS_ALLOC_USERDATA_ZERO;
 	}