Module Name:    src
Committed By:   pooka
Date:           Thu Aug  6 00:51:55 UTC 2009

Modified Files:
        src/libexec/lfs_cleanerd: Makefile coalesce.c fdfs.c lfs_cleanerd.c
        src/sbin/fsck_lfs: Makefile lfs.c vnode.c
        src/sbin/newfs_lfs: Makefile
Added Files:
        src/libexec/lfs_cleanerd: Makefile.inc
        src/sbin/fsck_lfs: kernelops.c kernelops.h

Log Message:
Define syscalls of lfs userspace tools (cleaner, mainly) through
a struct called kernelops, which contains standard system calls
for the normal case and rump system calls for the rump case.

Make it possible to run the lfs cleaner in a library fashion (taking
the quick route with the implementation).


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/libexec/lfs_cleanerd/Makefile
cvs rdiff -u -r0 -r1.1 src/libexec/lfs_cleanerd/Makefile.inc
cvs rdiff -u -r1.17 -r1.18 src/libexec/lfs_cleanerd/coalesce.c
cvs rdiff -u -r1.6 -r1.7 src/libexec/lfs_cleanerd/fdfs.c
cvs rdiff -u -r1.20 -r1.21 src/libexec/lfs_cleanerd/lfs_cleanerd.c
cvs rdiff -u -r1.16 -r1.17 src/sbin/fsck_lfs/Makefile
cvs rdiff -u -r0 -r1.1 src/sbin/fsck_lfs/kernelops.c \
    src/sbin/fsck_lfs/kernelops.h
cvs rdiff -u -r1.30 -r1.31 src/sbin/fsck_lfs/lfs.c
cvs rdiff -u -r1.9 -r1.10 src/sbin/fsck_lfs/vnode.c
cvs rdiff -u -r1.8 -r1.9 src/sbin/newfs_lfs/Makefile

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/lfs_cleanerd/Makefile
diff -u src/libexec/lfs_cleanerd/Makefile:1.14 src/libexec/lfs_cleanerd/Makefile:1.15
--- src/libexec/lfs_cleanerd/Makefile:1.14	Sun Jun 21 20:20:50 2009
+++ src/libexec/lfs_cleanerd/Makefile	Thu Aug  6 00:51:55 2009
@@ -1,24 +1,10 @@
-#	$NetBSD: Makefile,v 1.14 2009/06/21 20:20:50 christos Exp $
+#	$NetBSD: Makefile,v 1.15 2009/08/06 00:51:55 pooka Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
-WARNS?=3		# XXX: too many sign-compare issues
-
-.include <bsd.own.mk>
+.include "Makefile.inc"
 
 PROG=	lfs_cleanerd
-SRCS=	lfs_cleanerd.c fdfs.c coalesce.c cleansrv.c
-SRCS+=  lfs_cksum.c
-SRCS+=	bufcache.c vnode.c lfs.c # segwrite.c
 MAN=	lfs_cleanerd.8
-.PATH:	${NETBSDSRCDIR}/sys/ufs/lfs ${NETBSDSRCDIR}/sbin/fsck_lfs
-
-FSCK_LFS= ${NETBSDSRCDIR}/sbin/fsck_lfs
-DPADD=  ${LIBUTIL}
-LDADD=  -lutil
-CPPFLAGS+=-I${FSCK_LFS} "-Dmutex_enter(x)=" "-Dmutex_exit(x)=" # -DUSE_CLIENT_SERVER 
-CPPFLAGS+="-DKASSERT(x)="
-#CPPFLAGS+=-DREPAIR_ZERO_FINFO
-#CPPFLAGS+=-DTEST_PATTERN
 
 BINDIR=		/libexec
 .if (${MKDYNAMICROOT} == "no")

