Date: Sat, 7 Oct 2000 04:33:43 +0200 (CEST) From: mbendiks@eunet.no To: FreeBSD-gnats-submit@freebsd.org Subject: kern/21809: [patches] Remove huge amounts of legacy from msdosfs Message-ID: <200010070233.EAA23978@suiram.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 21809 >Category: kern >Synopsis: [patches] Removes legacy code from msdosfs >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Fri Oct 06 21:40:01 PDT 2000 >Closed-Date: >Last-Modified: >Originator: Marius Bendiksen >Release: FreeBSD 4.1-RELEASE i386 >Organization: n/a >Environment: not relevant. >Description: The msdosfs sources have vast amounts of legacy code, including several sections that are only built if 0 and atari and not FreeBSD. I think it is safe to say that we do not need these. As to the msdosfs_root() code which didn't work, I'd volunteer to write a replacement if someone gets us boot blocks and such for msdosfs. The patch also resolves some legacy credential checking. >How-To-Repeat: not relevant. >Fix: In /sys/msdosfs; diff -u4 output: --- ./bootsect.h.orig Sat Aug 28 02:48:06 1999 +++ ./bootsect.h Sat Oct 7 04:25:01 2000 @@ -70,24 +70,8 @@ #define BOOTSIG1 0xaa #define BOOTSIG2 0 #define BOOTSIG3 0 }; -#ifdef atari -/* - * The boot sector on a gemdos fs is a little bit different from the msdos fs - * format. Currently there is no need to declare a seperate structure, the - * bootsector33 struct will do. - */ -#if 0 -struct bootsec_atari { - u_int8_t bsBranch[2]; /* branch inst if auto-boot */ - int8_t bsFiller[6]; /* anything or nothing */ - int8_t bsSerial[3]; /* serial no. for mediachange */ - int8_t bsBPB[19]; /* BIOS parameter block */ - int8_t bsBootCode[482]; /* pad so struct is 512b */ -}; -#endif -#endif /* atari */ union bootsector { struct bootsector33 bs33; struct bootsector50 bs50; --- ./bpb.h.orig Fri Aug 25 11:03:58 2000 +++ ./bpb.h Sat Oct 7 04:25:01 2000 @@ -80,30 +80,8 @@ u_int16_t bpbBackup; /* backup boot sector */ /* There is a 12 byte filler here, but we ignore it */ }; -#ifdef atari -/* - * BPB for gemdos filesystems. Atari leaves the obsolete stuff undefined. - * Currently there is no need for a separate BPB structure. - */ -#if 0 -struct bpb_a { - u_int16_t bpbBytesPerSec; /* bytes per sector */ - u_int8_t bpbSecPerClust; /* sectors per cluster */ - u_int16_t bpbResSectors; /* number of reserved sectors */ - u_int8_t bpbFATs; /* number of FATs */ - u_int16_t bpbRootDirEnts; /* number of root directory entries */ - u_int16_t bpbSectors; /* total number of sectors */ - u_int8_t bpbUseless1; /* meaningless on gemdos fs */ - u_int16_t bpbFATsecs; /* number of sectors per FAT */ - u_int16_t bpbUseless2; /* meaningless for harddisk fs */ - u_int16_t bpbUseless3; /* meaningless for harddisk fs */ - u_int16_t bpbHiddenSecs; /* the TOS-BIOS ignores this */ -}; -#endif -#endif /* atari */ - /* * The following structures represent how the bpb's look on disk. shorts * and longs are just character arrays of the appropriate length. This is * because the compiler forces shorts and longs to align on word or --- ./fat.h.orig Wed Dec 29 05:54:53 1999 +++ ./fat.h Sat Oct 7 04:25:01 2000 @@ -70,13 +70,8 @@ * Reference says if the maximum cluster number in a filesystem is greater * than 4078 ((CLUST_RSRVS - CLUST_FIRST) & FAT12_MASK) then we've got a * 16 bit fat filesystem. While mounting, the result of this test is stored * in pm_fatentrysize. - * GEMDOS-flavour (atari): - * If the filesystem is on floppy we've got a 12 bit fat filesystem, otherwise - * 16 bit. We check the d_type field in the disklabel struct while mounting - * and store the result in the pm_fatentrysize. Note that this kind of - * detection gets flakey when mounting a vnd-device. */ #define FAT12(pmp) (pmp->pm_fatmask == FAT12_MASK) #define FAT16(pmp) (pmp->pm_fatmask == FAT16_MASK) #define FAT32(pmp) (pmp->pm_fatmask == FAT32_MASK) --- ./msdosfs_vfsops.c.orig Thu Jun 29 03:12:47 2000 +++ ./msdosfs_vfsops.c Sat Oct 7 04:25:01 2000 @@ -123,16 +123,8 @@ bcopy(argp->ul, pmp->pm_ul, sizeof(pmp->pm_ul)); bcopy(argp->lu, pmp->pm_lu, sizeof(pmp->pm_lu)); } -#ifndef __FreeBSD__ - /* - * GEMDOS knows nothing (yet) about win95 - */ - if (pmp->pm_flags & MSDOSFSMNT_GEMDOSFS) - pmp->pm_flags |= MSDOSFSMNT_NOWIN95; -#endif - if (pmp->pm_flags & MSDOSFSMNT_NOWIN95) pmp->pm_flags |= MSDOSFSMNT_SHORTNAME; else if (!(pmp->pm_flags & (MSDOSFSMNT_SHORTNAME | MSDOSFSMNT_LONGNAME))) { @@ -154,69 +146,8 @@ } return 0; } -#ifndef __FreeBSD__ -int -msdosfs_mountroot() -{ - register struct mount *mp; - struct proc *p = curproc; /* XXX */ - size_t size; - int error; - struct msdosfs_args args; - - if (root_device->dv_class != DV_DISK) - return (ENODEV); - - /* - * Get vnodes for swapdev and rootdev. - */ - if (bdevvp(rootdev, &rootvp)) - panic("msdosfs_mountroot: can't setup rootvp"); - - mp = malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK); - bzero((char *)mp, (u_long)sizeof(struct mount)); - mp->mnt_op = &msdosfs_vfsops; - mp->mnt_flag = 0; - LIST_INIT(&mp->mnt_vnodelist); - - args.flags = 0; - args.uid = 0; - args.gid = 0; - args.mask = 0777; - - if ((error = mountmsdosfs(rootvp, mp, p, &args)) != 0) { - free(mp, M_MOUNT); - return (error); - } - - if ((error = update_mp(mp, &args)) != 0) { - (void)msdosfs_unmount(mp, 0, p); - free(mp, M_MOUNT); - return (error); - } - - if ((error = vfs_lock(mp)) != 0) { - (void)msdosfs_unmount(mp, 0, p); - free(mp, M_MOUNT); - return (error); - } - - TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list); - mp->mnt_vnodecovered = NULLVP; - (void) copystr("/", mp->mnt_stat.f_mntonname, MNAMELEN - 1, - &size); - bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size); - (void) copystr(ROOTNAME, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, - &size); - bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size); - (void)msdosfs_statfs(mp, &mp->mnt_stat, p); - vfs_unlock(mp); - return (0); -} -#endif - /* * mp - path - addr in user space of mount point (ie /usr or whatever) * data - addr in user space of mount params including the name of the block * special file to treat as a filesystem. @@ -236,8 +167,12 @@ size_t size; int error, flags; mode_t accessmode; + /* Check to see if we are mounting root */ + if (mp->mnt_flag & MNT_ROOTFS) + panic("msdosfs_mount: root support yanked"); + error = copyin(data, (caddr_t)&args, sizeof(struct msdosfs_args)); if (error) return (error); if (args.magic != MSDOSFS_ARGSMAGIC) @@ -261,12 +196,12 @@ if (error) return (error); if ((pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_kern_flag & MNTK_WANTRDWR)) { /* - * If upgrade to read-write by non-root, then verify + * If upgrade to read-write by regular user, then verify * that user has necessary permissions on the device. */ - if (p->p_ucred->cr_uid != 0) { + if (suser(p)) { devvp = pmp->pm_devvp; vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); error = VOP_ACCESS(devvp, VREAD | VWRITE, p->p_ucred, p); @@ -278,9 +213,9 @@ } pmp->pm_flags &= ~MSDOSFSMNT_RONLY; } if (args.fspec == 0) { -#ifdef __notyet__ /* doesn't work correctly with current mountd XXX */ +#ifdef __notyet__ /* doesn't work correctly with current mountd XXX */ if (args.flags & MSDOSFSMNT_MNTOPT) { pmp->pm_flags &= ~MSDOSFSMNT_MNTOPT; pmp->pm_flags |= args.flags & MSDOSFSMNT_MNTOPT; if (pmp->pm_flags & MSDOSFSMNT_NOWIN95) @@ -311,9 +246,9 @@ /* * If mount by non-root, then verify that user has necessary * permissions on the device. */ - if (p->p_ucred->cr_uid != 0) { + if (suser(p)) { accessmode = VREAD; if ((mp->mnt_flag & MNT_RDONLY) == 0) accessmode |= VWRITE; vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); @@ -367,12 +302,8 @@ { struct msdosfsmount *pmp; struct buf *bp; dev_t dev = devvp->v_rdev; -#ifndef __FreeBSD__ - struct partinfo dpart; - int bsize = 0, dtype = 0, tmp; -#endif union bootsector *bsp; struct byte_bpb33 *b33; struct byte_bpb50 *b50; struct byte_bpb710 *b710; @@ -406,34 +337,8 @@ bp = NULL; /* both used in error_exit */ pmp = NULL; -#ifndef __FreeBSD__ - if (argp->flags & MSDOSFSMNT_GEMDOSFS) { - /* - * We need the disklabel to calculate the size of a FAT entry - * later on. Also make sure the partition contains a filesystem - * of type FS_MSDOS. This doesn't work for floppies, so we have - * to check for them too. - * - * At least some parts of the msdos fs driver seem to assume - * that the size of a disk block will always be 512 bytes. - * Let's check it... - */ - error = VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, - FREAD, NOCRED, p); - if (error) - goto error_exit; - tmp = dpart.part->p_fstype; - dtype = dpart.disklab->d_type; - bsize = dpart.disklab->d_secsize; - if (bsize != 512 || (dtype!=DTYPE_FLOPPY && tmp!=FS_MSDOS)) { - error = EINVAL; - goto error_exit; - } - } -#endif - /* * Read the boot sector of the filesystem, and then check the * boot signature. If not a dos boot sector then error out. * @@ -447,19 +352,13 @@ b33 = (struct byte_bpb33 *)bsp->bs33.bsBPB; b50 = (struct byte_bpb50 *)bsp->bs50.bsBPB; b710 = (struct byte_bpb710 *)bsp->bs710.bsPBP; -#ifndef __FreeBSD__ - if (!(argp->flags & MSDOSFSMNT_GEMDOSFS)) { -#endif #ifndef MSDOSFS_NOCHECKSIG - if (bsp->bs50.bsBootSectSig0 != BOOTSIG0 - || bsp->bs50.bsBootSectSig1 != BOOTSIG1) { - error = EINVAL; - goto error_exit; - } -#endif -#ifndef __FreeBSD__ + if (bsp->bs50.bsBootSectSig0 != BOOTSIG0 + || bsp->bs50.bsBootSectSig1 != BOOTSIG1) { + error = EINVAL; + goto error_exit; } #endif pmp = malloc(sizeof *pmp, M_MSDOSFSMNT, M_WAITOK); @@ -484,25 +383,19 @@ /* calculate the ratio of sector size to DEV_BSIZE */ pmp->pm_BlkPerSec = pmp->pm_BytesPerSec / DEV_BSIZE; -#ifndef __FreeBSD__ - if (!(argp->flags & MSDOSFSMNT_GEMDOSFS)) { -#endif - /* XXX - We should probably check more values here */ - if (!pmp->pm_BytesPerSec || !SecPerClust - || !pmp->pm_Heads || pmp->pm_Heads > 255 + /* XXX - We should probably check more values here */ + if (!pmp->pm_BytesPerSec || !SecPerClust + || !pmp->pm_Heads || pmp->pm_Heads > 255 #ifdef PC98 - || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 255) { + || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 255) { #else - || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 63) { + || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 63) { #endif - error = EINVAL; - goto error_exit; - } -#ifndef __FreeBSD__ + error = EINVAL; + goto error_exit; } -#endif if (pmp->pm_Sectors == 0) { pmp->pm_HiddenSects = getulong(b50->bpbHiddenSecs); pmp->pm_HugeSectors = getulong(b50->bpbHugeSectors); @@ -583,24 +476,8 @@ pmp->pm_maxcluster = (pmp->pm_HugeSectors - pmp->pm_firstcluster) / SecPerClust + 1; pmp->pm_fatsize = pmp->pm_FATsecs * DEV_BSIZE; /* XXX not used? */ -#ifndef __FreeBSD__ - if (argp->flags & MSDOSFSMNT_GEMDOSFS) { - if ((pmp->pm_maxcluster <= (0xff0 - 2)) - && ((dtype == DTYPE_FLOPPY) || ((dtype == DTYPE_VNODE) - && ((pmp->pm_Heads == 1) || (pmp->pm_Heads == 2)))) - ) { - pmp->pm_fatmask = FAT12_MASK; - pmp->pm_fatmult = 3; - pmp->pm_fatdiv = 2; - } else { - pmp->pm_fatmask = FAT16_MASK; - pmp->pm_fatmult = 2; - pmp->pm_fatdiv = 1; - } - } else -#endif if (pmp->pm_fatmask == 0) { if (pmp->pm_maxcluster <= ((CLUST_RSRVD - CLUST_FIRST) & FAT12_MASK)) { /* --- ./msdosfs_vnops.c.orig Sat Oct 7 04:18:38 2000 +++ ./msdosfs_vnops.c Sat Oct 7 04:26:26 2000 @@ -415,9 +415,9 @@ * * An exception with regards to the SF_SETTABLE bits, is * SF_IMMUTABLE, which we map to ATTR_SYSTEM. */ - if (cred->cr_uid != 0) { + if (suser(ap->a_p)) { if (vap->va_flags & (SF_SETTABLE^SF_IMMUTABLE)) return EPERM; if (vap->va_flags & SF_IMMUTABLE) dep->de_Attributes |= ATTR_SYSTEM; --- ./msdosfsmount.h.orig Fri Aug 25 11:03:58 2000 +++ ./msdosfsmount.h Sat Oct 7 04:25:01 2000 @@ -226,18 +226,15 @@ */ #define MSDOSFSMNT_SHORTNAME 1 /* Force old DOS short names only */ #define MSDOSFSMNT_LONGNAME 2 /* Force Win'95 long names */ #define MSDOSFSMNT_NOWIN95 4 /* Completely ignore Win95 entries */ -#ifndef __FreeBSD__ -#define MSDOSFSMNT_GEMDOSFS 8 /* This is a gemdos-flavour */ -#endif #define MSDOSFSMNT_U2WTABLE 0x10 /* Local->Unicode and local<->DOS */ /* tables loaded */ #define MSDOSFSMNT_ULTABLE 0x20 /* Local upper<->lower table loaded */ /* All flags above: */ #define MSDOSFSMNT_MNTOPT \ (MSDOSFSMNT_SHORTNAME|MSDOSFSMNT_LONGNAME|MSDOSFSMNT_NOWIN95 \ - /*|MSDOSFSMNT_GEMDOSFS*/|MSDOSFSMNT_U2WTABLE|MSDOSFSMNT_ULTABLE) + |MSDOSFSMNT_U2WTABLE|MSDOSFSMNT_ULTABLE) #define MSDOSFSMNT_RONLY 0x80000000 /* mounted read-only */ #define MSDOSFSMNT_WAITONFAT 0x40000000 /* mounted synchronous */ #define MSDOSFS_FATMIRROR 0x20000000 /* FAT is mirrored */ >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010070233.EAA23978>