From vns@mindspring.com  Sat Dec 11 13:59:30 1999
Return-Path: <vns@mindspring.com>
Received: from smtp10.atl.mindspring.net (smtp10.atl.mindspring.net [207.69.200.246])
	by hub.freebsd.org (Postfix) with ESMTP id E576014D11
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 11 Dec 1999 13:59:29 -0800 (PST)
	(envelope-from vns@mindspring.com)
Received: from mindspring.com (user-2ive619.dialup.mindspring.com [165.247.24.41])
	by smtp10.atl.mindspring.net (8.9.3/8.8.5) with ESMTP id QAA03740;
	Sat, 11 Dec 1999 16:59:22 -0500 (EST)
Received: (from vsilyaev@localhost)
	by mindspring.com (8.9.3/8.9.3) id QAA00584;
	Sat, 11 Dec 1999 16:59:18 -0500 (EST)
	(envelope-from vns)
Message-Id: <199912112159.QAA00584@mindspring.com>
Date: Sat, 11 Dec 1999 16:59:18 -0500 (EST)
From: vsilyaev@mindspring.com
Sender: vns@mindspring.com
To: FreeBSD-gnats-submit@freebsd.org
Cc: marcel@scc.nl
Subject: statfs and fstatfs syscall in linux emulator
X-Send-Pr-Version: 3.2

>Number:         15425
>Category:       kern
>Synopsis:       statfs and fstatfs syscall in linux emulator
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    marcel
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 11 14:00:01 PST 1999
>Closed-Date:    Sat Jan 8 13:10:12 PST 2000
>Last-Modified:  Sat Jan  8 13:10:51 PST 2000
>Originator:     Vladimir N.Silyaev
>Release:        FreeBSD 4.0-CURRENT i386
>Organization:
>Environment:
	FreeBSD 4.0-CURRENT i386
	Linux emulator and any linux program, that examine filesystem type

>Description:

	Linux program confused by BSD filesystem types.

>How-To-Repeat:

Linux have different filestems type, than a FreeBSD.
Currently linux emulator assume, that FreeBSD filesystem type
equal Linux, this affect the statfs and fstatfs syscalls.

>Fix:
The following patch provide required translations.



-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--- sys/i386/linux/linux_stats.c.orig	Fri Dec  3 20:12:40 1999
+++ sys/i386/linux/linux_stats.c	Sat Dec 11 13:59:42 1999
@@ -204,6 +204,52 @@
 	long fspare[6];
 };
 
+#define	LINUX_EXT2_SUPER_MAGIC	0xEF53
+#define	LINUX_NFS_SUPER_MAGIC	0x6969
+#define	LINUX_MSDOS_SUPER_MAGIC	0x4d44 
+#define	LINUX_PROC_SUPER_MAGIC	0x9fa0
+#define	LINUX_ADFS_SUPER_MAGIC	0xadf5
+#define	LINUX_ISOFS_SUPER_MAGIC	0x9660
+#define	LINUX_CODA_SUPER_MAGIC	0x73757245
+#define	LINUX_NTFS_SUPER_MAGIC	0x5346544E
+#define	LINUX_HPFS_SUPER_MAGIC	0xf995e849
+
+static const long bsd_to_linux_ftype_[] = {
+			/* from sys/vnode.h */
+0,			/* VT_NON */ 
+LINUX_EXT2_SUPER_MAGIC,	/* VT_UFS */ /* this is a fake, but ext2fs use VT_UFS */
+LINUX_NFS_SUPER_MAGIC,	/* VT_NFS */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_MFS */ /* another one fake */
+LINUX_MSDOS_SUPER_MAGIC,/* VT_PC */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_LFS */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_LOFS */
+LINUX_PROC_SUPER_MAGIC,	/* VT_FDESC */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_PORTAL */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_NULL */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_UMAP */
+LINUX_PROC_SUPER_MAGIC,	/* VT_KERNFS */
+LINUX_PROC_SUPER_MAGIC,	/* VT_PROCFS */
+LINUX_ADFS_SUPER_MAGIC,	/* VT_AFS */
+LINUX_ISOFS_SUPER_MAGIC,/* VT_ISOFS */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_UNION */
+LINUX_MSDOS_SUPER_MAGIC,/* VVT_MSDOSFS */
+LINUX_PROC_SUPER_MAGIC,	/* VT_DEVFS */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_TFS */
+LINUX_EXT2_SUPER_MAGIC,	/* VT_VFS */
+LINUX_CODA_SUPER_MAGIC,	/* VT_CODA */
+LINUX_NTFS_SUPER_MAGIC,	/* VT_NTFS */
+LINUX_HPFS_SUPER_MAGIC	/* VT_HPFS */
+};
+
+static long
+bsd_to_linux_ftype(int bsd_f_type)
+{
+	if (bsd_f_type<sizeof(bsd_to_linux_ftype_)/sizeof(*bsd_to_linux_ftype_)) 
+		return bsd_to_linux_ftype_[bsd_f_type];
+	else
+		return bsd_f_type;
+}
+
 int
 linux_statfs(struct proc *p, struct linux_statfs_args *args)
 {
@@ -233,7 +279,7 @@
 	if (error)
 		return error;
 	bsd_statfs->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
-	linux_statfs_buf.ftype = bsd_statfs->f_type;
+	linux_statfs_buf.ftype = bsd_to_linux_ftype(bsd_statfs->f_type);
 	linux_statfs_buf.fbsize = bsd_statfs->f_bsize;
 	linux_statfs_buf.fblocks = bsd_statfs->f_blocks;
 	linux_statfs_buf.fbfree = bsd_statfs->f_bfree;
@@ -268,7 +314,7 @@
 	if (error)
 		return error;
 	bsd_statfs->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
-	linux_statfs_buf.ftype = bsd_statfs->f_type;
+	linux_statfs_buf.ftype = bsd_to_linux_ftype(bsd_statfs->f_type);
 	linux_statfs_buf.fbsize = bsd_statfs->f_bsize;
 	linux_statfs_buf.fblocks = bsd_statfs->f_blocks;
 	linux_statfs_buf.fbfree = bsd_statfs->f_bfree;
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

After aplying this patch, some programs including vmware, don't
be complained about unknown filesystem type.

>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->marcel 
Responsible-Changed-By: marcel 
Responsible-Changed-When: Tue Dec 14 09:07:08 PST 1999 
Responsible-Changed-Why:  
My take 
State-Changed-From-To: open->closed 
State-Changed-By: marcel 
State-Changed-When: Sat Jan 8 13:10:12 PST 2000 
State-Changed-Why:  
Problem fixed. Thanks! 
>Unformatted:
