Source-Changes-HG archive

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

[src/trunk]: src/sys/compat/linux/common proper statfs emulation...



details:   https://anonhg.NetBSD.org/src/rev/fc8a3587bf66
branches:  trunk
changeset: 522515:fc8a3587bf66
user:      christos <christos%NetBSD.org@localhost>
date:      Wed Feb 20 17:03:03 2002 +0000

description:
proper statfs emulation...

diffstat:

 sys/compat/linux/common/linux_misc.c |  63 +++++++++++++++++++++++++++--------
 sys/compat/linux/common/linux_misc.h |  33 ++++++++++++++++++-
 2 files changed, 80 insertions(+), 16 deletions(-)

diffs (155 lines):

diff -r d289a1510ef7 -r fc8a3587bf66 sys/compat/linux/common/linux_misc.c
--- a/sys/compat/linux/common/linux_misc.c      Wed Feb 20 17:02:48 2002 +0000
+++ b/sys/compat/linux/common/linux_misc.c      Wed Feb 20 17:03:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_misc.c,v 1.100 2002/02/18 22:24:18 christos Exp $        */
+/*     $NetBSD: linux_misc.c,v 1.101 2002/02/20 17:03:03 christos Exp $        */
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.100 2002/02/18 22:24:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.101 2002/02/20 17:03:03 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,6 +131,35 @@
        -1
 };
 
+const static struct mnttypes {
+       char *bsd;
+       int linux;
+} fstypes[] = {
+       { MOUNT_FFS,            LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_NFS,            LINUX_NFS_SUPER_MAGIC           },
+       { MOUNT_MFS,            LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_MSDOS,          LINUX_MSDOS_SUPER_MAGIC         },
+       { MOUNT_LFS,            LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_FDESC,          LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_PORTAL,         LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_NULL,           LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_OVERLAY,        LINUX_DEFAULT_SUPER_MAGIC       },      
+       { MOUNT_UMAP,           LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_KERNFS,         LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_PROCFS,         LINUX_PROC_SUPER_MAGIC          },
+       { MOUNT_AFS,            LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_CD9660,         LINUX_ISOFS_SUPER_MAGIC         },
+       { MOUNT_UNION,          LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_ADOSFS,         LINUX_ADFS_SUPER_MAGIC          },
+       { MOUNT_EXT2FS,         LINUX_EXT2_SUPER_MAGIC          },
+       { MOUNT_CFS,            LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_CODA,           LINUX_CODA_SUPER_MAGIC          },
+       { MOUNT_FILECORE,       LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_NTFS,           LINUX_DEFAULT_SUPER_MAGIC       },
+       { MOUNT_SMBFS,          LINUX_SMB_SUPER_MAGIC           }
+};
+#define FSTYPESSIZE (sizeof(fstypes) / sizeof(fstypes[0]))
+
 /* Local linux_misc.c functions: */
 static void bsd_to_linux_statfs __P((struct statfs *, struct linux_statfs *));
 static int linux_to_bsd_limit __P((int));
