Module Name: src Committed By: brad Date: Fri Aug 30 23:37:23 UTC 2019
Modified Files: src/libexec/lfs_cleanerd: lfs_cleanerd.8 lfs_cleanerd.c Log Message: Add support for passing the raw device name separate from the filesystem. This is useful in the case where the cleaner is compiled into code, such as rump_lfs and the ATF tests. This helps to fix bin/54488 To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/libexec/lfs_cleanerd/lfs_cleanerd.8 cvs rdiff -u -r1.59 -r1.60 src/libexec/lfs_cleanerd/lfs_cleanerd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/lfs_cleanerd/lfs_cleanerd.8 diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.8:1.18 src/libexec/lfs_cleanerd/lfs_cleanerd.8:1.19 --- src/libexec/lfs_cleanerd/lfs_cleanerd.8:1.18 Thu Aug 6 21:18:54 2009 +++ src/libexec/lfs_cleanerd/lfs_cleanerd.8 Fri Aug 30 23:37:23 2019 @@ -1,4 +1,4 @@ -.\" $NetBSD: lfs_cleanerd.8,v 1.18 2009/08/06 21:18:54 wiz Exp $ +.\" $NetBSD: lfs_cleanerd.8,v 1.19 2019/08/30 23:37:23 brad Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -39,9 +39,11 @@ .Nm .Op Fl bcDdfmqs .Op Fl i Ar segment-number +.Op Fl J Ar raw-device .Op Fl l Ar load-threshhold .Op Fl n Ar number-of-segments .Op Fl r Ar report-frequency +.Op Fl S Ar semaphore-address .Op Fl t Ar timeout .Pa node .Sh DESCRIPTION @@ -94,6 +96,12 @@ Invalidate the segment with segment numb This option is used by .Xr resize_lfs 8 , and should not be specified on the command line. +.It Fl J Ar raw device +Specify the raw device that the cleaner is to work against rather than +trying to figure it out from the mount point. This is mostly useful +when the cleaner is compiled into +.Xr rump_lfs 8 , +and the ATF test framework. .It Fl l Ar load-threshhold Clean more aggressively when the system load is below the given threshhold. The default threshhold is 0.2. @@ -112,6 +120,13 @@ Quit after cleaning once. Give an efficiency report after every .Ar report-frequency times through the main loop. +.It Fl S Ar semaphore address +When the cleaner code is compiled into +.Xr rump_lfs 8 , +and the ATF frame work, this option allows for a synchronization +semaphore to be specified. This option is not available in the +stand alone +.Xr lfs_cleanerd 8 . .It Fl s When cleaning the file system, send only a few blocks through lfs_markv at a time. @@ -132,7 +147,8 @@ to a low value. .Xr lfs_bmapv 2 , .Xr lfs_markv 2 , .Xr lfs_segwait 2 , -.Xr mount_lfs 8 +.Xr mount_lfs 8 , +.Xr rump_lfs 8 . .Sh HISTORY The .Nm Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.59 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.60 --- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.59 Thu Aug 22 20:28:08 2019 +++ src/libexec/lfs_cleanerd/lfs_cleanerd.c Fri Aug 30 23:37:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_cleanerd.c,v 1.59 2019/08/22 20:28:08 brad Exp $ */ +/* $NetBSD: lfs_cleanerd.c,v 1.60 2019/08/30 23:37:23 brad Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -76,6 +76,7 @@ int segwait_timeout; /* Time to wait in int do_quit; /* Quit after one cleaning loop */ int do_coalesce; /* Coalesce filesystem */ int do_small; /* Use small writes through markv */ +char *do_asdevice; /* Use this as the raw device */ char *copylog_filename; /* File to use for fs debugging analysis */ int inval_segment; /* Segment to invalidate */ int stat_report; /* Report statistics for this period of cycles */ @@ -165,7 +166,7 @@ init_unmounted_fs(struct clfs *fs, char { struct lfs *disc_fs; int i; - + fs->clfs_dev = fsname; if ((fs->clfs_devfd = kops.ko_open(fs->clfs_dev, O_RDWR)) < 0) { syslog(LOG_ERR, "couldn't open device %s read/write", @@ -215,26 +216,34 @@ init_fs(struct clfs *fs, char *fsname) void *sbuf; size_t mlen; - /* - * Get the raw device from the block device. - * XXX this is ugly. Is there a way to discover the raw device - * XXX for a given mount point? - */ - if (kops.ko_statvfs(fsname, &sf, ST_WAIT) < 0) - return -1; - mlen = strlen(sf.f_mntfromname) + 2; - fs->clfs_dev = malloc(mlen); - if (fs->clfs_dev == NULL) { - syslog(LOG_ERR, "couldn't malloc device name string: %m"); - return -1; - } - if (getdiskrawname(fs->clfs_dev, mlen, sf.f_mntfromname) == NULL) { - syslog(LOG_ERR, "couldn't convert '%s' ro raw name: %m", - sf.f_mntfromname); - return -1; + if (do_asdevice != NULL) { + fs->clfs_dev = strndup(do_asdevice,strlen(do_asdevice) + 2); + if (fs->clfs_dev == NULL) { + syslog(LOG_ERR, "couldn't malloc device name string: %m"); + return -1; + } + } else { + /* + * Get the raw device from the block device. + * XXX this is ugly. Is there a way to discover the raw device + * XXX for a given mount point? + */ + if (kops.ko_statvfs(fsname, &sf, ST_WAIT) < 0) + return -1; + mlen = strlen(sf.f_mntfromname) + 2; + fs->clfs_dev = malloc(mlen); + if (fs->clfs_dev == NULL) { + syslog(LOG_ERR, "couldn't malloc device name string: %m"); + return -1; + } + if (getdiskrawname(fs->clfs_dev, mlen, sf.f_mntfromname) == NULL) { + syslog(LOG_ERR, "couldn't convert '%s' to raw name: %m", + sf.f_mntfromname); + return -1; + } } if ((fs->clfs_devfd = kops.ko_open(fs->clfs_dev, O_RDONLY, 0)) < 0) { - syslog(LOG_ERR, "couldn't open device %s for reading", + syslog(LOG_ERR, "couldn't open device %s for reading: %m", fs->clfs_dev); return -1; } @@ -1440,7 +1449,7 @@ sig_exit(int sig) static void usage(void) { - errx(1, "usage: lfs_cleanerd [-bcdfmqs] [-i segnum] [-l load] " + fprintf(stderr, "usage: lfs_cleanerd [-bcdfmqsJ] [-i segnum] [-l load] " "[-n nsegs] [-r report_freq] [-t timeout] fs_name ..."); } @@ -1479,11 +1488,12 @@ lfs_cleaner_main(int argc, char **argv) inval_segment = -1; copylog_filename = NULL; nodetach = 0; + do_asdevice = NULL; /* * Parse command-line arguments */ - while ((opt = getopt(argc, argv, "bC:cdDfi:l:mn:qr:sS:t:")) != -1) { + while ((opt = getopt(argc, argv, "bC:cdDfi:J:l:mn:qr:sS:t:")) != -1) { switch (opt) { case 'b': /* Use bytes written, not segments read */ use_bytes = 1; @@ -1532,6 +1542,9 @@ lfs_cleaner_main(int argc, char **argv) case 't': /* timeout */ segwait_timeout = atoi(optarg); break; + case 'J': /* do as a device */ + do_asdevice = optarg; + break; default: usage(); /* NOTREACHED */