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