]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs_scrub: print systemd service names
authorDarrick J. Wong <djwong@kernel.org>
Thu, 5 Mar 2026 21:41:14 +0000 (13:41 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 9 Apr 2026 22:30:18 +0000 (15:30 -0700)
Add a hidden switch to xfs_scrub to emit systemd service names for XFS
services targetting filesystems paths instead of opencoding the
computation in things like fstests.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
scrub/Makefile
scrub/xfs_scrub.c
scrub/xfs_scrub.h

index aee49bfce100e22c073d1da49f56cb18f2dd5ad6..f74cfa9a235d4f0f85c27de183effb6347e4f139 100644 (file)
@@ -8,9 +8,12 @@ include $(builddefs)
 
 SCRUB_PREREQS=$(HAVE_GETFSMAP)
 
-scrub_media_svcname=xfs_scrub_media@.service
+XFS_SCRUB_MEDIA_SVCNAME=xfs_scrub_media@.service
 
 ifeq ($(SCRUB_PREREQS),yes)
+CFLAGS+=-DXFS_SCRUB_SVCNAME=\"$(XFS_SCRUB_SVCNAME)\"
+CFLAGS+=-DXFS_SCRUB_MEDIA_SVCNAME=\"$(XFS_SCRUB_MEDIA_SVCNAME)\"
+
 LTCOMMAND = xfs_scrub
 INSTALL_SCRUB = install-scrub
 XFS_SCRUB_ALL_PROG = xfs_scrub_all.py
@@ -22,7 +25,7 @@ INSTALL_SCRUB += install-systemd
 SYSTEMD_SERVICES=\
        $(XFS_SCRUB_SVCNAME) \
        xfs_scrub_fail@.service \
-       $(scrub_media_svcname) \
+       $(XFS_SCRUB_MEDIA_SVCNAME) \
        xfs_scrub_media_fail@.service \
        xfs_scrub_all.service \
        xfs_scrub_all_fail.service \
@@ -123,7 +126,7 @@ $(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs) $(TOPDIR)/libfrog/g
        @echo "    [SED]    $@"
        $(Q)$(SED) -e "s|@sbindir@|$(PKG_SBIN_DIR)|g" \
                   -e "s|@scrub_svcname@|$(XFS_SCRUB_SVCNAME)|g" \
-                  -e "s|@scrub_media_svcname@|$(scrub_media_svcname)|g" \
+                  -e "s|@scrub_media_svcname@|$(XFS_SCRUB_MEDIA_SVCNAME)|g" \
                   -e "s|@pkg_version@|$(PKG_VERSION)|g" \
                   -e "s|@stampfile@|$(XFS_SCRUB_ALL_AUTO_MEDIA_SCAN_STAMP)|g" \
                   -e "s|@scrub_service_args@|$(XFS_SCRUB_SERVICE_ARGS)|g" \
index 79937aa8cce4c46e33718c36ee01bf1e9b7e166a..b74dc1635141aa14e6745b941f3376920430dc98 100644 (file)
@@ -710,6 +710,13 @@ parse_o_opts(
        }
 }
 
+enum long_opt_nr {
+       LOPT_HELP,
+       LOPT_SVCNAME,
+
+       LOPT_MAX,
+};
+
 int
 main(
        int                     argc,
@@ -717,11 +724,15 @@ main(
 {
        struct scrub_ctx        ctx = {
                .fstrim_block_pct = FSTRIM_BLOCK_PCT_DEFAULT,
+               .lock           = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER,
+               .mode           = SCRUB_MODE_REPAIR,
+               .error_action   = ERRORS_CONTINUE,
        };
        struct phase_rusage     all_pi;
        char                    *mtab = NULL;
        FILE                    *progress_fp = NULL;
        struct fs_path          *fsp;
+       int                     option_index;
        int                     vflag = 0;
        int                     c;
        int                     fd;
@@ -742,11 +753,25 @@ main(
                goto out_unicrash;
        }
 
-       pthread_mutex_init(&ctx.lock, NULL);
-       ctx.mode = SCRUB_MODE_REPAIR;
-       ctx.error_action = ERRORS_CONTINUE;
-       while ((c = getopt(argc, argv, "a:bC:de:kM:m:no:pTvxV")) != EOF) {
+       struct option long_options[] = {
+               [LOPT_HELP]        = {"help", no_argument, NULL, 0 },
+               [LOPT_SVCNAME]     = {"svcname", no_argument, &ctx.print_svcname, 1 },
+
+               [LOPT_MAX]         = {NULL, 0, NULL, 0 },
+       };
+
+       while ((c = getopt_long(argc, argv, "a:bC:de:kM:m:no:pTvxV",
+                               long_options, &option_index)) != EOF) {
                switch (c) {
+               case 0:
+                       switch (option_index) {
+                       case LOPT_HELP:
+                               usage();
+                               break;
+                       default:
+                               break;
+                       }
+                       break;
                case 'a':
                        ctx.max_errors = cvt_u64(optarg, 10);
                        if (errno) {
@@ -860,6 +885,23 @@ main(
        if (!ctx.actual_mntpoint)
                ctx.actual_mntpoint = ctx.mntpoint;
 
+       if (ctx.print_svcname) {
+               char            unitname[PATH_MAX];
+               const char      *template =
+                       scrub_data ? XFS_SCRUB_MEDIA_SVCNAME :
+                                    XFS_SCRUB_SVCNAME;
+
+               ret = systemd_path_instance_unit_name(template,
+                               ctx.mntpoint, unitname, sizeof(unitname));
+               if (ret) {
+                       perror(ctx.mntpoint);
+                       return EXIT_FAILURE;
+               }
+
+               printf("%s\n", unitname);
+               return EXIT_SUCCESS;
+       }
+
        stdout_isatty = isatty(STDOUT_FILENO);
        stderr_isatty = isatty(STDERR_FILENO);
 
index 6ee359f4cebd476373760c00575fd81ce2ca4174..041c0fadaa93c046d59bcd5e508c14f819756300 100644 (file)
@@ -108,6 +108,9 @@ struct scrub_ctx {
         * this much space per volume.
         */
        double                  fstrim_block_pct;
+
+       /* CLI options, must be int */
+       int                     print_svcname;
 };
 
 /*