Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/libexec/lfs_cleanerd Add support for passing the raw device ...



details:   https://anonhg.NetBSD.org/src/rev/34a7d93daab6
branches:  trunk
changeset: 459204:34a7d93daab6
user:      brad <brad%NetBSD.org@localhost>
date:      Fri Aug 30 23:37:23 2019 +0000

description:
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

diffstat:

 libexec/lfs_cleanerd/lfs_cleanerd.8 |  20 +++++++++++-
 libexec/lfs_cleanerd/lfs_cleanerd.c |  57 ++++++++++++++++++++++--------------
 2 files changed, 53 insertions(+), 24 deletions(-)

diffs (170 lines):

diff -r 4c861b114520 -r 34a7d93daab6 libexec/lfs_cleanerd/lfs_cleanerd.8
--- a/libexec/lfs_cleanerd/lfs_cleanerd.8       Fri Aug 30 23:36:40 2019 +0000
+++ b/libexec/lfs_cleanerd/lfs_cleanerd.8       Fri Aug 30 23:37:23 2019 +0000
@@ -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 @@
 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 @@
 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 @@
 .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
diff -r 4c861b114520 -r 34a7d93daab6 libexec/lfs_cleanerd/lfs_cleanerd.c
--- a/libexec/lfs_cleanerd/lfs_cleanerd.c       Fri Aug 30 23:36:40 2019 +0000
+++ b/libexec/lfs_cleanerd/lfs_cleanerd.c       Fri Aug 30 23:37:23 2019 +0000
@@ -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 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 @@
 {
        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 @@
        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 @@
 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 @@
        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 @@
                    case 't':   /* timeout */
                            segwait_timeout = atoi(optarg);
                            break;
+                   case 'J': /* do as a device */
+                           do_asdevice = optarg;
+                           break;
                    default:
                            usage();
                            /* NOTREACHED */



Home | Main Index | Thread Index | Old Index