// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2004 Silicon Graphics, Inc. * All Rights Reserved. */ #include #include "global.h" static char *xprogname; static void usage(void) { fprintf(stderr, "usage: %s [-f] [-v] mnt-dir\n", xprogname); } int main(int argc, char *argv[]) { int c; int flag; int flushlog_opt = 0; int verbose_opt = 0; struct stat st; char *mnt_dir; int fd; xprogname = argv[0]; while ((c = getopt(argc, argv, "fv")) != -1) { switch (c) { case 'f': flushlog_opt = 1; break; case 'v': verbose_opt = 1; break; case '?': usage(); return 1; } } /* process required cmd argument */ if (optind == argc-1) { mnt_dir = argv[optind]; } else { usage(); return 1; } if ((stat(mnt_dir, &st)) == -1) { fprintf(stderr, "%s: error on stat \"%s\": %s\n", xprogname, mnt_dir, strerror(errno)); return 1; } if (!S_ISDIR(st.st_mode)) { fprintf(stderr, "%s: argument \"%s\" is not a directory\n", xprogname, mnt_dir); return 1; } #if 0 { struct statvfs stvfs; if ((statvfs(mnt_dir, &stvfs)) == -1) { fprintf(stderr, "%s: error on statfs \"%s\": %s\n", xprogname, mnt_dir, strerror(errno)); return 1; } if (strcmp(stvfs.f_basetype, "xfs") != 0) { fprintf(stderr, "%s: filesys for \"%s\" is not XFS:\"%s\"\n", xprogname, mnt_dir, stvfs.f_basetype); return 1; } } #endif flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH : XFS_FSOP_GOING_FLAGS_NOLOGFLUSH); if (verbose_opt) { printf("Opening \"%s\"\n", mnt_dir); } if ((fd = open(mnt_dir, O_RDONLY)) == -1) { fprintf(stderr, "%s: error on open of \"%s\": %s\n", xprogname, mnt_dir, strerror(errno)); return 1; } if (verbose_opt) { printf("Calling XFS_IOC_GOINGDOWN\n"); } syslog(LOG_WARNING, "xfstests-induced forced shutdown of %s:\n", mnt_dir); if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) { fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n", xprogname, mnt_dir, strerror(errno)); return 1; } close(fd); return 0; }