VFS accounting: list enabled filesystems
authorFrancois Tigeot <ftigeot@wolfpond.org>
Sun, 14 Aug 2011 15:24:55 +0000 (17:24 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 11 Dec 2011 23:06:44 +0000 (00:06 +0100)
Use a new flag, MNT_ACCOUNTING for that

sbin/vquota/vquota.8
sbin/vquota/vquota.c
sys/kern/vfs_quota.c
sys/sys/mount.h

index 581bf9a..1ab1ddc 100644 (file)
@@ -49,6 +49,10 @@ The commands are as follows:
 Reports the space (in bytes) occupied by files names located in the
 directory hierarchy present under
 .Ar directory .
+.
+.\" ==== lsfs ====
+.It Cm lsfs
+List mounted file systems having space accounting enabled
 .El
 .
 .Sh HISTORY
index 564973e..3d2944e 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Copyright (c) 2011 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
@@ -15,7 +15,7 @@
  * 3. Neither the name of The DragonFly Project nor the names of its
  *    contributors may be used to endorse or promote products derived
  *    from this software without specific, prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
@@ -31,6 +31,7 @@
  */
 
 #include <sys/stat.h>
+#include <sys/mount.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 
 static void usage(int);
 static int get_dirsize(char *);
+static int get_fslist(void);
 
 static void
 usage(int retcode)
 {
        fprintf(stderr, "usage: vquota check directory\n");
+       fprintf(stderr, "       vquota lsfs\n");
        exit(retcode);
 }
 
@@ -80,13 +83,6 @@ get_dirsize(char* dirname)
                        retval = 1;
                        break;
                default:
-#if 0
-                       /* files with more than one link, undecided */
-                       // if (p->fts_statp->st_nlink > 1 && linkchk(p))
-                       if (p->fts_statp->st_nlink > 1)
-                               fprintf(stderr, "%s has more than one link\n",
-                                   p->fts_name );
-#endif
                        size_of_files += p->fts_statp->st_size;
                }
        }
@@ -96,17 +92,43 @@ get_dirsize(char* dirname)
        return retval;
 }
 
+/* print a list of filesystems with accounting enabled */
+static int get_fslist(void) {
+       struct statfs *mntbufp;
+       int nloc, i;
+
+       /* read mount table from kernel */
+       nloc = getmntinfo(&mntbufp, MNT_NOWAIT|MNT_LOCAL);
+       if (nloc <= 0) {
+               perror("getmntinfo");
+               exit(1);
+       }
+
+       /* iterate mounted filesystems */
+       for (i=0; i<nloc; i++) {
+           /* vfs accounting enabled on this one ? */
+           if (mntbufp[i].f_flags & MNT_ACCOUNTING)
+               printf("%s on %s\n", mntbufp[i].f_mntfromname,
+                                               mntbufp[i].f_mntonname);
+       }
+
+       return 0;
+}
+
 int
 main(int argc, char **argv)
 {
-       if (argc < 3)
+       if (argc < 2)
                usage(1);
        
        if (strcmp(argv[1], "check") == 0) {
+               if (argc < 3)
+                       usage(1);
                return get_dirsize(argv[2]);
-       } else {
-               usage(1);
+       }
+       if (strcmp(argv[1], "lsfs") == 0) {
+               return get_fslist();
        }
 
-       return 0;
+       return(0);
 }
index 33ba132..8710e54 100644 (file)
@@ -116,8 +116,10 @@ vq_init(struct mount *mp) {
 
        mp->mnt_acct.ac_bytes = 0;
 
-       /* and enable data collection */
+       /* enable data collection */
        mp->mnt_op->vfs_account = vfs_stdaccount;
+       /* mark this filesystem as having accounting enabled */
+       mp->mnt_flag |= MNT_ACCOUNTING;
        if (bootverbose)
                kprintf("vfs accounting enabled for %s\n",
                    mp->mnt_stat.f_mntonname);
index 44277be..cbc03f7 100644 (file)
@@ -283,6 +283,7 @@ struct mount {
 #define        MNT_QUOTA       0x00002000      /* quotas are enabled on filesystem */
 #define        MNT_ROOTFS      0x00004000      /* identifies the root filesystem */
 #define        MNT_USER        0x00008000      /* mounted by a user */
+#define        MNT_ACCOUNTING  0x00020000      /* accounting is enabled on filesystem */
 #define        MNT_IGNORE      0x00800000      /* do not show entry in df */
 
 /*
@@ -297,7 +298,8 @@ struct mount {
                        MNT_LOCAL       | MNT_USER      | MNT_QUOTA     | \
                        MNT_ROOTFS      | MNT_NOATIME   | MNT_NOCLUSTERR| \
                        MNT_NOCLUSTERW  | MNT_SUIDDIR   | MNT_SOFTDEP   | \
-                       MNT_IGNORE      | MNT_NOSYMFOLLOW | MNT_EXPUBLIC | MNT_TRIM)
+                       MNT_IGNORE      | MNT_NOSYMFOLLOW | MNT_EXPUBLIC| \
+                       MNT_ACCOUNTING  | MNT_TRIM)
 /*
  * External filesystem command modifier flags.
  * Unmount can use the MNT_FORCE flag.