Index: src/libexec/lfs_cleanerd/coalesce.c
diff -u src/libexec/lfs_cleanerd/coalesce.c:1.17 src/libexec/lfs_cleanerd/coalesce.c:1.18
--- src/libexec/lfs_cleanerd/coalesce.c:1.17	Mon Mar 16 00:08:10 2009
+++ src/libexec/lfs_cleanerd/coalesce.c	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-/*      $NetBSD: coalesce.c,v 1.17 2009/03/16 00:08:10 lukem Exp $  */
+/*      $NetBSD: coalesce.c,v 1.18 2009/08/06 00:51:55 pooka Exp $  */
 
 /*-
  * Copyright (c) 2002, 2005 The NetBSD Foundation, Inc.
@@ -56,6 +56,7 @@
 #include "bufcache.h"
 #include "vnode.h"
 #include "cleaner.h"
+#include "kernelops.h"
 
 extern int debug, do_mmap;
 
@@ -197,7 +198,7 @@
 	}
 	lim.blkiov = bip;
 	lim.blkcnt = nb;
-	if (fcntl(fs->clfs_ifilefd, LFCNBMAPV, &lim) < 0) { 
+	if (kops.ko_fcntl(fs->clfs_ifilefd, LFCNBMAPV, &lim) < 0) { 
 		syslog(LOG_WARNING, "%s: coalesce: LFCNBMAPV: %m",
 		       fs->lfs_fsmnt);
 		retval = COALESCE_BADBMAPV;
@@ -277,7 +278,7 @@
 			goto out;
 		}
 
-		if (pread(fs->clfs_devfd, bip[i].bi_bp, bip[i].bi_size,
+		if (kops.ko_pread(fs->clfs_devfd, bip[i].bi_bp, bip[i].bi_size,
 			  fsbtob(fs, bip[i].bi_daddr)) < 0) {
 			retval = COALESCE_EIO;
 			goto out;
@@ -300,12 +301,13 @@
 			brelse(bp, B_INVAL);
 
 			if (cip.clean < 4) /* XXX magic number 4 */
-				fcntl(fs->clfs_ifilefd, LFCNSEGWAIT, NULL);
+				kops.ko_fcntl(fs->clfs_ifilefd,
+				    LFCNSEGWAIT, NULL);
 		} while(cip.clean < 4);
 
 		lim.blkiov = tbip;
 		lim.blkcnt = (tbip + bps < bip + nb ? bps : nb % bps);
-		if (fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim) < 0) {
+		if (kops.ko_fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim) < 0) {
 			retval = COALESCE_BADMARKV;
 			goto out;
 		}

Index: src/libexec/lfs_cleanerd/fdfs.c
diff -u src/libexec/lfs_cleanerd/fdfs.c:1.6 src/libexec/lfs_cleanerd/fdfs.c:1.7
--- src/libexec/lfs_cleanerd/fdfs.c:1.6	Mon Apr 28 20:23:04 2008
+++ src/libexec/lfs_cleanerd/fdfs.c	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: fdfs.c,v 1.6 2008/04/28 20:23:04 martin Exp $	 */
+/* $NetBSD: fdfs.c,v 1.7 2009/08/06 00:51:55 pooka Exp $	 */
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -52,6 +52,7 @@
 #include "vnode.h"
 #include "bufcache.h"
 #include "fdfs.h"
+#include "kernelops.h"
 
 /*
  * Return a "vnode" interface to a given file descriptor.
@@ -202,7 +203,7 @@
 	fs->fd_bufp[fs->fd_bufi].start = start;
 	fs->fd_bufp[fs->fd_bufi].end =	 start + fs->fd_ssize / fs->fd_bsize;
 
-	if ((r = pread(fs->fd_fd, fs->fd_bufp[fs->fd_bufi].buf,
+	if ((r = kops.ko_pread(fs->fd_fd, fs->fd_bufp[fs->fd_bufi].buf,
 		       (size_t)fs->fd_ssize, start * fs->fd_bsize)) < 0) {
 		syslog(LOG_ERR, "preload to segment buffer %d", fs->fd_bufi);
 		return r;
@@ -250,12 +251,12 @@
 			bp->b_flags |= (B_DONTFREE | B_DONE);
 			return 0;
 		}
-		count = pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		count = kops.ko_pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 			      bp->b_blkno * fs->fd_bsize);
 		if (count == bp->b_bcount)
 			bp->b_flags |= B_DONE;
 	} else {
-		count = pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		count = kops.ko_pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 			       bp->b_blkno * fs->fd_bsize);
 		if (count == 0) {
 			perror("pwrite");

Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c
diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.20 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.21
--- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.20	Thu Aug  6 00:23:08 2009
+++ src/libexec/lfs_cleanerd/lfs_cleanerd.c	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_cleanerd.c,v 1.20 2009/08/06 00:23:08 pooka Exp $	 */
+/* $NetBSD: lfs_cleanerd.c,v 1.21 2009/08/06 00:51:55 pooka Exp $	 */
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -57,6 +57,8 @@
 #include "lfs_user.h"
 #include "fdfs.h"
 #include "cleaner.h"
+#include "kernelops.h"
+#include "mount_lfs.h"
 
 /*
  * Global variables.
@@ -134,8 +136,8 @@
 	char fsname[MNAMELEN];
 
 	strncpy(fsname, (char *)fs->lfs_fsmnt, MNAMELEN);
-	close(fs->clfs_ifilefd);
-	close(fs->clfs_devfd);
+	kops.ko_close(fs->clfs_ifilefd);
+	kops.ko_close(fs->clfs_devfd);
 	fd_reclaim(fs->clfs_devvp);
 	fd_reclaim(fs->lfs_ivnode);
 	free(fs->clfs_dev);
@@ -157,7 +159,7 @@
 	int i;
 	
 	fs->clfs_dev = fsname;
-	if ((fs->clfs_devfd = open(fs->clfs_dev, O_RDWR)) < 0) {
+	if ((fs->clfs_devfd = kops.ko_open(fs->clfs_dev, O_RDWR)) < 0) {
 		syslog(LOG_ERR, "couldn't open device %s read/write",
 		       fs->clfs_dev);
 		return -1;
@@ -207,7 +209,7 @@
 	 * XXX this is ugly.  Is there a way to discover the raw device
 	 * XXX for a given mount point?
 	 */
-	if (statvfs(fsname, &sf) < 0)
+	if (kops.ko_statvfs(fsname, &sf, ST_WAIT) < 0)
 		return -1;
 	fs->clfs_dev = malloc(strlen(sf.f_mntfromname) + 2);
 	if (fs->clfs_dev == NULL) {
@@ -215,24 +217,24 @@
 		return -1;
 	}
 	sprintf(fs->clfs_dev, "/dev/r%s", sf.f_mntfromname + 5);
