rump_lfs.c revision 1.7
11.7Spooka/*	$NetBSD: rump_lfs.c,v 1.7 2009/10/07 20:59:09 pooka Exp $	*/
21.1Spooka
31.1Spooka/*
41.3Spooka * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
51.1Spooka *
61.1Spooka * Redistribution and use in source and binary forms, with or without
71.1Spooka * modification, are permitted provided that the following conditions
81.1Spooka * are met:
91.1Spooka * 1. Redistributions of source code must retain the above copyright
101.1Spooka *    notice, this list of conditions and the following disclaimer.
111.1Spooka * 2. Redistributions in binary form must reproduce the above copyright
121.1Spooka *    notice, this list of conditions and the following disclaimer in the
131.1Spooka *    documentation and/or other materials provided with the distribution.
141.1Spooka *
151.1Spooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
161.1Spooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
171.1Spooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
181.1Spooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
191.1Spooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
201.1Spooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
211.1Spooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
221.1Spooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
231.1Spooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
241.1Spooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
251.1Spooka * SUCH DAMAGE.
261.1Spooka */
271.1Spooka
281.1Spooka#include <sys/types.h>
291.1Spooka#include <sys/mount.h>
301.1Spooka
311.1Spooka#include <ufs/ufs/ufsmount.h>
321.1Spooka
331.1Spooka#include <err.h>
341.6Spooka#include <pthread.h>
351.6Spooka#include <stdio.h>
361.1Spooka#include <stdlib.h>
371.1Spooka#include <unistd.h>
381.1Spooka
391.6Spooka#include <rump/rump.h>
401.1Spooka#include <rump/p2k.h>
411.4Spooka#include <rump/ukfs.h>
421.1Spooka
431.2Spooka#include "mount_lfs.h"
441.1Spooka
451.6Spookastatic void *
461.6Spookacleaner(void *arg)
471.6Spooka{
481.6Spooka	const char *the_argv[7];
491.6Spooka
501.6Spooka	the_argv[0] = "megamaid";
511.6Spooka	the_argv[1] = "-D"; /* don't fork() & detach */
521.6Spooka	the_argv[2] = arg;
531.6Spooka
541.7Spooka	sleep(1); /* XXXtehsuck: wait until mount is complete in other thread */
551.6Spooka	lfs_cleaner_main(3, __UNCONST(the_argv));
561.6Spooka
571.6Spooka	return NULL;
581.6Spooka}
591.6Spooka
601.1Spookaint
611.1Spookamain(int argc, char *argv[])
621.1Spooka{
631.1Spooka	struct ufs_args args;
641.7Spooka	char canon_dev[UKFS_PARTITION_MAXPATHLEN], canon_dir[MAXPATHLEN];
651.7Spooka	char rawdev[MAXPATHLEN];
661.6Spooka	pthread_t cleanerthread;
671.7Spooka	int mntflags, part;
681.2Spooka	int rv;
691.1Spooka
701.1Spooka	setprogname(argv[0]);
711.1Spooka
721.4Spooka	/*
731.4Spooka	 * Load FFS and LFS already here.  we need both and link set
741.4Spooka	 * lossage does not allow them to be linked on the command line.
751.4Spooka	 */
761.4Spooka	ukfs_init();
771.5Spooka	if (ukfs_modload("librumpfs_ffs.so") != 1)
781.4Spooka		err(1, "modload ffs");
791.5Spooka	if (ukfs_modload("librumpfs_lfs.so") != 1)
801.4Spooka		err(1, "modload lfs");
811.4Spooka
821.7Spooka	UKFS_PARTITION_ARGVPROBE(part);
831.7Spooka	if (part != UKFS_PARTITION_NONE) {
841.7Spooka		errx(1, "lfs does not currently support embedded partitions");
851.7Spooka	}
861.2Spooka	mount_lfs_parseargs(argc, argv, &args, &mntflags, canon_dev, canon_dir);
871.6Spooka
881.6Spooka	/*
891.6Spooka	 * XXX: this particular piece inspired by the cleaner code.
901.6Spooka	 * obviously FIXXXME along with the cleaner.
911.6Spooka	 */
921.6Spooka	sprintf(rawdev, "/dev/r%s", canon_dev+5);
931.6Spooka	rump_etfs_register(rawdev, canon_dev, RUMP_ETFS_CHR);
941.6Spooka
951.6Spooka	/*
961.6Spooka	 * We basically have two choices:
971.6Spooka	 *  1) run the cleaner in another process and do rump ipc syscalls
981.6Spooka	 *  2) run it off a thread in this process and do rump syscalls
991.6Spooka	 *     as function calls.
1001.6Spooka	 *
1011.6Spooka	 * opt for "2" for now
1021.6Spooka	 */
1031.6Spooka#ifndef CLEANER_TESTING
1041.6Spooka	if ((mntflags & MNT_RDONLY) == 0) {
1051.6Spooka		if (pthread_create(&cleanerthread, NULL,
1061.6Spooka		    cleaner, canon_dir) == -1)
1071.6Spooka			err(1, "cannot start cleaner");
1081.6Spooka	}
1091.6Spooka#else
1101.6Spooka	ukfs_mount(MOUNT_LFS, canon_dev, canon_dir, mntflags,
1111.6Spooka	    &args, sizeof(args));
1121.6Spooka	cleaner(canon_dir);
1131.6Spooka#endif
1141.6Spooka
1151.7Spooka	rv = p2k_run_diskfs(MOUNT_LFS, canon_dev, part, canon_dir, mntflags,
1161.2Spooka	    &args, sizeof(args), 0);
1171.1Spooka	if (rv)
1181.1Spooka		err(1, "mount");
1191.1Spooka
1201.1Spooka	return 0;
1211.1Spooka}
122