From: Darrick J. Wong Date: Thu, 5 Mar 2026 21:41:14 +0000 (-0800) Subject: xfs_scrub: print systemd service names X-Git-Tag: v7.0.0~35 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=99a6f427c4fd16047bcb7ba7a3ce35929b5b9e59;p=xfsprogs-dev.git xfs_scrub: print systemd service names 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" Reviewed-by: Christoph Hellwig --- diff --git a/scrub/Makefile b/scrub/Makefile index aee49bfc..f74cfa9a 100644 --- a/scrub/Makefile +++ b/scrub/Makefile @@ -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" \ diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c index 79937aa8..b74dc163 100644 --- a/scrub/xfs_scrub.c +++ b/scrub/xfs_scrub.c @@ -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); diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h index 6ee359f4..041c0fad 100644 --- a/scrub/xfs_scrub.h +++ b/scrub/xfs_scrub.h @@ -108,6 +108,9 @@ struct scrub_ctx { * this much space per volume. */ double fstrim_block_pct; + + /* CLI options, must be int */ + int print_svcname; }; /*