Patch "xfs: Fix the owner setting issue for rmap query in xfs fsmap" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    xfs: Fix the owner setting issue for rmap query in xfs fsmap

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     xfs-fix-the-owner-setting-issue-for-rmap-query-in-xf.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a528c8c4f587c396cfff6678f90dbf8efbbbbca1
Author: Zizhi Wo <wozizhi@xxxxxxxxxx>
Date:   Wed Dec 18 11:17:22 2024 -0800

    xfs: Fix the owner setting issue for rmap query in xfs fsmap
    
    commit 68415b349f3f16904f006275757f4fcb34b8ee43 upstream.
    
    I notice a rmap query bug in xfs_io fsmap:
    [root@fedora ~]# xfs_io -c 'fsmap -vvvv' /mnt
     EXT: DEV    BLOCK-RANGE           OWNER              FILE-OFFSET      AG AG-OFFSET             TOTAL
       0: 253:16 [0..7]:               static fs metadata                  0  (0..7)                    8
       1: 253:16 [8..23]:              per-AG metadata                     0  (8..23)                  16
       2: 253:16 [24..39]:             inode btree                         0  (24..39)                 16
       3: 253:16 [40..47]:             per-AG metadata                     0  (40..47)                  8
       4: 253:16 [48..55]:             refcount btree                      0  (48..55)                  8
       5: 253:16 [56..103]:            per-AG metadata                     0  (56..103)                48
       6: 253:16 [104..127]:           free space                          0  (104..127)               24
       ......
    
    Bug:
    [root@fedora ~]# xfs_io -c 'fsmap -vvvv -d 0 3' /mnt
    [root@fedora ~]#
    Normally, we should be able to get one record, but we got nothing.
    
    The root cause of this problem lies in the incorrect setting of rm_owner in
    the rmap query. In the case of the initial query where the owner is not
    set, __xfs_getfsmap_datadev() first sets info->high.rm_owner to ULLONG_MAX.
    This is done to prevent any omissions when comparing rmap items. However,
    if the current ag is detected to be the last one, the function sets info's
    high_irec based on the provided key. If high->rm_owner is not specified, it
    should continue to be set to ULLONG_MAX; otherwise, there will be issues
    with interval omissions. For example, consider "start" and "end" within the
    same block. If high->rm_owner == 0, it will be smaller than the founded
    record in rmapbt, resulting in a query with no records. The main call stack
    is as follows:
    
    xfs_ioc_getfsmap
      xfs_getfsmap
        xfs_getfsmap_datadev_rmapbt
          __xfs_getfsmap_datadev
            info->high.rm_owner = ULLONG_MAX
            if (pag->pag_agno == end_ag)
              xfs_fsmap_owner_to_rmap
                // set info->high.rm_owner = 0 because fmr_owner == -1ULL
                dest->rm_owner = 0
            // get nothing
            xfs_getfsmap_datadev_rmapbt_query
    
    The problem can be resolved by simply modify the xfs_fsmap_owner_to_rmap
    function internal logic to achieve.
    
    After applying this patch, the above problem have been solved:
    [root@fedora ~]# xfs_io -c 'fsmap -vvvv -d 0 3' /mnt
     EXT: DEV    BLOCK-RANGE      OWNER              FILE-OFFSET      AG AG-OFFSET        TOTAL
       0: 253:16 [0..7]:          static fs metadata                  0  (0..7)               8
    
    Fixes: e89c041338ed ("xfs: implement the GETFSMAP ioctl")
    Signed-off-by: Zizhi Wo <wozizhi@xxxxxxxxxx>
    Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx>
    Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx>
    Signed-off-by: Chandan Babu R <chandanbabu@xxxxxxxxxx>
    Signed-off-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx>
    Acked-by: Darrick J. Wong <djwong@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c
index 8982c5d6cbd0..85953dbd4283 100644
--- a/fs/xfs/xfs_fsmap.c
+++ b/fs/xfs/xfs_fsmap.c
@@ -71,7 +71,7 @@ xfs_fsmap_owner_to_rmap(
 	switch (src->fmr_owner) {
 	case 0:			/* "lowest owner id possible" */
 	case -1ULL:		/* "highest owner id possible" */
-		dest->rm_owner = 0;
+		dest->rm_owner = src->fmr_owner;
 		break;
 	case XFS_FMR_OWN_FREE:
 		dest->rm_owner = XFS_RMAP_OWN_NULL;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux