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 */

Reply via email to