Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/lkm/vfs/ufs lfs is now loadable as LKM



details:   https://anonhg.NetBSD.org/src/rev/dd1aa1a23339
branches:  trunk
changeset: 499833:dd1aa1a23339
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Thu Nov 30 16:00:55 2000 +0000

description:
lfs is now loadable as LKM

diffstat:

 sys/lkm/vfs/ufs/Makefile          |    5 +-
 sys/lkm/vfs/ufs/lfs/Makefile      |    4 +-
 sys/lkm/vfs/ufs/lfs/lkminit_lfs.c |   72 ---------------
 sys/lkm/vfs/ufs/lfs/lkminit_vfs.c |  180 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 184 insertions(+), 77 deletions(-)

diffs (291 lines):

diff -r 8f9598ac1a83 -r dd1aa1a23339 sys/lkm/vfs/ufs/Makefile
--- a/sys/lkm/vfs/ufs/Makefile  Thu Nov 30 15:59:47 2000 +0000
+++ b/sys/lkm/vfs/ufs/Makefile  Thu Nov 30 16:00:55 2000 +0000
@@ -1,7 +1,6 @@
-#       $NetBSD: Makefile,v 1.2 1998/10/04 11:45:44 bouyer Exp $
+#       $NetBSD: Makefile,v 1.3 2000/11/30 16:00:55 jdolecek Exp $
 
 # MISSING:  lfs (loads, but needs syscalls installed)
-#          ffs (untested, needs syscalls installed)
-SUBDIR=        ext2fs mfs
+SUBDIR=        ext2fs lfs mfs
 
 .include <bsd.subdir.mk>
diff -r 8f9598ac1a83 -r dd1aa1a23339 sys/lkm/vfs/ufs/lfs/Makefile
--- a/sys/lkm/vfs/ufs/lfs/Makefile      Thu Nov 30 15:59:47 2000 +0000
+++ b/sys/lkm/vfs/ufs/lfs/Makefile      Thu Nov 30 16:00:55 2000 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile,v 1.5 1999/02/13 02:54:54 lukem Exp $
+#      $NetBSD: Makefile,v 1.6 2000/11/30 16:00:56 jdolecek Exp $
 
 .include "../Makefile.inc"
 
@@ -8,7 +8,7 @@
 
 KMOD=  lfs
 
-SRCS=  lkminit_${KMOD}.c
+SRCS=  lkminit_vfs.c
 SRCS+= lfs_vfsops.c lfs_vnops.c lfs_subr.c
 SRCS+= lfs_alloc.c lfs_balloc.c lfs_bio.c lfs_cksum.c lfs_debug.c
 SRCS+= lfs_inode.c lfs_segment.c lfs_syscalls.c 