-	if ((fs->clfs_devfd = open(fs->clfs_dev, O_RDONLY)) < 0) {
+	if ((fs->clfs_devfd = kops.ko_open(fs->clfs_dev, O_RDONLY, 0)) < 0) {
 		syslog(LOG_ERR, "couldn't open device %s for reading",
 			fs->clfs_dev);
 		return -1;
 	}
 
 	/* Find the Ifile and open it */
-	if ((rootfd = open(fsname, O_RDONLY)) < 0)
+	if ((rootfd = kops.ko_open(fsname, O_RDONLY, 0)) < 0)
 		return -2;
-	if (fcntl(rootfd, LFCNIFILEFH, &fs->clfs_ifilefh) < 0)
+	if (kops.ko_fcntl(rootfd, LFCNIFILEFH, &fs->clfs_ifilefh) < 0)
 		return -3;
-	if ((fs->clfs_ifilefd = fhopen(&fs->clfs_ifilefh,
+	if ((fs->clfs_ifilefd = kops.ko_fhopen(&fs->clfs_ifilefh,
 	    sizeof(fs->clfs_ifilefh), O_RDONLY)) < 0)
 		return -4;
-	close(rootfd);
+	kops.ko_close(rootfd);
 
 	/* Load in the superblock */
-	if (pread(fs->clfs_devfd, &(fs->lfs_dlfs), sizeof(struct dlfs),
+	if (kops.ko_pread(fs->clfs_devfd, &(fs->lfs_dlfs), sizeof(struct dlfs),
 		  LFS_LABELPAD) < 0)
 		return -1;
 
@@ -798,7 +800,7 @@
 	/* Use bmapv to locate the blocks */
 	lim.blkiov = bip;
 	lim.blkcnt = *bic;
-	if ((r = fcntl(fs->clfs_ifilefd, LFCNBMAPV, &lim)) < 0) {
+	if ((r = kops.ko_fcntl(fs->clfs_ifilefd, LFCNBMAPV, &lim)) < 0) {
 		syslog(LOG_WARNING, "%s: bmapv returned %d (%m)",
 		       fs->lfs_fsmnt, r);
 		return;
@@ -859,7 +861,7 @@
 	 */
 	lim.blkiov = bip;
 	lim.blkcnt = bic;
-	if ((r = fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim)) < 0) {
+	if ((r = kops.ko_fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim)) < 0) {
 		syslog(LOG_WARNING, "%s: markv returned %d (%m) "
 		       "for seg %d", fs->lfs_fsmnt, r, sn);
 		return r;
@@ -868,7 +870,7 @@
 	/*
 	 * Finally call invalidate to invalidate the segment.
 	 */
-	if ((r = fcntl(fs->clfs_ifilefd, LFCNINVAL, &sn)) < 0) {
+	if ((r = kops.ko_fcntl(fs->clfs_ifilefd, LFCNINVAL, &sn)) < 0) {
 		syslog(LOG_WARNING, "%s: inval returned %d (%m) "
 		       "for seg %d", fs->lfs_fsmnt, r, sn);
 		return r;
@@ -1129,7 +1131,7 @@
 		}
 #endif /* TEST_PATTERN */
 		dlog("sending blocks %d-%d", mc, mc + lim.blkcnt - 1);
-		if ((r = fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim)) < 0) {
+		if ((r = kops.ko_fcntl(fs->clfs_ifilefd, LFCNMARKV, &lim))<0) {
 			syslog(LOG_WARNING, "%s: markv returned %d (%m)",
 			       fs->lfs_fsmnt, r);
 			if (errno != EAGAIN && errno != ESHUTDOWN) {
@@ -1158,7 +1160,7 @@
 	/*
 	 * Finally call reclaim to prompt cleaning of the segments.
 	 */
-	fcntl(fs->clfs_ifilefd, LFCNRECLAIM, NULL);
+	kops.ko_fcntl(fs->clfs_ifilefd, LFCNRECLAIM, NULL);
 
 	fd_release_all(fs->clfs_devvp);
 	return 0;
@@ -1309,12 +1311,21 @@
 	     "[-n nsegs] [-r report_freq] [-t timeout] fs_name ...");
 }
 
+#ifndef LFS_CLEANER_AS_LIB
 /*
  * Main.
  */
 int
 main(int argc, char **argv)
 {
+
+	return lfs_cleaner_main(argc, argv);
+}
+#endif
+
+int
+lfs_cleaner_main(int argc, char **argv)
+{
 	int i, opt, error, r, loopcount, nodetach;
 	struct timeval tv;
 	CLEANERINFO ci;
@@ -1538,7 +1549,7 @@
 		} while(cleaned_one);
 		tv.tv_sec = segwait_timeout;
 		tv.tv_usec = 0;
-		error = fcntl(fsp[0]->clfs_ifilefd, LFCNSEGWAITALL, &tv);
+		error = kops.ko_fcntl(fsp[0]->clfs_ifilefd,LFCNSEGWAITALL,&tv);
 		if (error)
 			err(1, "LFCNSEGWAITALL");
 	}

Index: src/sbin/fsck_lfs/Makefile
diff -u src/sbin/fsck_lfs/Makefile:1.16 src/sbin/fsck_lfs/Makefile:1.17
--- src/sbin/fsck_lfs/Makefile:1.16	Sat Apr 11 07:58:12 2009
+++ src/sbin/fsck_lfs/Makefile	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.16 2009/04/11 07:58:12 lukem Exp $
+#	$NetBSD: Makefile,v 1.17 2009/08/06 00:51:55 pooka Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/5/93
 
 WARNS?=	3	# XXX: sign-compare issues
@@ -10,6 +10,7 @@
 SRCS=	bufcache.c dir.c fsutil.c inode.c lfs.c lfs_cksum.c lfs_itimes.c main.c
 SRCS+=	pass0.c pass1.c pass2.c pass3.c pass4.c pass5.c pass6.c
 SRCS+=	segwrite.c setup.c utilities.c vars.c vnode.c
+SRCS+=	kernelops.c
 FSCK=	${NETBSDSRCDIR}/sbin/fsck
 .PATH:	${NETBSDSRCDIR}/sys/ufs/lfs ${FSCK}
 CPPFLAGS+=-I${.CURDIR} -I${FSCK} -DIN_FSCK_LFS "-Dmutex_enter(x)=" "-Dmutex_exit(x)="

Index: src/sbin/fsck_lfs/lfs.c
diff -u src/sbin/fsck_lfs/lfs.c:1.30 src/sbin/fsck_lfs/lfs.c:1.31
--- src/sbin/fsck_lfs/lfs.c:1.30	Sun Feb 22 20:28:05 2009
+++ src/sbin/fsck_lfs/lfs.c	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.30 2009/02/22 20:28:05 ad Exp $ */
+/* $NetBSD: lfs.c,v 1.31 2009/08/06 00:51:55 pooka Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -90,6 +90,7 @@
 #include "vnode.h"
 #include "lfs_user.h"
 #include "segwrite.h"
+#include "kernelops.h"
 
 #define panic call_panic
 
@@ -117,12 +118,12 @@
 	int count;
 
 	if (bp->b_flags & B_READ) {
-		count = pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		count = kops.ko_pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 		    dbtob(bp->b_blkno));
 		if (count == bp->b_bcount)
 			bp->b_flags |= B_DONE;
 	} else {
-		count = pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		count = kops.ko_pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 		    dbtob(bp->b_blkno));
 		if (count == 0) {
 			perror("pwrite");

Index: src/sbin/fsck_lfs/vnode.c
diff -u src/sbin/fsck_lfs/vnode.c:1.9 src/sbin/fsck_lfs/vnode.c:1.10
--- src/sbin/fsck_lfs/vnode.c:1.9	Mon Apr 28 20:23:08 2008
+++ src/sbin/fsck_lfs/vnode.c	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.c,v 1.9 2008/04/28 20:23:08 martin Exp $ */
+/* $NetBSD: vnode.c,v 1.10 2009/08/06 00:51:55 pooka Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -53,6 +53,7 @@
 
 #include "bufcache.h"
 #include "vnode.h"
+#include "kernelops.h"
 
 struct uvnodelst vnodelist;
 struct uvnodelst getvnodelist[VNODE_HASH_MAX];
@@ -73,10 +74,10 @@
 raw_vop_strategy(struct ubuf * bp)
 {
 	if (bp->b_flags & B_READ) {
-		return pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		return kops.ko_pread(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 		    dbtob(bp->b_blkno));
 	} else {
-		return pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
+		return kops.ko_pwrite(bp->b_vp->v_fd, bp->b_data, bp->b_bcount,
 		    dbtob(bp->b_blkno));
 	}
 }

Index: src/sbin/newfs_lfs/Makefile
diff -u src/sbin/newfs_lfs/Makefile:1.8 src/sbin/newfs_lfs/Makefile:1.9
--- src/sbin/newfs_lfs/Makefile:1.8	Fri Jun  5 21:52:31 2009
+++ src/sbin/newfs_lfs/Makefile	Thu Aug  6 00:51:55 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.8 2009/06/05 21:52:31 haad Exp $
+#	$NetBSD: Makefile,v 1.9 2009/08/06 00:51:55 pooka Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
 WARNS?=	3	# XXX: sign-compare issues
@@ -8,6 +8,7 @@
 PROG=	newfs_lfs
 SRCS=	dkcksum.c make_lfs.c lfs_cksum.c misc.c newfs.c
 SRCS+=	bufcache.c vnode.c lfs.c segwrite.c lfs_itimes.c partutil.c
+SRCS+=	kernelops.c
 MAN=	newfs_lfs.8
 
 DISKLABEL= ${NETBSDSRCDIR}/sbin/disklabel

Added files:

Index: src/libexec/lfs_cleanerd/Makefile.inc
diff -u /dev/null src/libexec/lfs_cleanerd/Makefile.inc:1.1
--- /dev/null	Thu Aug  6 00:51:55 2009
+++ src/libexec/lfs_cleanerd/Makefile.inc	Thu Aug  6 00:51:55 2009
@@ -0,0 +1,21 @@
+#	$NetBSD: Makefile.inc,v 1.1 2009/08/06 00:51:55 pooka Exp $
+#	@(#)Makefile	8.1 (Berkeley) 6/18/93
+
+WARNS?=3		# XXX: too many sign-compare issues
+
+.include <bsd.own.mk>
+
+SRCS=	lfs_cleanerd.c fdfs.c coalesce.c cleansrv.c
+SRCS+=  lfs_cksum.c
+SRCS+=	bufcache.c vnode.c lfs.c kernelops.c # segwrite.c
+.PATH:	${NETBSDSRCDIR}/sys/ufs/lfs ${NETBSDSRCDIR}/sbin/fsck_lfs	\
+	${NETBSDSRCDIR}/libexec/lfs_cleanerd
+
+FSCK_LFS= ${NETBSDSRCDIR}/sbin/fsck_lfs
+DPADD=  ${LIBUTIL}
+LDADD=  -lutil
+CPPFLAGS+=-I${FSCK_LFS} -I${NETBSDSRCDIR}/sbin/mount_lfs # -DUSE_CLIENT_SERVER 
+CPPFLAGS+="-Dmutex_enter(x)=" "-Dmutex_exit(x)="
+CPPFLAGS+="-DKASSERT(x)="
+#CPPFLAGS+=-DREPAIR_ZERO_FINFO
+#CPPFLAGS+=-DTEST_PATTERN

Index: src/sbin/fsck_lfs/kernelops.c
diff -u /dev/null src/sbin/fsck_lfs/kernelops.c:1.1
--- /dev/null	Thu Aug  6 00:51:55 2009
+++ src/sbin/fsck_lfs/kernelops.c	Thu Aug  6 00:51:55 2009
@@ -0,0 +1,80 @@
+/*	$NetBSD: kernelops.c,v 1.1 2009/08/06 00:51:55 pooka Exp $	*/
+
+/*
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: kernelops.c,v 1.1 2009/08/06 00:51:55 pooka Exp $");
+#endif /* !lint */
+
+/*
+ * Select operations vector for kernel communication -- either regular
+ * system calls or rump system calls.  The latter are use when the
+ * cleaner is run as part of rump_lfs.
+ *
+ * The selection is controlled by an ifdef for now, since I see no
+ * value in making it dynamic.
+ */
+
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/statvfs.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "kernelops.h"
+
+#ifdef USE_RUMP
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+struct kernelops kops = {
+	.ko_open = rump_sys_open,
+	.ko_fcntl = rump_sys_fcntl,
+	.ko_statvfs = rump_sys_statvfs1,
+	.ko_fhopen = rump_sys_fhopen,
+	.ko_close = rump_sys_close,
+
+	.ko_pread = rump_sys_pread,
+	.ko_pwrite = rump_sys_pwrite,
+};
+
+#else
+
+struct kernelops kops = {
+	.ko_open = (void *)open, /* XXX: fix rump_syscalls */
+	.ko_fcntl = (void *)fcntl,
+	.ko_statvfs = statvfs1,
+	.ko_fhopen = fhopen,
+	.ko_close = close,
+
+	.ko_pread = pread,
+	.ko_pwrite = pwrite,
+};
+#endif
Index: src/sbin/fsck_lfs/kernelops.h
diff -u /dev/null src/sbin/fsck_lfs/kernelops.h:1.1
--- /dev/null	Thu Aug  6 00:51:55 2009
+++ src/sbin/fsck_lfs/kernelops.h	Thu Aug  6 00:51:55 2009
@@ -0,0 +1,22 @@
+#ifndef _LFS_KERNEL_OPS_H_
+#define _LFS_KERNEL_OPS_H_
+
+#include <sys/types.h>
+#include <sys/statvfs.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+struct kernelops {
+	int (*ko_open)(const char *, int, mode_t);
+	int (*ko_statvfs)(const char *, struct statvfs *, int);
+	int (*ko_fcntl)(int, int, void *);
+	int (*ko_fhopen)(const void *, size_t, int);
+	int (*ko_close)(int);
+
+	ssize_t (*ko_pread)(int, void *, size_t, off_t);
+	ssize_t (*ko_pwrite)(int, const void *, size_t, off_t);
+};
+extern struct kernelops kops;
+
+#endif /* _LFS_KERNEL_OPS_H_ */

Reply via email to