rump_lfs.c revision 1.12
11.12Spooka/*	$NetBSD: rump_lfs.c,v 1.12 2009/11/05 14:17:07 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.6Spooka	lfs_cleaner_main(3, __UNCONST(the_argv));
551.6Spooka
561.6Spooka	return NULL;
571.6Spooka}
581.6Spooka
591.1Spookaint
601.1Spookamain(int argc, char *argv[])
611.1Spooka{
621.1Spooka	struct ufs_args args;
631.7Spooka	char canon_dev[UKFS_PARTITION_MAXPATHLEN], canon_dir[MAXPATHLEN];
641.7Spooka	char rawdev[MAXPATHLEN];
651.8Spooka	struct p2k_mount *p2m;
661.6Spooka	pthread_t cleanerthread;
671.7Spooka	int mntflags, part;
681.2Spooka	int rv;
691.1Spooka
701.1Spooka	setprogname(argv[0]);
711.4Spooka
721.7Spooka	UKFS_PARTITION_ARGVPROBE(part);
731.7Spooka	if (part != UKFS_PARTITION_NONE) {
741.7Spooka		errx(1, "lfs does not currently support embedded partitions");
751.7Spooka	}
761.2Spooka	mount_lfs_parseargs(argc, argv, &args, &mntflags, canon_dev, canon_dir);
771.6Spooka
781.12Spooka	p2m = p2k_init(0);
791.12Spooka	if (!p2m)
801.12Spooka		err(1, "init p2k");
811.6Spooka	/*
821.6Spooka	 * XXX: this particular piece inspired by the cleaner code.
831.6Spooka	 * obviously FIXXXME along with the cleaner.
841.6Spooka	 */
851.6Spooka	sprintf(rawdev, "/dev/r%s", canon_dev+5);
861.9Spooka	rump_pub_etfs_register(rawdev, canon_dev, RUMP_ETFS_CHR);
871.6Spooka
881.6Spooka	/*
891.6Spooka	 * We basically have two choices:
901.6Spooka	 *  1) run the cleaner in another process and do rump ipc syscalls
911.6Spooka	 *  2) run it off a thread in this process and do rump syscalls
921.6Spooka	 *     as function calls.
931.6Spooka	 *
941.6Spooka	 * opt for "2" for now
951.6Spooka	 */
961.8Spooka#ifdef CLEANER_TESTING
971.8Spooka	ukfs_mount(MOUNT_LFS, canon_dev, canon_dir, mntflags,
981.8Spooka	    &args, sizeof(args));
991.8Spooka	cleaner(canon_dir);
1001.8Spooka#endif
1011.10Spooka	if (p2k_setup_diskfs(p2m, MOUNT_LFS, canon_dev, part, canon_dir,
1021.10Spooka	    mntflags, &args, sizeof(args)) == -1)
1031.8Spooka		err(1, "mount");
1041.8Spooka
1051.6Spooka#ifndef CLEANER_TESTING
1061.6Spooka	if ((mntflags & MNT_RDONLY) == 0) {
1071.6Spooka		if (pthread_create(&cleanerthread, NULL,
1081.6Spooka		    cleaner, canon_dir) == -1)
1091.6Spooka			err(1, "cannot start cleaner");
1101.6Spooka	}
1111.6Spooka#endif
1121.6Spooka
1131.8Spooka	rv = p2k_mainloop(p2m);
1141.8Spooka	if (rv == -1)
1151.8Spooka		err(1, "fs service");
1161.1Spooka
1171.1Spooka	return 0;
1181.1Spooka}
119