diff -r 8f9598ac1a83 -r dd1aa1a23339 sys/lkm/vfs/ufs/lfs/lkminit_lfs.c
--- a/sys/lkm/vfs/ufs/lfs/lkminit_lfs.c Thu Nov 30 15:59:47 2000 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/* $NetBSD: lkminit_lfs.c,v 1.4 2000/03/21 11:46:01 simonb Exp $ */
-
-/*-
- * Copyright (c) 1996 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Michael Graff <explorer%flame.org@localhost>.
- *
- * 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.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * 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/param.h>
-#include <sys/ioctl.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/mount.h>
-#include <sys/exec.h>
-#include <sys/lkm.h>
-#include <sys/file.h>
-#include <sys/errno.h>
-
-int lfs_lkmentry __P((struct lkm_table *, int, int));
-
-/*
- * This is the vfsops table for the file system in question
- */
-extern struct vfsops lfs_vfsops;
-
-/*
- * declare the filesystem
- */
-MOD_VFS("lfs", -1, &lfs_vfsops);
-
-/*
- * entry point
- */
-int
-lfs_lkmentry(lkmtp, cmd, ver)
-       struct lkm_table *lkmtp;        
-       int cmd;
-       int ver;
-{
-
-       DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc)
-}
diff -r 8f9598ac1a83 -r dd1aa1a23339 sys/lkm/vfs/ufs/lfs/lkminit_vfs.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/lkm/vfs/ufs/lfs/lkminit_vfs.c Thu Nov 30 16:00:55 2000 +0000
@@ -0,0 +1,180 @@
+/* $NetBSD: lkminit_vfs.c,v 1.1 2000/11/30 16:00:56 jdolecek Exp $ */
+
+/*-
+ * Copyright (c) 2000 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * 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/param.h>
+#include <sys/ioctl.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/mount.h>
+#include <sys/exec.h>
+#include <sys/lkm.h>
+#include <sys/file.h>
+#include <sys/errno.h>
+
+#define LFS
+#include <sys/syscall.h>
+#include <sys/syscallargs.h>
+
+/* used for lfs syscal entry table */
+struct lfs_sysent {
+       int sysno;
+       struct sysent sysent;
+};
+
+int lfs_lkmentry __P((struct lkm_table *, int, int));
+static int lfs_load __P((struct lkm_table *, int));
+static int lfs_unload __P((struct lkm_table *, int));
+
+#define LFS_SYSENT_CNT         4
+const struct lfs_sysent lfs_sysents[LFS_SYSENT_CNT] = {
+       { SYS_lfs_bmapv,
+               { 3, sizeof(struct sys_lfs_bmapv_args), sys_lfs_bmapv } },
+       { SYS_lfs_markv,
+               { 3, sizeof(struct sys_lfs_markv_args), sys_lfs_markv } },
+       { SYS_lfs_segclean,
+               { 2, sizeof(struct sys_lfs_segclean_args), sys_lfs_segclean } },
+       { SYS_lfs_segwait,
+               { 2, sizeof(struct sys_lfs_segwait_args), sys_lfs_segwait } },
+};
+
+/*
+ * This is the vfsops table for the file system in question
+ */
+extern struct vfsops lfs_vfsops;
+
+/*
+ * declare the filesystem
+ */
+MOD_VFS("lfs", -1, &lfs_vfsops);
+
+/*
+ * entry point
+ */
+int
+lfs_lkmentry(lkmtp, cmd, ver)
+       struct lkm_table *lkmtp;        
+       int cmd;
+       int ver;
+{
+       int error;
+
+       /*
+        * Since we need to call lkmdispatch() first, we can't use
+        * DISPATCH().
+        */
+
+       if (ver != LKM_VERSION)
+               return EINVAL;  /* version mismatch */
+
+       /* do this first, lkmdispatch() expects this to be already filled in */
+       if (cmd == LKM_E_LOAD)
+               lkmtp->private.lkm_any = (struct lkm_any *)&_module;
+
+       if ((error = lkmdispatch(lkmtp, cmd)))
+               return error;
+
+       switch (cmd) {
+       case LKM_E_LOAD:
+               if ((error = lfs_load(lkmtp, cmd)) != 0)
+                       return error;
+               break;
+       case LKM_E_UNLOAD:
+               if ((error = lfs_unload(lkmtp, cmd)) != 0)
+                       return error;
+               break;
+       case LKM_E_STAT:
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+/*
+ * Insert lfs sycalls entries into sysent[].
+ */
+static int
+lfs_load(lkmtp, cmd)
+       struct lkm_table *lkmtp;        
+       int cmd;
+{
+       int i;
+       
+       /* first check if the entries are empty */
+       for(i=0; i < LFS_SYSENT_CNT; i++) {
+               if (sysent[lfs_sysents[i].sysno].sy_call != sys_nosys) {
+                       printf("LKM lfs_load(): lfs syscall %d already used\n",
+                               lfs_sysents[i].sysno);
+                       return EEXIST;
+               }
+       }
+
+       /* now, put in the lfs syscalls */
+       for(i=0; i < LFS_SYSENT_CNT; i++) {
+               sysent[lfs_sysents[i].sysno].sy_narg =
+                       lfs_sysents[i].sysent.sy_narg;
+               sysent[lfs_sysents[i].sysno].sy_argsize =
+                       lfs_sysents[i].sysent.sy_argsize;
+               sysent[lfs_sysents[i].sysno].sy_call =
+                       lfs_sysents[i].sysent.sy_call;
+       }
+
+       return 0;
+}
+
+/*
+ * Remove lfs sycalls entries from sysent[].
+ */
+static int
+lfs_unload(lkmtp, cmd)
+       struct lkm_table *lkmtp;        
+       int cmd;
+{
+       int i;
+
+       /* reset lfs syscall entries back to nosys */
+       for(i=0; i < LFS_SYSENT_CNT; i++) {
+               if (sysent[lfs_sysents[i].sysno].sy_call !=
+                               lfs_sysents[i].sysent.sy_call) {
+                       panic("LKM lfs_unload(): syscall %d not lfs syscall",
+                               lfs_sysents[i].sysno);
+               }
+               sysent[lfs_sysents[i].sysno].sy_narg = 0;
+               sysent[lfs_sysents[i].sysno].sy_argsize = 0;
+               sysent[lfs_sysents[i].sysno].sy_call = sys_nosys;
+       }
+
+       return 0;
+}



Home | Main Index | Thread Index | Old Index