Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 2001 21:30:02 -0800 (PST)
From:      Dima Dorfman <dima@unixfreak.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/25273: add fs type feature to vnconfig(8) to allow direct mount of iso images and co. 
Message-ID:  <200102230530.f1N5U2c04134@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/25273; it has been noted by GNATS.

From: Dima Dorfman <dima@unixfreak.org>
To: Poul-Henning Kamp <phk@critter.freebsd.dk>
Cc: freebsd-gnats-submit@freebsd.org
Subject: Re: bin/25273: add fs type feature to vnconfig(8) to allow direct mount of iso images and co. 
Date: Thu, 22 Feb 2001 21:29:33 -0800

 > In message <20010222080653.5C9363E09@bazooka.unixfreak.org>, Dima Dorfman wri
 > tes:
 > >> vnconfig(8) is being phased out.  Please consider if this can be
 > >> integrated in mdconfig(8) in current.
 > >
 > >mdconfig(8) can't automatically mount the filesystem it configures.  I
 > >offered to implement this some time ago, but noone seemed interested.
 > 
 > "send patches" doesn't count as interested in your book ?  :-)
 
 Fair enough.  See attached.  It implements the 'feature' feature (yes,
 it's called 'feature') of vnconfig in mdconfig.  I couldn't think of a
 better name, so I also called it 'feature'.
 
 Basically, right now, this allows one to configure and mount a memory
 disk all in one shot (assuming that what you configured is a real
 filesystem, though; in other words, it only makes sense for vnode).
 Theoretically, it can be expanded to do things like automatically
 label and create a filesystem.  This also includes the functionality
 the originator asked for in this PR (although I don't think his patch
 works; see below).
 
 The only real hack in this is the way it deals with different
 filesystems having different argument structures (last argument to
 mount(2)).  This is also why I don't think the patches provided in
 this PR work; vnconfig always uses a ufs_args structure as the last
 argument to mount(2); if you're trying to mount a cd9660 filesystem,
 it will fail because iso_args is longer than ufs_args, so when the
 kernel (or something before it) tries to access one of the iso_args
 members, it will be accessing junk.  My patch solves the problem by
 defining a union of all the argument structures (okay, not all of
 them, just the ones I thought would make sense in this context).
 Since all the structures have fspec as the first member, this seems to
 work, but is quite ugly.
 
 Comments?  Suggestions?
 
 					Dima Dorfman
 					dima@unixfreak.org
 
 
 Index: mdconfig.8
 ===================================================================
 RCS file: /st/src/FreeBSD/src/sbin/mdconfig/mdconfig.8,v
 retrieving revision 1.5
 diff -u -r1.5 mdconfig.8
 --- mdconfig.8	2001/01/28 20:17:46	1.5
 +++ mdconfig.8	2001/02/23 04:37:23
 @@ -58,6 +58,7 @@
  .Op Fl s Ar size
  .Op Fl f Ar file
  .Op Fl u Ar unit
 +.Op feature ...
  .Nm
  .Fl d
  .Fl u Ar unit
 @@ -133,6 +134,25 @@
  .Xr md 4
  device to use a specific unit number.
  .El
 +.Pp
 +A
 +.Ar feature
 +argument describes an action to be taken after the device is
 +successfully configured.  The valid features follow.
 +.Bl -tag
 +.It Cm mount=rw|ro,fs_type,mount_point
 +Mount the configured memory disk on
 +.Pa mount_point .
 +Since the device must be a valid filesystem of type
 +.Va fs_type
 +at the time it is configured, this is only useful for disks of type
 +.Li vnode .
 +If
 +.Va fs_type
 +is ommited, the type
 +.Li ufs
 +is assumed.
 +.El
  .Sh EXAMPLES
  To create a 4 megabyte
  .Xr malloc 9
 @@ -165,6 +185,20 @@
  mount /dev/md10c /tmp
  chmod 1777 /tmp
  .Ed
 +.Pp
 +To mount a UFS filesystem contained in the file
 +.Pa boot.flp
 +on
 +.Pa /mnt :
 +.Pp
 +.Dl mdconfig -a -t vnode -f boot.flp mount=ro,,/mnt
 +.Pp
 +To mount a CD image contained in the file
 +.Pa 4.2-install.iso
 +on
 +.Pa /mnt :
 +.Pp
 +.Dl mdconfig -a -t vnode -f 4.2-install.iso mount=ro,cd9600,/mnt
  .Sh SEE ALSO
  .Xr md 4 ,
  .Xr disklabel 8 ,
 Index: mdconfig.c
 ===================================================================
 RCS file: /st/src/FreeBSD/src/sbin/mdconfig/mdconfig.c,v
 retrieving revision 1.6
 diff -u -r1.6 mdconfig.c
 --- mdconfig.c	2001/01/31 08:41:18	1.6
 +++ mdconfig.c	2001/02/23 04:37:23
 @@ -10,16 +10,24 @@
   *
   */
  
 +#include <sys/param.h>
 +#include <sys/mount.h>
 +#include <isofs/cd9660/cd9660_mount.h>
 +#include <msdosfs/msdosfsmount.h>
 +#include <ufs/ufs/ufsmount.h>
 +
  #include <stdio.h>
  #include <stdlib.h>
  #include <fcntl.h>
  #include <unistd.h>
  #include <string.h>
  #include <err.h>
 +#include <paths.h>
  #include <sys/ioctl.h>
 -#include <sys/param.h>
  #include <sys/mdioctl.h>
  
 +int	 f_mount(const char *);
 +
  struct md_ioctl mdio;
  
  enum {UNSET, ATTACH, DETACH} action = UNSET;
 @@ -28,7 +36,8 @@
  usage()
  {
  	fprintf(stderr, "Usage:\n");
 -	fprintf(stderr, "\tmdconfig -a -t type [-o [no]option]... [ -f file] [-s size] [-u unit]\n");
 +	fprintf(stderr, "\tmdconfig -a -t type [-o [no]option]... [ -f file] "
 +	    "[-s size] [-u unit]\n\t\t[feature ...]\n");
  	fprintf(stderr, "\tmdconfig -d -u unit\n");
  	fprintf(stderr, "\t\ttype = {malloc, preload, vnode, swap}\n");
  	fprintf(stderr, "\t\toption = {cluster, compress, reserve, autounit}\n");
 @@ -138,6 +147,8 @@
  			usage();
  		}
  	}
 +	argc -= optind;
 +	argv += optind;
  
  	fd = open("/dev/mdctl", O_RDWR, 0);
  	if (fd < 0)
 @@ -153,6 +164,64 @@
  		err(1, "ioctl(/dev/mdctl)");
  	if (mdio.md_options & MD_AUTOUNIT)
  		printf("md%d\n", mdio.md_unit);
 +
 +	/* Process 'features'. */
 +	for (; argc > 0; argc++)
 +	{
 +		if (strncmp(argv[0], "mount=", 6) == 0)
 +			if (!f_mount(argv[0] + 6))
 +				return (1);
 +	}
  	return (0);
  }
  
 +/*
 + * Process the 'mount' feature.
 + *
 + * Pre-condition: mdio describes a valid and configured device
 + */
 +int
 +f_mount(const char *params)
 +{
 +	char *p, *wparams;
 +	char *av[3], **avp;
 +	char *mttype, *mtpoint, mtdev[MAXPATHLEN];
 +	int mtflags = 0;
 +	union {
 +	    struct ufs_args u;
 +	    struct iso_args i;
 +	    struct msdosfs_args m;
 +	} args;
 +
 +	memset(&args, '\0', sizeof(args));
 +	if ( (wparams = malloc(strlen(params) + 1)) == NULL)
 +		err(1, "malloc");
 +	strlcpy(wparams, params, strlen(params) + 1);
 +
 +	for (p = wparams, avp = av;;) {
 +		*avp = strsep(&p, ",");
 +		if (++avp >= &av[sizeof(av) / sizeof(*av)])
 +			break;
 +	}
 +
 +	if (strncmp(av[0], "rw", 2) == 0)
 +		;
 +	else if (strncmp(av[0], "ro", 2) == 0)
 +		mtflags |= MNT_RDONLY;
 +	else
 +		errx(1, "bad option to mount feature: %s", av[0]);
 +	if (*av[1] == '\0')
 +		mttype = "ufs";
 +	else
 +		mttype = av[1];
 +	if (*av[2] == '\0')
 +		errx(1, "bad mountpoint");
 +	mtpoint = av[2];
 +
 +	snprintf(mtdev, sizeof(mtdev), "%smd%dc", _PATH_DEV, mdio.md_unit);
 +	args.u.fspec = mtdev;
 +
 +	if (mount(mttype, mtpoint, mtflags, &args) == -1)
 +		err(1, "mount");
 +	return (0);
 +}

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102230530.f1N5U2c04134>