rump_lfs.c revision 1.16
11.16Spooka/*	$NetBSD: rump_lfs.c,v 1.16 2010/03/03 17:37:01 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.15Spooka#include <puffs.h>
361.6Spooka#include <stdio.h>
371.1Spooka#include <stdlib.h>
381.1Spooka#include <unistd.h>
391.1Spooka
401.6Spooka#include <rump/rump.h>
411.1Spooka#include <rump/p2k.h>
421.4Spooka#include <rump/ukfs.h>
431.1Spooka
441.2Spooka#include "mount_lfs.h"
451.1Spooka
461.6Spookastatic void *
471.6Spookacleaner(void *arg)
481.6Spooka{
491.6Spooka	const char *the_argv[7];
501.6Spooka
511.6Spooka	the_argv[0] = "megamaid";
521.6Spooka	the_argv[1] = "-D"; /* don't fork() & detach */
531.6Spooka	the_argv[2] = arg;
541.6Spooka
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.13Spooka	char canon_dev[UKFS_DEVICE_MAXPATHLEN], canon_dir[MAXPATHLEN];
651.7Spooka	char rawdev[MAXPATHLEN];
661.8Spooka	struct p2k_mount *p2m;
671.6Spooka	pthread_t cleanerthread;
681.13Spooka	struct ukfs_part *part;
691.13Spooka	int mntflags;
701.2Spooka	int rv;
711.1Spooka
721.1Spooka	setprogname(argv[0]);
731.15Spooka	puffs_unmountonsignal(SIGINT, true);
741.15Spooka	puffs_unmountonsignal(SIGTERM, true);
751.4Spooka
761.16Spooka	if (argc >= 3) {
771.16Spooka		UKFS_DEVICE_ARGVPROBE(&part);
781.16Spooka		if (part != ukfs_part_none) {
791.16Spooka			errx(1, "lfs does not currently support "
801.16Spooka			    "embedded partitions");
811.16Spooka		}
821.7Spooka	}
831.2Spooka	mount_lfs_parseargs(argc, argv, &args, &mntflags, canon_dev, canon_dir);
841.6Spooka
851.12Spooka	p2m = p2k_init(0);
861.12Spooka	if (!p2m)
871.12Spooka		err(1, "init p2k");
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.9Spooka	rump_pub_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.8Spooka#ifdef CLEANER_TESTING
1041.8Spooka	ukfs_mount(MOUNT_LFS, canon_dev, canon_dir, mntflags,
1051.8Spooka	    &args, sizeof(args));
1061.8Spooka	cleaner(canon_dir);
1071.8Spooka#endif
1081.10Spooka	if (p2k_setup_diskfs(p2m, MOUNT_LFS, canon_dev, part, canon_dir,
1091.10Spooka	    mntflags, &args, sizeof(args)) == -1)
1101.8Spooka		err(1, "mount");
1111.14Spooka	ukfs_part_release(part);
1121.8Spooka
1131.6Spooka#ifndef CLEANER_TESTING
1141.6Spooka	if ((mntflags & MNT_RDONLY) == 0) {
1151.6Spooka		if (pthread_create(&cleanerthread, NULL,
1161.6Spooka		    cleaner, canon_dir) == -1)
1171.6Spooka			err(1, "cannot start cleaner");
1181.6Spooka	}
1191.6Spooka#endif
1201.6Spooka
1211.8Spooka	rv = p2k_mainloop(p2m);
1221.8Spooka	if (rv == -1)
1231.8Spooka		err(1, "fs service");
1241.1Spooka
1251.1Spooka	return 0;
1261.1Spooka}
127