mount - Split mount into mount_ufs, auto-detect fstype from disklabel
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 11 May 2012 05:12:28 +0000 (22:12 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 11 May 2012 05:12:28 +0000 (22:12 -0700)
* Move the compiled-in ufs mount code from mount to a new utility called
  mount_ufs.

* When mount determines the filesystem type is ufs it now exec's mount_ufs
  instead of calling the built-in ufs code.

* When mounting a disklabeled device and the fstype is not specified
  mount will attempt to figure out the fstype from the disklabel.

  Devices matching acd%d and cd%d will default to the 'cd9660' fstype.

  It defaults to ufs if it cannot figure it out (as before).

* If your filesystems are properly labeled this allows you to specify
  the mount generically as in this example:

      mount /dev/da0s1d /mnt

  And mount will exec mount_ufs or mount_hammer (etc...) as appropriate.

* NOTE! mount cannot currently auto-detect msdosfs or extract the DOS
  slice type.  It would be cool if it were extended further to do this
  as well.  Currently it only understands DragonFly disklabels.

sbin/Makefile
sbin/mount/Makefile
sbin/mount/extern.h
sbin/mount/mount.c
sbin/mount_ufs/Makefile [copied from sbin/mount/Makefile with 68% similarity]
sbin/mount_ufs/mount.c [copied from sbin/mount/mount.c with 99% similarity]
sbin/mount_ufs/mount_ufs.8 [new file with mode: 0644]
sbin/mount_ufs/mount_ufs.c [moved from sbin/mount/mount_ufs.c with 100% similarity]
sys/sys/dtype.h

index c1896fd..35ae39a 100644 (file)
@@ -48,6 +48,7 @@ SUBDIR=       adjkerntz \
        mknod \
        mountctl \
        mount \
+       mount_ufs \
        mount_cd9660 \
        mount_devfs \
        mount_ext2fs \
index c6c6e06..4132dda 100644 (file)
@@ -3,10 +3,8 @@
 # $DragonFly: src/sbin/mount/Makefile,v 1.5 2006/10/28 20:42:54 pavalos Exp $
 
 PROG=  mount
-SRCS=  mount.c mount_ufs.c getmntopts.c vfslist.c
+SRCS=  mount.c getmntopts.c vfslist.c
 MAN=   mount.8
 # We do NOT install the getmntopts.3 man page.
 
-MLINKS+= mount.8 mount_ufs.8
-
 .include <bsd.prog.mk>
index 7825699..08db088 100644 (file)
@@ -30,6 +30,3 @@
 /* vfslist.c */
 int checkvfsname(const char *, const char **);
 const char **makevfslist(char *);
-
-/* mount_ufs.c */
-int mount_ufs(int, const char **);
index 9c81677..0a4ca50 100644 (file)
 #include <sys/param.h>
 #include <sys/mount.h>
 #include <sys/mountctl.h>
+#define DKTYPENAMES
+#include <sys/dtype.h>
+#include <sys/diskslice.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
 
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <fstab.h>
 #include <pwd.h>
 #include <signal.h>
@@ -79,16 +83,16 @@ static void   putfsent(const struct statfs *);
 static void   usage(void);
 static char  *flags2opts(int);
 static char  *xstrdup(const char *str);
+static void   checkdisklabel(const char *devpath, const char **vfstypep);
 
 /*
  * List of VFS types that can be remounted without becoming mounted on top
  * of each other.
  * XXX Is this list correct?
  */
-static const char *
-remountable_fs_names[] = {
-       "ufs", "ffs", "ext2fs",
-       0
+static const char *remountable_fs_names[] = {
+       "ufs", "ffs", "ext2fs", "hammer", "hammer2",
+       NULL
 };
 
 int
@@ -106,7 +110,7 @@ main(int argc, char **argv)
        options = NULL;
        vfslist = NULL;
        vfstype = "ufs";
-       while ((ch = getopt(argc, argv, "adF:fo:prwt:uv")) != -1)
+       while ((ch = getopt(argc, argv, "adF:fo:prwt:uv")) != -1) {
                switch (ch) {
                case 'a':
                        all = 1;
@@ -151,6 +155,7 @@ main(int argc, char **argv)
                        usage();
                        /* NOTREACHED */
                }
+       }
        argc -= optind;
        argv += optind;
 
@@ -253,13 +258,25 @@ main(int argc, char **argv)
        case 2:
                /*
                 * If -t flag has not been specified, the path cannot be
-                * found, spec contains either a ':' or a '@', and the
-                * spec is not a file with those characters, then assume
-                * that an NFS filesystem is being specified ala Sun.
+                * found.
+                *
+                * If the spec is not a file and contains a ':' then assume
+                * NFS.
+                *
+                * If the spec is a cdev attempt to extract the fstype from
+                * the label.
+                *
+                * When all else fails ufs is assumed.
                 */
-               if (vfslist == NULL && strpbrk(argv[0], ":@") != NULL &&
-                   access(argv[0], 0) == -1)
-                       vfstype = "nfs";
+               if (vfslist == NULL) {
+                       if (strpbrk(argv[0], ":") != NULL &&
+                           access(argv[0], 0) == -1) {
+                               vfstype = "nfs";
+                       } else {
+                               checkdisklabel(argv[0], &vfstype);
+                       }
+               }
+
                rval = mountfs(vfstype, getdevpath(argv[0], 0), argv[1],
                               init_flags, options, NULL);
                break;
@@ -408,9 +425,6 @@ mountfs(const char *vfstype, const char *spec, const char *name, int flags,
                free(optbuf);
                return (1);
        case 0:                                 /* Child. */
-               if (strcmp(vfstype, "ufs") == 0)
-                       exit(mount_ufs(argc, argv));
-
                /* Go find an executable. */
                for (edir = edirs; *edir; edir++) {
                        snprintf(execname,
@@ -742,3 +756,68 @@ xstrdup(const char *str)
        }
        return ret;
 }
+
+/*
+ * Hack 'cd9660' for the default fstype on cd media if no disklabel
+ * found.
+ */
+static int
+iscdmedia(const char *path, int fd __unused)
+{
+       int n;
+
+       if (strrchr(path, '/'))
+               path = strrchr(path, '/') + 1;
+       if (sscanf(path, "acd%d", &n) == 1)
+               return 1;
+       if (sscanf(path, "cd%d", &n) == 1)
+               return 1;
+       return 0;
+}
+
+/*
+ * If the device path is a cdev attempt to access the disklabel to determine
+ * the filesystem type.  Adjust *vfstypep if we can figure it out
+ * definitively.
+ *
+ * Ignore any portion of the device path after an '@' or ':'.
+ */
+static void
+checkdisklabel(const char *devpath, const char **vfstypep)
+{
+       struct stat st;
+       struct partinfo info;
+       char *path = strdup(devpath);
+       int fd;
+
+       if (strchr(path, '@'))
+               *strchr(path, '@') = 0;
+       if (strchr(path, ':'))
+               *strchr(path, ':') = 0;
+
+       if (stat(path, &st) < 0)
+               goto done;
+       if (!S_ISCHR(st.st_mode))
+               goto done;
+       fd = open(path, O_RDONLY);
+       if (fd < 0)
+               goto done;
+       if (ioctl(fd, DIOCGPART, &info) == 0) {
+               if (info.fstype >= 0 && info.fstype < (int)FSMAXTYPES) {
+                       if (fstype_to_vfsname[info.fstype]) {
+                               *vfstypep = fstype_to_vfsname[info.fstype];
+                       } else if (iscdmedia(path, fd)) {
+                               *vfstypep = "cd9660";
+                       } else {
+                               fprintf(stderr,
+                                       "mount: warning: fstype in disklabel "
+                                       "not set to anything I understand\n");
+                               fprintf(stderr,
+                                       "attempting to mount with -t ufs\n");
+                       }
+               }
+       }
+       close(fd);
+done:
+       free(path);
+}
similarity index 68%
copy from sbin/mount/Makefile
copy to sbin/mount_ufs/Makefile
index c6c6e06..8570a22 100644 (file)
@@ -2,11 +2,13 @@
 # $FreeBSD: src/sbin/mount/Makefile,v 1.9.2.1 2001/04/25 10:58:33 ru Exp $
 # $DragonFly: src/sbin/mount/Makefile,v 1.5 2006/10/28 20:42:54 pavalos Exp $
 
-PROG=  mount
+PROG=  mount_ufs
 SRCS=  mount.c mount_ufs.c getmntopts.c vfslist.c
-MAN=   mount.8
-# We do NOT install the getmntopts.3 man page.
+MAN=   mount_ufs.8
 
-MLINKS+= mount.8 mount_ufs.8
+MOUNT=  ${.CURDIR}/../mount
+CFLAGS+= -I${.CURDIR}/../../sys -I${MOUNT}
+
+.PATH:  ${MOUNT}
 
 .include <bsd.prog.mk>
similarity index 99%
copy from sbin/mount/mount.c
copy to sbin/mount_ufs/mount.c
index 9c81677..e91f021 100644 (file)
@@ -57,7 +57,7 @@
 #include "pathnames.h"
 
 /* `meta' options */
-#define MOUNT_META_OPTION_FSTAB                "fstab" 
+#define MOUNT_META_OPTION_FSTAB                "fstab"
 #define MOUNT_META_OPTION_CURRENT      "current"
 
 int debug, fstab_style, verbose;
@@ -80,6 +80,9 @@ static void   usage(void);
 static char  *flags2opts(int);
 static char  *xstrdup(const char *str);
 
+/* mount_ufs.c */
+int mount_ufs(int, const char **);
+
 /*
  * List of VFS types that can be remounted without becoming mounted on top
  * of each other.
@@ -611,7 +614,7 @@ update_options(char *opts, char *fstab, int curflags)
        for (p = expopt; (o = strsep(&p, ",")) != NULL;) {
                if ((tmpopt = malloc( strlen(o) + 2 + 1 )) == NULL)
                        errx(1, "malloc failed");
-       
+
                strcpy(tmpopt, "no");
                strcat(tmpopt, o);
                remopt(newopt, tmpopt);
@@ -684,7 +687,7 @@ putfsent(const struct statfs *ent)
        struct stat sb;
        struct fstab *fst;
        char *opts;
-  
+
        opts = flags2opts(ent->f_flags);
        printf("%s\t%s\t%s %s", ent->f_mntfromname, ent->f_mntonname,
            ent->f_fstypename, opts);
diff --git a/sbin/mount_ufs/mount_ufs.8 b/sbin/mount_ufs/mount_ufs.8
new file mode 100644 (file)
index 0000000..193b512
--- /dev/null
@@ -0,0 +1,448 @@
+.\" Copyright (c) 1980, 1989, 1991, 1993
+.\"    The Regents of the University of California.  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
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)mount.8    8.8 (Berkeley) 6/16/94
+.\" $FreeBSD: src/sbin/mount/mount.8,v 1.31.2.12 2003/02/23 21:17:42 trhodes Exp $
+.\"
+.Dd October 7, 2011
+.Dt MOUNT 8
+.Os
+.Sh NAME
+.Nm mount
+.Nd mount file systems
+.Sh SYNOPSIS
+.Nm
+.Op Fl adfpruvw
+.Op Fl F Ar fstab
+.Op Fl o Ar options
+.Op Fl t Ar type
+.Nm
+.Op Fl dfpruvw
+.Brq Ar special | node
+.Nm
+.Op Fl dfpruvw
+.Op Fl o Ar options
+.Op Fl t Ar type
+.Ar special node
+.Sh DESCRIPTION
+The
+.Nm
+utility calls the
+.Xr mount 2
+system call to prepare and graft a
+.Ar "special device"
+or the remote node (rhost:path) on to the file system tree at the point
+.Ar node .
+If either
+.Ar special
+or
+.Ar node
+are not provided, the appropriate information is taken from the
+.Xr fstab 5
+file.
+.Pp
+The system maintains a list of currently mounted file systems.
+If no arguments are given to
+.Nm ,
+this list is printed.
+.Pp
+The options are as follows:
+.Bl -tag -width indent
+.It Fl a
+All the filesystems described in
+.Xr fstab 5
+are mounted.
+Exceptions are those marked as
+.Dq noauto ,
+excluded by the
+.Fl t
+flag (see below), or if they are already mounted (except the
+root filesystem which is always remounted to preserve
+traditional single user mode behavior).
+.It Fl d
+Causes everything to be done except for the actual system call.
+This option is useful in conjunction with the
+.Fl v
+flag to
+determine what the
+.Nm
+command is trying to do.
+.It Fl F Ar fstab
+Specify the
+.Pa fstab
+file to use.
+.It Fl f
+Forces the revocation of write access when trying to downgrade
+a filesystem mount status from read-write to read-only.
+Also
+forces the R/W mount of an unclean filesystem (dangerous; use with
+caution).
+.It Fl o
+Options are specified with a
+.Fl o
+flag followed by a comma separated string of options.
+If a
+.Dq no
+prefix is added or removed from a option name, then meaning is negated.
+In case of conflicting options being specified, the rightmost option
+takes effect.
+The following options are available:
+.Bl -tag -width indent
+.It Cm async
+All
+.Tn I/O
+to the file system should be done asynchronously.
+This is a
+.Em dangerous
+flag to set,
+and should not be used unless you are prepared to recreate the file
+system should your system crash.
+.It Cm current
+When used with the
+.Fl u
+flag, this is the same as specifying the options currently in effect for
+the mounted filesystem.
+.It Cm force
+The same as
+.Fl f ;
+forces the revocation of write access when trying to downgrade
+a filesystem mount status from read-write to read-only.
+Also
+forces the R/W mount of an unclean filesystem (dangerous; use with caution).
+.It Cm fstab
+When used with the
+.Fl u
+flag, this is the same as specifying all the options listed in the
+.Xr fstab 5
+file for the filesystem.
+.It Cm noasync
+Metadata I/O should be done synchronously, while data I/O should be done
+asynchronously.
+This is the default.
+.It Cm noatime
+Do not update the file access time when reading from a file.
+This option
+is useful on filesystems where there are large numbers of files and
+performance is more critical than updating the file access time (which is
+rarely ever important).
+This option is currently only supported on local filesystems.
+.It Cm noauto
+This filesystem should be skipped when
+.Nm
+is run with the
+.Fl a
+flag.
+.It Cm noclusterr
+Disable read clustering.
+.It Cm noclusterw
+Disable write clustering.
+.It Cm nodev
+Do not interpret character or block special devices on the file system.
+This option is useful for a server that has file systems containing
+special devices for architectures other than its own.
+This option is set automatically when the user does not have super-user
+privileges.
+.It Cm noexec
+Do not allow execution of any binaries on the mounted file system.
+This option is useful for a server that has file systems containing
+binaries for architectures other than its own.
+.It Cm nosuid
+Do not allow set-user-identifier or set-group-identifier bits to take effect.
+Note: this option is worthless if a public available suid or sgid
+wrapper like
+.Xr suidperl 1
+is installed on your system.
+It is set automatically when the user does not have super-user privileges.
+.It Cm nosymfollow
+Do not follow symlinks
+on the mounted file system.
+.It Cm rdonly , ro , norw
+The same as
+.Fl r ;
+mount the file system read-only (even the super-user may not write it).
+.It Cm sync
+All
+.Tn I/O
+to the file system should be done synchronously.
+.It Cm trim
+If the device supports TRIM
+.Va ( kern.cam.da.X.trim_enabled
+exists) and is set,
+the file system will perform online trim for corresponding block deletions.
+Currently, only
+.Xr UFS 5
+supports this feature.
+.It Cm suiddir
+A directory on the mounted filesystem will respond to the SUID bit
+being set, by setting the owner of any new files to be the same
+as the owner of the directory.
+New directories will inherit the bit from their parents.
+Execute bits are removed from
+the file, and it will not be given to root.
+.Pp
+This feature is designed for use on fileservers serving PC users via
+ftp or SAMBA.
+It provides security holes for shell users and as
+such should not be used on shell machines, especially on home directories.
+This option requires the SUIDDIR
+option in the kernel to work.
+Only
+.Xr UFS 5
+filesystems support this option.
+See
+.Xr chmod 2
+for more information.
+.It Cm update
+The same as
+.Fl u ;
+indicate that the status of an already mounted file system should be changed.
+.It Cm union
+Causes the namespace at the mount point to appear as the union
+of the mounted filesystem root and the existing directory.
+Lookups will be done in the mounted filesystem first.
+If those operations fail due to a non-existent file the underlying
+directory is then accessed.
+All creates are done in the mounted filesystem.
+.It Cm ignore
+Will be ignored by
+.Xr df 1 .
+.El
+.Pp
+Any additional options specific to a filesystem type that is not
+one of the internally known types (see the
+.Fl t
+option) may be passed as a comma separated list; these options are
+distinguished by a leading
+.Dq \&-
+(dash).
+Options that take a value are specified using the syntax -option=value.
+For example, the
+.Nm
+command:
+.Bd -literal -offset indent
+mount -t mfs -o nosuid,-N,-s=4000 /dev/da0s0b /tmp
+.Ed
+.Pp
+causes
+.Nm
+to execute the equivalent of:
+.Bd -literal -offset indent
+/sbin/mount_mfs -o nosuid -N -s 4000 /dev/da0s0b /tmp
+.Ed
+.Pp
+Additional options specific to filesystem types
+which are not internally known
+(see the description of the
+.Fl t
+option below)
+may be described in the manual pages for the associated
+.Pa /sbin/mount_ Ns Sy XXX
+utilities.
+.It Fl p
+Print mount information in
+.Xr fstab 5
+format.
+If fstab is missing or if the freq and passno fields are omitted,
+the default values as described in
+.Xr fstab 5
+are used.
+Implies also the
+.Fl v
+option.
+.It Fl r
+The file system is to be mounted read-only.
+Mount the file system read-only (even the super-user may not write it).
+The same as the
+.Cm rdonly
+argument to the
+.Fl o
+option.
+.It Fl t Ar type
+The argument following the
+.Fl t
+is used to indicate the file system type.
+The type
+.Cm ufs
+is the default.
+The
+.Fl t
+option can be used
+to indicate that the actions should only be taken on
+filesystems of the specified type.
+More than one type may be specified in a comma separated list.
+The list of filesystem types can be prefixed with
+.Dq no
+to specify the filesystem types for which action should
+.Em not
+be taken.
+For example, the
+.Nm
+command:
+.Bd -literal -offset indent
+mount -a -t nonfs,mfs
+.Ed
+.Pp
+mounts all filesystems except those of type
+.Tn NFS
+and
+.Tn MFS .
+.Pp
+If the type is not the internally known type,
+.Cm ufs ,
+.Nm
+will attempt to execute a program in
+.Pa /sbin/mount_ Ns Sy XXX
+where
+.Sy XXX
+is replaced by the type name.
+For example, nfs filesystems are mounted by the program
+.Pa /sbin/mount_nfs .
+.Pp
+Most filesystems will be dynamically loaded by their
+.Nm
+programs
+if not already present in the kernel, using the
+.Xr vfsload 3
+subroutine.
+Because this mechanism requires writable temporary space,
+the filesystem type containing
+.Pa /tmp
+must be compiled into the kernel, and the filesystems containing
+.Pa /tmp
+and
+.Pa /usr/bin/ld
+must be listed in
+.Pa /etc/fstab
+before any filesystems which might be dynamically loaded.
+.It Fl u
+The
+.Fl u
+flag indicates that the status of an already mounted file
+system should be changed.
+Any of the options discussed above (the
+.Fl o
+option)
+may be changed;
+also a file system can be changed from read-only to read-write
+or vice versa.
+An attempt to change from read-write to read-only will fail if any
+files on the filesystem are currently open for writing unless the
+.Fl f
+flag is also specified.
+The set of options is determined by applying the options specified
+in the argument to
+.Fl o
+and finally applying the
+.Fl r
+or
+.Fl w
+option.
+.It Fl v
+Verbose mode.
+.It Fl w
+The file system object is to be read and write.
+.El
+.Sh ENVIRONMENT
+.Bl -tag -width PATH_FSTAB
+.It Pa PATH_FSTAB
+If the environment variable
+.Pa PATH_FSTAB
+is set all operations are performed against the specified file.
+.El
+.Sh FILES
+.Bl -tag -width /etc/fstab -compact
+.It Pa /etc/fstab
+file system table
+.El
+.Sh DIAGNOSTICS
+Various, most of them are self-explanatory.
+.Pp
+.Dl XXXXX filesystem is not available
+.Pp
+The kernel does not support the respective filesystem type.
+Note that
+support for a particular filesystem might be provided either on a static
+(kernel compile-time), or dynamic basis (loaded as a kernel module by
+.Xr kldload 8 ) .
+Normally,
+.Nm
+or its subprocesses attempt to dynamically load a filesystem module if
+it has not been configured statically, using
+.Xr vfsload 3 .
+In this case, the above error message can also mean that you did not
+have permission to load the module.
+.Sh SEE ALSO
+.Xr df 1 ,
+.Xr lsvfs 1 ,
+.Xr mount 2 ,
+.Xr vfsload 3 ,
+.Xr devtab 5 ,
+.Xr fstab 5 ,
+.Xr UFS 5 ,
+.Xr kldload 8 ,
+.Xr mount_cd9660 8 ,
+.Xr mount_devfs 8 ,
+.Xr mount_ext2fs 8 ,
+.Xr mount_fdesc 8 ,
+.Xr mount_hammer 8 ,
+.Xr mount_hpfs 8 ,
+.Xr mount_linprocfs 8 ,
+.Xr mount_mfs 8 ,
+.Xr mount_msdos 8 ,
+.Xr mount_nfs 8 ,
+.Xr mount_ntfs 8 ,
+.Xr mount_null 8 ,
+.Xr mount_nwfs 8 ,
+.Xr mount_portal 8 ,
+.Xr mount_procfs 8 ,
+.Xr mount_smbfs 8 ,
+.Xr mount_std 8 ,
+.Xr mount_tmpfs 8 ,
+.Xr mount_udf 8 ,
+.Xr mount_union 8 ,
+.Xr sysctl 8 ,
+.Xr umount 8
+.Sh CAVEATS
+After a successful
+.Nm ,
+the permissions on the original mount point determine if
+.Pa ..\&
+is accessible from the mounted file system.
+The minimum permissions for
+the mount point for traversal across the mount point in both
+directions to be possible for all users is 0111 (execute for all).
+.Sh HISTORY
+A
+.Nm
+utility appeared in
+.At v1 .
+.Sh BUGS
+It is possible for a corrupted file system to cause a crash.
index 2d52cac..8af82b7 100644 (file)
@@ -104,43 +104,79 @@ static const char *dktypenames[] = {
 #define FS_RESERVED20  20              /* (CCD under FreeBSD) */
 #define FS_JFS2                21
 #define FS_HAMMER      22
+#define FS_HAMMER2     23
 #define FS_UDF         24
 #define FS_EFS         26
 #define FS_ZFS         27
 
 #ifdef DKTYPENAMES
+
 static const char *fstypenames[] = {
-       "unused",
-       "swap",
-       "Version 6",
-       "Version 7",
-       "System V",
-       "4.1BSD",
-       "Eighth Edition",
-       "4.2BSD",
-       "MSDOS",
-       "4.4LFS",
-       "unknown",
-       "HPFS",
-       "ISO9660",
-       "boot",
-       "vinum",
-       "raid",
-       "?",
-       "?",
-       "?",
-       "ccd",
-       "?",    /* don't use in case freebsd reassigns jfs / bug in freebsd */
-       "jfs",
-       "HAMMER",
-       "?",
-       "UDF",
-       "?",
-       "EFS",
-       "ZFS",
+       "unused",               /* 0    */
+       "swap",                 /* 1    */
+       "Version 6",            /* 2    */
+       "Version 7",            /* 3    */
+       "System V",             /* 4    */
+       "4.1BSD",               /* 5    */
+       "Eighth Edition",       /* 6    */
+       "4.2BSD",               /* 7    */
+       "MSDOS",                /* 8    */
+       "4.4LFS",               /* 9    */
+       "unknown",              /* 10   */
+       "HPFS",                 /* 11   */
+       "ISO9660",              /* 12   */
+       "boot",                 /* 13   */
+       "vinum",                /* 14   */
+       "raid",                 /* 15   */
+       "?",                    /* 16   */
+       "?",                    /* 17   */
+       "?",                    /* 18   */
+       "ccd",                  /* 19   */
+       "?",                    /* 20   (do not reuse, bug in freebsd) */
+       "jfs",                  /* 21   */
+       "HAMMER",               /* 22   */
+       "HAMMER2",              /* 23   */
+       "UDF",                  /* 24   */
+       "?",                    /* 25   */
+       "EFS",                  /* 26   */
+       "ZFS",                  /* 27   */
        NULL
 };
+
+static const char *fstype_to_vfsname[] = {
+       NULL,                   /* 0    */
+       NULL,                   /* 1    */
+       NULL,                   /* 2    */
+       NULL,                   /* 3    */
+       NULL,                   /* 4    */
+       NULL,                   /* 5    */
+       NULL,                   /* 6    */
+       "ufs",                  /* 7    */
+       "msdos",                /* 8    */
+       NULL,                   /* 9    */
+       NULL,                   /* 10   */
+       "hpfs",                 /* 11   */
+       "cd9660",               /* 12   */
+       NULL,                   /* 13   */
+       NULL,                   /* 14   */
+       NULL,                   /* 15   */
+       NULL,                   /* 16   */
+       NULL,                   /* 17   */
+       NULL,                   /* 18   */
+       NULL,                   /* 19   */
+       NULL,                   /* 20   */
+       NULL,                   /* 21   */
+       "hammer",               /* 22   */
+       "hammer2",              /* 23   */
+       "udf",                  /* 24   */
+       NULL,                   /* 25   */
+       NULL,                   /* 26   */
+       NULL,                   /* 27   */
+       NULL
+};
+
 #define FSMAXTYPES     (NELEM(fstypenames) - 1)
+
 #endif
 
 #endif /* SYS_DTYPE_H_ */