@@ -261,17 +290,33 @@
        struct statfs *bsp;
        struct linux_statfs *lsp;
 {
+       int i;
 
-       lsp->l_ftype = bsp->f_type;
+       for (i = 0; i < FSTYPESSIZE; i++)
+               if (strcmp(bsp->f_fstypename, fstypes[i].bsd) == 0)
+                       break;
+
+       if (i == FSTYPESSIZE) {
+#ifdef DIAGNOSTIC
+               printf("unhandled fstype in linux emulation: %s\n",
+                   bsp->f_fstypename);
+#endif
+               lsp->l_ftype = LINUX_DEFAULT_SUPER_MAGIC;
+       } else {
+               lsp->l_ftype = fstypes[i].linux;
+       }
+
        lsp->l_fbsize = bsp->f_bsize;
        lsp->l_fblocks = bsp->f_blocks;
        lsp->l_fbfree = bsp->f_bfree;
        lsp->l_fbavail = bsp->f_bavail;
        lsp->l_ffiles = bsp->f_files;
        lsp->l_fffree = bsp->f_ffree;
+       /* Linux sets the fsid to 0..., we don't */
        lsp->l_ffsid.val[0] = bsp->f_fsid.val[0];
        lsp->l_ffsid.val[1] = bsp->f_fsid.val[1];
        lsp->l_fnamelen = MAXNAMLEN;    /* XXX */
+       (void)memset(lsp->l_fspare, 0, sizeof(lsp->l_fspare));
 }
 
 /*
@@ -346,18 +391,6 @@
 }
 
 /*
- * NOTE: DO NOT CHANGE THIS
- * Linux makes assumptions about specific features being present with
- * more recent kernels. Specifically, LinuxThreads use RT queued
- * signals if the kernel release is bigger. Since we don't support them
- * yet, the version needs to stay this way until we'd have the RT queued
- * signals implemented.
- */
-char linux_sysname[] = "Linux";
-char linux_release[] = "2.0.38";
-char linux_version[] = "#0 Sun Apr 1 11:11:11 MET 2000";
-
-/*
  * uname(). Just copy the info from the various strings stored in the
  * kernel, and put it in the Linux utsname structure. That structure
  * is almost the same as the NetBSD one, only it has fields 65 characters
diff -r d289a1510ef7 -r fc8a3587bf66 sys/compat/linux/common/linux_misc.h
--- a/sys/compat/linux/common/linux_misc.h      Wed Feb 20 17:02:48 2002 +0000
+++ b/sys/compat/linux/common/linux_misc.h      Wed Feb 20 17:03:03 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_misc.h,v 1.6 2002/02/15 16:48:03 christos Exp $  */
+/*     $NetBSD: linux_misc.h,v 1.7 2002/02/20 17:03:04 christos Exp $  */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -78,6 +78,37 @@
 #define        LINUX_RLIMIT_LOCKS      10
 #define        LINUX_RLIM_INFINITY     ~0ul
 
+
+/* When we don't know what to do, let it believe it is local */
+#define        LINUX_DEFAULT_SUPER_MAGIC       LINUX_EXT2_SUPER_MAGIC
+
+#define        LINUX_ADFS_SUPER_MAGIC          0x0000adf5
+#define        LINUX_AFFS_SUPER_MAGIC          0x0000adff
+#define        LINUX_CODA_SUPER_MAGIC          0x73757245
+#define        LINUX_COH_SUPER_MAGIC           (LINUX_SYSV_MAGIC_BASE + 4)
+#define        LINUX_DEVFS_SUPER_MAGIC         0x00001373
+#define        LINUX_EFS_SUPER_MAGIC           0x00414A53
+#define        LINUX_EXT2_SUPER_MAGIC          0x0000EF53
+#define        LINUX_HPFS_SUPER_MAGIC          0xf995e849
+#define        LINUX_ISOFS_SUPER_MAGIC         0x00009660
+#define        LINUX_MINIX2_SUPER_MAGIC        0x00002468
+#define        LINUX_MINIX2_SUPER_MAGIC2       0x00002478
+#define        LINUX_MINIX_SUPER_MAGIC         0x0000137F
+#define        LINUX_MINIX_SUPER_MAGIC2        0x0000138F
+#define        LINUX_MSDOS_SUPER_MAGIC         0x00004d44
+#define        LINUX_NCP_SUPER_MAGIC           0x0000564c
+#define        LINUX_NFS_SUPER_MAGIC           0x00006969
+#define        LINUX_OPENPROM_SUPER_MAGIC      0x00009fa1
+#define        LINUX_PROC_SUPER_MAGIC          0x00009fa0
+#define        LINUX_QNX4_SUPER_MAGIC          0x0000002f
+#define        LINUX_REISERFS_SUPER_MAGIC      0x52654973
+#define        LINUX_SMB_SUPER_MAGIC           0x0000517B
+#define        LINUX_SYSV2_SUPER_MAGIC         (LINUX_SYSV_MAGIC_BASE + 3)
+#define        LINUX_SYSV4_SUPER_MAGIC         (LINUX_SYSV_MAGIC_BASE + 2)
+#define        LINUX_SYSV_MAGIC_BASE           0x012FF7B3
+#define        LINUX_USBDEVICE_SUPER_MAGIC     0x00009fa2
+#define        LINUX_XENIX_SUPER_MAGIC         (LINUX_SYSV_MAGIC_BASE + 1)
+
 #ifdef _KERNEL
 __BEGIN_DECLS
 void bsd_to_linux_wstat __P((int *));



Home | Main Index | Thread Index | Old Index