Convert the filesystem type returned in struct statfs by syscalls

linux_statfs and linux_fstatfs. Linux binaries testing this expect
the filesystem's magic number and not our vnode's tag.

PR: 15425
Tested by: Vladimir N. Silyaev <vsilyaev@mindspring.com>
This commit is contained in:
marcel 2000-01-08 21:09:41 +00:00
parent 5f326dff82
commit 9e628d4894
2 changed files with 102 additions and 4 deletions

View File

@ -206,6 +206,55 @@ struct linux_statfs_buf {
long fspare[6];
};
#ifndef VT_NWFS
#define VT_NWFS VT_TFS /* XXX - bug compatibility with sys/nwfs/nwfs_node.h */
#endif
#define LINUX_CODA_SUPER_MAGIC 0x73757245L
#define LINUX_EXT2_SUPER_MAGIC 0xEF53L
#define LINUX_HPFS_SUPER_MAGIC 0xf995e849L
#define LINUX_ISOFS_SUPER_MAGIC 0x9660L
#define LINUX_MSDOS_SUPER_MAGIC 0x4d44L
#define LINUX_NCP_SUPER_MAGIC 0x564cL
#define LINUX_NFS_SUPER_MAGIC 0x6969L
#define LINUX_NTFS_SUPER_MAGIC 0x5346544EL
#define LINUX_PROC_SUPER_MAGIC 0x9fa0L
#define LINUX_UFS_SUPER_MAGIC 0x00011954L /* XXX - UFS_MAGIC in Linux */
/*
* ext2fs uses the VT_UFS tag. A mounted ext2 filesystem will therefore
* be seen as an ufs/mfs filesystem.
*/
static long
bsd_to_linux_ftype(int tag)
{
switch (tag) {
case VT_CODA:
return (LINUX_CODA_SUPER_MAGIC);
case VT_HPFS:
return (LINUX_HPFS_SUPER_MAGIC);
case VT_ISOFS:
return (LINUX_ISOFS_SUPER_MAGIC);
case VT_MFS:
return (LINUX_UFS_SUPER_MAGIC);
case VT_MSDOSFS:
return (LINUX_MSDOS_SUPER_MAGIC);
case VT_NFS:
return (LINUX_NFS_SUPER_MAGIC);
case VT_NTFS:
return (LINUX_NTFS_SUPER_MAGIC);
case VT_NWFS:
return (LINUX_NCP_SUPER_MAGIC);
case VT_PROCFS:
return (LINUX_PROC_SUPER_MAGIC);
case VT_UFS:
return (LINUX_UFS_SUPER_MAGIC);
}
return (0L);
}
int
linux_statfs(struct proc *p, struct linux_statfs_args *args)
{
@ -236,7 +285,7 @@ linux_statfs(struct proc *p, struct linux_statfs_args *args)
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;
@ -271,7 +320,7 @@ linux_fstatfs(struct proc *p, struct linux_fstatfs_args *args)
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;

View File

@ -206,6 +206,55 @@ struct linux_statfs_buf {
long fspare[6];
};
#ifndef VT_NWFS
#define VT_NWFS VT_TFS /* XXX - bug compatibility with sys/nwfs/nwfs_node.h */
#endif
#define LINUX_CODA_SUPER_MAGIC 0x73757245L
#define LINUX_EXT2_SUPER_MAGIC 0xEF53L
#define LINUX_HPFS_SUPER_MAGIC 0xf995e849L
#define LINUX_ISOFS_SUPER_MAGIC 0x9660L
#define LINUX_MSDOS_SUPER_MAGIC 0x4d44L
#define LINUX_NCP_SUPER_MAGIC 0x564cL
#define LINUX_NFS_SUPER_MAGIC 0x6969L
#define LINUX_NTFS_SUPER_MAGIC 0x5346544EL
#define LINUX_PROC_SUPER_MAGIC 0x9fa0L
#define LINUX_UFS_SUPER_MAGIC 0x00011954L /* XXX - UFS_MAGIC in Linux */
/*
* ext2fs uses the VT_UFS tag. A mounted ext2 filesystem will therefore
* be seen as an ufs/mfs filesystem.
*/
static long
bsd_to_linux_ftype(int tag)
{
switch (tag) {
case VT_CODA:
return (LINUX_CODA_SUPER_MAGIC);
case VT_HPFS:
return (LINUX_HPFS_SUPER_MAGIC);
case VT_ISOFS:
return (LINUX_ISOFS_SUPER_MAGIC);
case VT_MFS:
return (LINUX_UFS_SUPER_MAGIC);
case VT_MSDOSFS:
return (LINUX_MSDOS_SUPER_MAGIC);
case VT_NFS:
return (LINUX_NFS_SUPER_MAGIC);
case VT_NTFS:
return (LINUX_NTFS_SUPER_MAGIC);
case VT_NWFS:
return (LINUX_NCP_SUPER_MAGIC);
case VT_PROCFS:
return (LINUX_PROC_SUPER_MAGIC);
case VT_UFS:
return (LINUX_UFS_SUPER_MAGIC);
}
return (0L);
}
int
linux_statfs(struct proc *p, struct linux_statfs_args *args)
{
@ -236,7 +285,7 @@ linux_statfs(struct proc *p, struct linux_statfs_args *args)
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;
@ -271,7 +320,7 @@ linux_fstatfs(struct proc *p, struct linux_fstatfs_args *args)
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;