]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: scrub quota file metapaths
authorDarrick J. Wong <djwong@kernel.org>
Mon, 23 Sep 2024 20:41:41 +0000 (13:41 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 9 Oct 2024 13:55:43 +0000 (15:55 +0200)
Enable online fsck for quota file metadata directory paths.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_fs.h
fs/xfs/scrub/metapath.c

index 11ffd2ad7f1bb1b8d6efe2ca347b99a9a8ec5bc1..32f8af6d4b1fa45ef8bd853cc6c9f8751134077a 100644 (file)
@@ -826,9 +826,13 @@ struct xfs_scrub_vec_head {
 #define XFS_SCRUB_METAPATH_RTDIR       (1)  /* rtrgroups metadir */
 #define XFS_SCRUB_METAPATH_RTBITMAP    (2)  /* per-rtg bitmap */
 #define XFS_SCRUB_METAPATH_RTSUMMARY   (3)  /* per-rtg summary */
+#define XFS_SCRUB_METAPATH_QUOTADIR    (4)  /* quota metadir */
+#define XFS_SCRUB_METAPATH_USRQUOTA    (5)  /* user quota */
+#define XFS_SCRUB_METAPATH_GRPQUOTA    (6)  /* group quota */
+#define XFS_SCRUB_METAPATH_PRJQUOTA    (7)  /* project quota */
 
 /* Number of metapath sm_ino values */
-#define XFS_SCRUB_METAPATH_NR          (4)
+#define XFS_SCRUB_METAPATH_NR          (8)
 
 /*
  * ioctl limits
index b8e427fd7fa73e2a0019c82bc6998482f5ea577a..b78db651346518ebafc6b7bf1db9c776f7ad16c3 100644 (file)
@@ -165,6 +165,74 @@ out_put_rtg:
 # define xchk_setup_metapath_rtginode(...)     (-ENOENT)
 #endif /* CONFIG_XFS_RT */
 
+#ifdef CONFIG_XFS_QUOTA
+/* Scan the /quota directory itself. */
+static int
+xchk_setup_metapath_quotadir(
+       struct xfs_scrub        *sc)
+{
+       struct xfs_trans        *tp;
+       struct xfs_inode        *dp = NULL;
+       int                     error;
+
+       error = xfs_trans_alloc_empty(sc->mp, &tp);
+       if (error)
+               return error;
+
+       error = xfs_dqinode_load_parent(tp, &dp);
+       xfs_trans_cancel(tp);
+       if (error)
+               return error;
+
+       error = xchk_setup_metapath_scan(sc, sc->mp->m_metadirip,
+                       kasprintf(GFP_KERNEL, "quota"), dp);
+       xfs_irele(dp);
+       return error;
+}
+
+/* Scan a quota inode under the /quota directory. */
+static int
+xchk_setup_metapath_dqinode(
+       struct xfs_scrub        *sc,
+       xfs_dqtype_t            type)
+{
+       struct xfs_trans        *tp = NULL;
+       struct xfs_inode        *dp = NULL;
+       struct xfs_inode        *ip = NULL;
+       const char              *path;
+       int                     error;
+
+       error = xfs_trans_alloc_empty(sc->mp, &tp);
+       if (error)
+               return error;
+
+       error = xfs_dqinode_load_parent(tp, &dp);
+       if (error)
+               goto out_cancel;
+
+       error = xfs_dqinode_load(tp, dp, type, &ip);
+       if (error)
+               goto out_dp;
+
+       xfs_trans_cancel(tp);
+       tp = NULL;
+
+       path = kasprintf(GFP_KERNEL, "%s", xfs_dqinode_path(type));
+       error = xchk_setup_metapath_scan(sc, dp, path, ip);
+
+       xfs_irele(ip);
+out_dp:
+       xfs_irele(dp);
+out_cancel:
+       if (tp)
+               xfs_trans_cancel(tp);
+       return error;
+}
+#else
+# define xchk_setup_metapath_quotadir(...)     (-ENOENT)
+# define xchk_setup_metapath_dqinode(...)      (-ENOENT)
+#endif /* CONFIG_XFS_QUOTA */
+
 int
 xchk_setup_metapath(
        struct xfs_scrub        *sc)
@@ -186,6 +254,14 @@ xchk_setup_metapath(
                return xchk_setup_metapath_rtginode(sc, XFS_RTGI_BITMAP);
        case XFS_SCRUB_METAPATH_RTSUMMARY:
                return xchk_setup_metapath_rtginode(sc, XFS_RTGI_SUMMARY);
+       case XFS_SCRUB_METAPATH_QUOTADIR:
+               return xchk_setup_metapath_quotadir(sc);
+       case XFS_SCRUB_METAPATH_USRQUOTA:
+               return xchk_setup_metapath_dqinode(sc, XFS_DQTYPE_USER);
+       case XFS_SCRUB_METAPATH_GRPQUOTA:
+               return xchk_setup_metapath_dqinode(sc, XFS_DQTYPE_GROUP);
+       case XFS_SCRUB_METAPATH_PRJQUOTA:
+               return xchk_setup_metapath_dqinode(sc, XFS_DQTYPE_PROJ);
        default:
                return -ENOENT;
        }