diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 1994-09-27 20:42:59 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 1994-09-27 20:42:59 +0000 |
commit | c3c6d51ea0655869e5fdcdeb4ffead5a9a5d8a57 (patch) | |
tree | c5e32cd4563c951511be132c78835d4a367e8cc8 /sys | |
parent | c172c3e66aa73f34b5d2383667726ab91761b167 (diff) |
Added declarations, fixed bugs due to missing decls. At least one of them
could panic a system. (I know, it paniced mine!).
Notes
Notes:
svn path=/head/; revision=3152
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/msdosfs/fat.h | 16 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_conv.c | 8 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_denode.c | 50 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_fat.c | 25 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_lookup.c | 26 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vfsops.c | 28 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_vnops.c | 122 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfsmount.h | 4 | ||||
-rw-r--r-- | sys/msdosfs/fat.h | 16 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_conv.c | 8 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_denode.c | 50 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_fat.c | 25 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_lookup.c | 26 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_vfsops.c | 28 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_vnops.c | 122 | ||||
-rw-r--r-- | sys/msdosfs/msdosfsmount.h | 4 |
16 files changed, 336 insertions, 222 deletions
diff --git a/sys/fs/msdosfs/fat.h b/sys/fs/msdosfs/fat.h index 3867c87d5a9d..b5f223f46db3 100644 --- a/sys/fs/msdosfs/fat.h +++ b/sys/fs/msdosfs/fat.h @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: fat.h,v 1.1 1994/09/19 15:41:40 dfr Exp $ */ /* $NetBSD: fat.h,v 1.4 1994/08/21 18:43:57 ws Exp $ */ /*- @@ -94,4 +94,18 @@ int clusteralloc __P((struct msdosfsmount *pmp, u_long start, u_long count, u_lo int fatentry __P((int function, struct msdosfsmount *pmp, u_long cluster, u_long *oldcontents, u_long newcontents)); int freeclusterchain __P((struct msdosfsmount *pmp, u_long startchain)); int extendfile __P((struct denode *dep, u_long count, struct buf **bpp, u_long *ncp, int flags)); +void fc_purge __P((struct denode *dep, u_int frcn)); +void fc_lookup __P((struct denode *dep, u_long findcn, u_long *frcnp, u_long *fsrcnp)); + +int readep __P((struct msdosfsmount *pmp, u_long dirclu, u_long dirofs, struct buf **bpp, struct direntry **epp)); +int readde __P((struct denode *dep, struct buf **bpp, struct direntry **epp)); +int deextend __P((struct denode *dep, off_t length, struct ucred *cred)); +int fillinusemap __P((struct msdosfsmount *pmp)); +int reinsert __P((struct denode *dep)); +int dosdirempty __P((struct denode *dep)); +int createde __P((struct denode *dep, struct denode *ddep, struct denode **depp)); +int deupdat __P((struct denode *dep, struct timespec *tp, int waitfor)); +int removede __P((struct denode *pdep, struct denode *dep)); +int detrunc __P((struct denode *dep, u_long length, int flags, struct ucred *cred, struct proc *p)); +int doscheckpath __P(( struct denode *source, struct denode *target)); #endif /* KERNEL */ diff --git a/sys/fs/msdosfs/msdosfs_conv.c b/sys/fs/msdosfs/msdosfs_conv.c index da8ce976a600..035eb0552aa4 100644 --- a/sys/fs/msdosfs/msdosfs_conv.c +++ b/sys/fs/msdosfs/msdosfs_conv.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_conv.c,v 1.1 1994/09/19 15:41:40 dfr Exp $ */ /* $NetBSD: msdosfs_conv.c,v 1.6.2.1 1994/08/30 02:27:57 cgd Exp $ */ /* @@ -23,6 +23,7 @@ #include <sys/param.h> #include <sys/time.h> #include <sys/kernel.h> /* defines tz */ +#include <sys/systm.h> /* defines tz */ /* * MSDOSFS include files. @@ -166,8 +167,9 @@ dos2unixtime(dd, dt, tsp) */ month = (dd & DD_MONTH_MASK) >> DD_MONTH_SHIFT; if (month == 0) { - printf("dos2unixtime(): month value out of range (%d)\n", - month); + printf( + "dos2unixtime(): month value out of range (%ld)\n", + month); month = 1; } for (m = 0; m < month - 1; m++) { diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index 681286349102..c671dc913c96 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_denode.c,v 1.1 1994/09/19 15:41:41 dfr Exp $ */ /* $NetBSD: msdosfs_denode.c,v 1.9 1994/08/21 18:44:00 ws Exp $ */ /*- @@ -55,8 +55,11 @@ #include <sys/proc.h> #include <sys/buf.h> #include <sys/vnode.h> +#include <sys/types.h> #include <sys/kernel.h> /* defines "time" */ +#include <vm/vm.h> + #include <msdosfs/bpb.h> #include <msdosfs/msdosfsmount.h> #include <msdosfs/direntry.h> @@ -110,7 +113,8 @@ msdosfs_hashins(dep) struct denode **depp, *deq; depp = &dehashtbl[DEHASH(dep->de_dev, dep->de_dirclust + dep->de_diroffset)]; - if (deq = *depp) + deq = *depp; + if (deq) deq->de_prev = &dep->de_next; dep->de_next = deq; dep->de_prev = depp; @@ -129,7 +133,8 @@ msdosfs_hashrem(dep) struct denode *dep; { struct denode *deq; - if (deq = dep->de_next) + deq = dep->de_next; + if (deq) deq->de_prev = dep->de_prev; *dep->de_prev = deq; #ifdef DIAGNOSTIC @@ -197,7 +202,8 @@ deget(pmp, dirclust, diroffset, direntptr, depp) * entry that represented the file happens to be reused while the * deleted file is still open. */ - if (ldep = msdosfs_hashget(dev, dirclust, diroffset)) { + ldep = msdosfs_hashget(dev, dirclust, diroffset); + if (ldep) { *depp = ldep; return 0; } @@ -208,7 +214,8 @@ deget(pmp, dirclust, diroffset, direntptr, depp) * copy it from the passed disk buffer. */ /* getnewvnode() does a VREF() on the vnode */ - if (error = getnewvnode(VT_MSDOSFS, mntp, msdosfs_vnodeop_p, &nvp)) { + error = getnewvnode(VT_MSDOSFS, mntp, msdosfs_vnodeop_p, &nvp); + if (error) { *depp = 0; return error; } @@ -309,11 +316,8 @@ deupdat(dep, tp, waitfor) int waitfor; { int error; - daddr_t bn; - int diro; struct buf *bp; struct direntry *dirp; - struct msdosfsmount *pmp = dep->de_pmp; struct timespec ts; struct vnode *vp = DETOV(dep); @@ -338,7 +342,8 @@ deupdat(dep, tp, waitfor) * Read in the cluster containing the directory entry we want to * update. */ - if (error = readde(dep, &bp, &dirp)) + error = readde(dep, &bp, &dirp); + if (error) return error; /* @@ -388,6 +393,7 @@ detrunc(dep, length, flags, cred, p) int isadir = dep->de_Attributes & ATTR_DIRECTORY; struct buf *bp; struct msdosfsmount *pmp = dep->de_pmp; + struct timespec ts; #ifdef MSDOSFS_DEBUG printf("detrunc(): file %s, length %d, flags %d\n", dep->de_Name, length, flags); @@ -402,7 +408,8 @@ detrunc(dep, length, flags, cred, p) * directory's life. */ if (DETOV(dep)->v_flag & VROOT) { - printf("detrunc(): can't truncate root directory, clust %d, offset %d\n", + printf( + "detrunc(): can't truncate root directory, clust %ld, offset %ld\n", dep->de_dirclust, dep->de_diroffset); return EINVAL; } @@ -426,7 +433,8 @@ detrunc(dep, length, flags, cred, p) dep->de_StartCluster = 0; eofentry = ~0; } else { - if (error = pcbmap(dep, de_clcount(pmp, length) - 1, 0, &eofentry)) { + error = pcbmap(dep, de_clcount(pmp, length) - 1, 0, &eofentry); + if (error) { #ifdef MSDOSFS_DEBUG printf("detrunc(): pcbmap fails %d\n", error); #endif @@ -480,7 +488,8 @@ detrunc(dep, length, flags, cred, p) dep->de_flag |= DE_UPDATE; vflags = (length > 0 ? V_SAVE : 0) | V_SAVEMETA; vinvalbuf(DETOV(dep), vflags, cred, p, 0, 0); - allerror = deupdat(dep, &time, 1); + TIMEVAL_TO_TIMESPEC(&time, &ts); + allerror = deupdat(dep, &ts, 1); #ifdef MSDOSFS_DEBUG printf("detrunc(): allerror %d, eofentry %d\n", allerror, eofentry); @@ -525,6 +534,7 @@ deextend(dep, length, cred) struct msdosfsmount *pmp = dep->de_pmp; u_long count; int error; + struct timespec ts; /* * The root of a DOS filesystem cannot be extended. @@ -537,7 +547,8 @@ deextend(dep, length, cred) * Is this really important? */ if (dep->de_Attributes & ATTR_DIRECTORY) { - if (error = suser(cred, NULL)) + error = suser(cred, NULL); + if (error) return error; } @@ -551,7 +562,8 @@ deextend(dep, length, cred) if (count > 0) { if (count > pmp->pm_freeclustercount) return ENOSPC; - if (error = extendfile(dep, count, NULL, NULL, DE_CLEAR)) { + error = extendfile(dep, count, NULL, NULL, DE_CLEAR); + if (error) { /* truncate the added clusters away again */ (void) detrunc(dep, dep->de_FileSize, 0, cred, NULL); return error; @@ -560,7 +572,8 @@ deextend(dep, length, cred) dep->de_flag |= DE_UPDATE; dep->de_FileSize = length; - return deupdat(dep, &time, 1); + TIMEVAL_TO_TIMESPEC(&time, &ts); + return deupdat(dep, &ts, 1); } /* @@ -570,8 +583,6 @@ deextend(dep, length, cred) int reinsert(dep) struct denode *dep; { - union dehead *deh; - /* * Fix up the denode cache. If the denode is for a directory, * there is nothing to do since the hash is based on the starting @@ -595,7 +606,6 @@ msdosfs_reclaim(ap) { struct vnode *vp = ap->a_vp; struct denode *dep = VTODE(vp); - int i; extern int prtactive; #ifdef MSDOSFS_DEBUG @@ -638,6 +648,7 @@ msdosfs_inactive(ap) struct denode *dep = VTODE(vp); int error = 0; extern int prtactive; + struct timespec ts; #ifdef MSDOSFS_DEBUG printf("msdosfs_inactive(): dep %08x, de_Name[0] %x\n", dep, dep->de_Name[0]); @@ -671,7 +682,8 @@ msdosfs_inactive(ap) dep->de_flag |= DE_UPDATE; dep->de_Name[0] = SLOT_DELETED; } - DE_UPDAT(dep, &time, 0); + TIMEVAL_TO_TIMESPEC(&time, &ts); + DE_UPDAT(dep, &ts, 0); VOP_UNLOCK(vp); dep->de_flag = 0; diff --git a/sys/fs/msdosfs/msdosfs_fat.c b/sys/fs/msdosfs/msdosfs_fat.c index 9a2f11785b12..9ab23a24d0ab 100644 --- a/sys/fs/msdosfs/msdosfs_fat.c +++ b/sys/fs/msdosfs/msdosfs_fat.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_fat.c,v 1.1 1994/09/19 15:41:43 dfr Exp $ */ /* $NetBSD: msdosfs_fat.c,v 1.12 1994/08/21 18:44:04 ws Exp $ */ /*- @@ -85,10 +85,6 @@ int fc_largedistance; /* off by more than LMMAX */ /* Byte offset in FAT on filesystem pmp, cluster cn */ #define FATOFS(pmp, cn) (FAT12(pmp) ? (cn) * 3 / 2 : (cn) * 2) -void fc_lookup(struct denode *dep, u_long findcn, - u_long *frcnp, u_long *fsrcnp); -void fc_purge(struct denode *dep, u_int frcn); - static void fatblock(pmp, ofs, bnp, sizep, bop) struct msdosfsmount *pmp; @@ -255,7 +251,8 @@ hiteof:; * Find the closest entry in the fat cache to the cluster we are looking * for. */ -void fc_lookup(dep, findcn, frcnp, fsrcnp) +void +fc_lookup(dep, findcn, frcnp, fsrcnp) struct denode *dep; u_long findcn; u_long *frcnp; @@ -471,7 +468,8 @@ fatentry(function, pmp, cn, oldcontents, newcontents) byteoffset = FATOFS(pmp, cn); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; if (function & FAT_GET) { @@ -540,7 +538,8 @@ fatchain(pmp, start, count, fillwith) while (count > 0) { byteoffset = FATOFS(pmp, start); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; while (count > 0) { start++; @@ -603,7 +602,8 @@ chainlength(pmp, start, count) while (++idx <= max_idx) { if (len >= count) break; - if (map = pmp->pm_inusemap[idx]) { + map = pmp->pm_inusemap[idx]; + if (map) { len += ffs(map) - 1; break; } @@ -670,7 +670,6 @@ clusteralloc(pmp, start, count, fillwith, retcluster, got) u_long *retcluster; u_long *got; { - int error; u_long idx; u_long len, newst, foundcn, foundl, cn, l; u_int map; @@ -768,7 +767,8 @@ freeclusterchain(pmp, cluster) if (lbn != bn) { if (bp) updatefats(pmp, bp, bn); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; lbn = bn; } @@ -916,7 +916,8 @@ extendfile(dep, count, bpp, ncp, flags) cn = 0; else cn = dep->de_fc[FC_LASTFC].fc_fsrcn + 1; - if (error = clusteralloc(pmp, cn, count, CLUST_EOFE, &cn, &got)) + error = clusteralloc(pmp, cn, count, CLUST_EOFE, &cn, &got); + if (error) return error; count -= got; diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index c67f888ac1a2..269184269737 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_lookup.c,v 1.1 1994/09/19 15:41:44 dfr Exp $ */ /* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */ /*- @@ -53,6 +53,7 @@ #include <sys/buf.h> #include <sys/vnode.h> #include <sys/mount.h> +#include <sys/systm.h> #include <msdosfs/bpb.h> #include <msdosfs/direntry.h> @@ -137,7 +138,8 @@ msdosfs_lookup(ap) * See if the component of the pathname we are looking for is in * the directory cache. If so then do a few things and return. */ - if (error = cache_lookup(vdp, vpp, cnp)) { + error = cache_lookup(vdp, vpp, cnp); + if (error) { int vpid; if (error == ENOENT) @@ -172,7 +174,8 @@ msdosfs_lookup(ap) if (lockparent && pdp != vdp && (flags & ISLASTCN)) VOP_UNLOCK(pdp); } - if (error = VOP_LOCK(pdp)) + error = VOP_LOCK(pdp); + if (error) return error; vdp = pdp; dp = VTODE(vdp); @@ -227,12 +230,14 @@ msdosfs_lookup(ap) */ rootreloff = 0; for (frcn = 0;; frcn++) { - if (error = pcbmap(dp, frcn, &bn, &cluster)) { + error = pcbmap(dp, frcn, &bn, &cluster); + if (error) { if (error == E2BIG) break; return error; } - if (error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster,NOCRED,&bp); + if (error) return error; for (diroff = 0; diroff < pmp->pm_depclust; diroff++) { dep = (struct direntry *) bp->b_data + diroff; @@ -459,7 +464,6 @@ createde(dep, ddep, depp) struct denode *ddep; struct denode **depp; { - int bn; int error; u_long dirclust, diroffset; struct direntry *ndep; @@ -479,7 +483,8 @@ createde(dep, ddep, depp) * case. */ if (ddep->de_fndclust == (u_long)-1) { - if (error = extendfile(ddep, 1, &bp, &dirclust, DE_CLEAR)) + error = extendfile(ddep, 1, &bp, &dirclust, DE_CLEAR); + if (error) return error; ndep = (struct direntry *) bp->b_data; /* @@ -515,7 +520,8 @@ createde(dep, ddep, depp) if (error) return error; } - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { vput(DETOV(*depp)); /* free the vnode we got on error */ return error; } @@ -659,7 +665,6 @@ doscheckpath(source, target) struct denode *target; { daddr_t scn; - struct denode dummy; struct msdosfsmount *pmp; struct direntry *ep; struct denode *dep; @@ -737,7 +742,8 @@ readep(pmp, dirclu, dirofs, bpp, epp) daddr_t bn; bn = detobn(pmp, dirclu, dirofs); - if (error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, bpp)) { + error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, bpp); + if (error) { *bpp = NULL; return error; } diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index f9243765c7e0..1c36f8a56c9b 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vfsops.c,v 1.2 1994/09/19 19:24:44 dfr Exp $ */ +/* $Id: msdosfs_vfsops.c,v 1.3 1994/09/21 03:47:16 wollman Exp $ */ /* $NetBSD: msdosfs_vfsops.c,v 1.19 1994/08/21 18:44:10 ws Exp $ */ /*- @@ -93,7 +93,8 @@ msdosfs_mount(mp, path, data, ndp, p) /* * Copy in the args for the mount request. */ - if (error = copyin(data, (caddr_t) & args, sizeof(struct msdosfs_args))) + error = copyin(data, (caddr_t) & args, sizeof(struct msdosfs_args)); + if (error) return error; /* @@ -259,17 +260,20 @@ mountmsdosfs(devvp, mp, p) * old buffers from this filesystem. Presumably this prevents us * from running into buffers that are the wrong blocksize. */ - if (error = vfs_mountedon(devvp)) + error = vfs_mountedon(devvp); + if (error) return error; if (vcount(devvp) > 1) return EBUSY; - if (error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0)) + error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); + if (error) return error; /* * Now open the block special file. */ - if (error = VOP_OPEN(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, p)) + error = VOP_OPEN(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, p); + if (error) return error; needclose = 1; #ifdef HDSUPPORT @@ -287,7 +291,8 @@ mountmsdosfs(devvp, mp, p) * also add some checking on the bsOemName field. So far I've seen * the following values: "IBM 3.3" "MSDOS3.3" "MSDOS5.0" */ - if (error = bread(devvp, 0, 512, NOCRED, &bp0)) + error = bread(devvp, 0, 512, NOCRED, &bp0); + if (error) goto error_exit; bp0->b_flags |= B_AGE; bsp = (union bootsector *) bp0->b_data; @@ -493,7 +498,6 @@ msdosfs_unmount(mp, mntflags, p) int flags = 0; int error; struct msdosfsmount *pmp = (struct msdosfsmount *) mp->mnt_data; - struct vnode *vp = pmp->pm_devvp; /* only the mounter, or superuser can unmount */ if ((p->p_cred->p_ruid != pmp->pm_mounter) && @@ -507,7 +511,8 @@ msdosfs_unmount(mp, mntflags, p) } #ifdef QUOTA #endif - if (error = vflush(mp, NULLVP, flags)) + error = vflush(mp, NULLVP, flags); + if (error) return error; pmp->pm_devvp->v_specflags &= ~SI_MOUNTEDON; #ifdef MSDOSFS_DEBUG @@ -561,6 +566,7 @@ msdosfs_quotactl(mp, cmds, uid, arg, p) struct proc *p; { #ifdef QUOTA + return EOPNOTSUPP; #else return EOPNOTSUPP; #endif @@ -646,7 +652,8 @@ loop: continue; if (vget(vp, 1)) /* not there anymore? */ goto loop; - if (error = VOP_FSYNC(vp, cred, waitfor, p)) + error = VOP_FSYNC(vp, cred, waitfor, p); + if (error) allerror = error; vput(vp); /* done with this one */ } @@ -654,7 +661,8 @@ loop: /* * Flush filesystem control info. */ - if (error = VOP_FSYNC(pmp->pm_devvp, cred, waitfor, p)) + error = VOP_FSYNC(pmp->pm_devvp, cred, waitfor, p); + if (error) allerror = error; return allerror; } diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index b2a5bf75be7c..5235e2d6a3ae 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vnops.c,v 1.1 1994/09/19 15:41:46 dfr Exp $ */ +/* $Id: msdosfs_vnops.c,v 1.2 1994/09/21 03:47:17 wollman Exp $ */ /* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */ /*- @@ -62,6 +62,9 @@ #include <miscfs/specfs/specdev.h> /* XXX */ /* defines v_rdev */ #include <sys/malloc.h> #include <sys/dir.h> /* defines dirent structure */ +#include <sys/signalvar.h> + +#include <vm/vm.h> #include <msdosfs/bpb.h> #include <msdosfs/direntry.h> @@ -152,7 +155,6 @@ msdosfs_mknod(ap) } */ *ap; { int error; - struct denode *pdep = VTODE(ap->a_dvp); switch (ap->a_vap->va_type) { case VDIR: @@ -382,12 +384,14 @@ msdosfs_setattr(ap) if (vap->va_size != VNOVAL) { if (ap->a_vp->v_type == VDIR) return EISDIR; - if (error = detrunc(dep, vap->va_size, 0, cred, ap->a_p)) + error = detrunc(dep, vap->va_size, 0, cred, ap->a_p); + if (error) return error; } if (vap->va_mtime.ts_sec != VNOVAL) { dep->de_flag |= DE_UPDATE; - if (error = deupdat(dep, &vap->va_mtime, 1)) + error = deupdat(dep, &vap->va_mtime, 1); + if (error) return error; } @@ -406,7 +410,8 @@ msdosfs_setattr(ap) } if (vap->va_flags != VNOVAL) { - if (error = suser(cred, &ap->a_p->p_acflag)) + error = suser(cred, &ap->a_p->p_acflag); + if (error) return error; if (cred->cr_uid == 0) dep->de_flag = vap->va_flags; @@ -433,7 +438,6 @@ msdosfs_read(ap) int isadir; long n; long on; - daddr_t bn; daddr_t lbn; daddr_t rablock; int rasize; @@ -539,7 +543,9 @@ msdosfs_write(ap) struct denode *dep = VTODE(vp); struct msdosfsmount *pmp = dep->de_pmp; struct ucred *cred = ap->a_cred; + struct timespec ts; + TIMEVAL_TO_TIMESPEC(&time, &ts); #ifdef MSDOSFS_DEBUG printf("msdosfs_write(vp %08x, uio %08x, ioflag %08x, cred %08x\n", vp, uio, ioflag, cred); @@ -627,7 +633,8 @@ msdosfs_write(ap) do { bn = de_blk(pmp, uio->uio_offset); if (isadir) { - if (error = pcbmap(dep, bn, &bn, 0)) + error = pcbmap(dep, bn, &bn, 0); + if (error) break; } else if (bn > lastcn) { error = ENOSPC; @@ -650,8 +657,9 @@ msdosfs_write(ap) */ if (!isadir) { if (bp->b_blkno == bp->b_lblkno) { - if (error = pcbmap(dep, bp->b_lblkno, - &bp->b_blkno, 0)) + error = pcbmap(dep, bp->b_lblkno, + &bp->b_blkno, 0); + if (error) bp->b_blkno = -1; } if (bp->b_blkno == -1) { @@ -665,7 +673,8 @@ msdosfs_write(ap) /* * The block we need to write into exists, so read it in. */ - if (error = bread(thisvp, bn, pmp->pm_bpcluster, cred, &bp)) + error = bread(thisvp, bn, pmp->pm_bpcluster, cred, &bp); + if (error) break; } @@ -719,7 +728,7 @@ errexit: error = 0; } } else { - error = deupdat(dep, &time, 1); + error = deupdat(dep, &ts, 1); } return error; } @@ -780,7 +789,9 @@ msdosfs_fsync(ap) { struct vnode *vp = ap->a_vp; int wait = ap->a_waitfor == MNT_WAIT; - int error; + struct timespec ts; + + TIMEVAL_TO_TIMESPEC(&time, &ts); #if 0 /* @@ -790,7 +801,7 @@ msdosfs_fsync(ap) */ vflushbuf(vp, wait ? B_SYNC : 0); #endif - return deupdat(VTODE(vp), &time, wait); + return deupdat(VTODE(vp), &ts, wait); } /* @@ -1004,14 +1015,13 @@ msdosfs_rename(ap) /* doscheckpath() vput()'s tddep */ error = doscheckpath(fdep, tddep); tddep = NULL; - if (error) { + if (error) goto bad; - } if ((ap->a_tcnp->cn_flags & SAVESTART) == 0) panic("msdosfs_rename(): lost to startdir"); - if (error = relookup(ap->a_tdvp, &tvp, ap->a_tcnp)) { + error = relookup(ap->a_tdvp, &tvp, ap->a_tcnp); + if (error) goto bad; - } tddep = VTODE(ap->a_tdvp); tdep = tvp ? VTODE(tvp) : NULL; } @@ -1039,9 +1049,9 @@ msdosfs_rename(ap) } to_dirclust = tdep->de_dirclust; to_diroffset = tdep->de_diroffset; - if (error = removede(tddep,tdep)) { + error = removede(tddep,tdep); + if (error) goto bad; - } vput(ap->a_tvp); tdep = NULL; @@ -1060,15 +1070,15 @@ msdosfs_rename(ap) if (newparent == 0) { /* tddep and fddep point to the same denode here */ VOP_LOCK(ap->a_fvp); /* ap->a_fdvp is already locked */ - if (error = readep(fddep->de_pmp, - fdep->de_dirclust, - fdep->de_diroffset, - &bp, &ep)) { + error = readep(fddep->de_pmp, fdep->de_dirclust, + fdep->de_diroffset, &bp, &ep); + if (error) { VOP_UNLOCK(ap->a_fvp); goto bad; } bcopy(toname, ep->deName, 11); - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { VOP_UNLOCK(ap->a_fvp); goto bad; } @@ -1107,16 +1117,16 @@ msdosfs_rename(ap) goto bad; } VOP_LOCK(ap->a_fdvp); - if (error = readep(fddep->de_pmp, - fddep->de_fndclust, - fddep->de_fndoffset, - &bp, &ep)) { + error = readep(fddep->de_pmp, fddep->de_fndclust, + fddep->de_fndoffset, &bp, &ep); + if (error) { VOP_UNLOCK(ap->a_fvp); VOP_UNLOCK(ap->a_fdvp); goto bad; } ep->deName[0] = SLOT_DELETED; - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { VOP_UNLOCK(ap->a_fvp); VOP_UNLOCK(ap->a_fdvp); goto bad; @@ -1171,19 +1181,21 @@ struct { struct direntry dot; struct direntry dotdot; } dosdirtemplate = { - - ". ", " ", /* the . entry */ - ATTR_DIRECTORY, /* file attribute */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* resevered */ - 210, 4, 210, 4, /* time and date */ - 0, 0, /* startcluster */ - 0, 0, 0, 0, /* filesize */ - ".. ", " ", /* the .. entry */ - ATTR_DIRECTORY, /* file attribute */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* resevered */ - 210, 4, 210, 4, /* time and date */ - 0, 0, /* startcluster */ - 0, 0, 0, 0, /* filesize */ + { + ". ", " ", /* the . entry */ + ATTR_DIRECTORY, /* file attribute */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* resevered */ + {210, 4}, {210, 4}, /* time and date */ + {0, 0}, /* startcluster */ + {0, 0, 0, 0}, /* filesize */ + },{ + ".. ", " ", /* the .. entry */ + ATTR_DIRECTORY, /* file attribute */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* resevered */ + {210, 4}, {210, 4}, /* time and date */ + {0, 0}, /* startcluster */ + {0, 0, 0, 0}, /* filesize */ + } }; int @@ -1225,7 +1237,8 @@ msdosfs_mkdir(ap) /* * Allocate a cluster to hold the about to be created directory. */ - if (error = clusteralloc(pmp, 0, 1, CLUST_EOFE, &newcluster, NULL)) { + error = clusteralloc(pmp, 0, 1, CLUST_EOFE, &newcluster, NULL); + if (error) { free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); return error; @@ -1251,7 +1264,8 @@ msdosfs_mkdir(ap) putushort(denp->deStartCluster, pdep->de_StartCluster); putushort(denp->deDate, dDate); putushort(denp->deTime, dTime); - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { clusterfree(pmp, newcluster, NULL); free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); @@ -1326,7 +1340,8 @@ msdosfs_rmdir(ap) * up access and eventually msdosfs_reclaim() will be called which * will remove it from the denode cache. */ - if (error = removede(ddep,dep)) + error = removede(ddep,dep); + if (error) goto out; /* @@ -1341,7 +1356,7 @@ msdosfs_rmdir(ap) /* * Truncate the directory that is being deleted. */ - error = detrunc(dep, (u_long) 0, IO_SYNC); + error = detrunc(dep, (u_long) 0, IO_SYNC, NOCRED, NULL); cache_purge(DETOV(dep)); out: ; @@ -1364,8 +1379,6 @@ msdosfs_symlink(ap) char *a_target; } */ *ap; { - struct denode *pdep = VTODE(ap->a_dvp); - free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); return EINVAL; @@ -1430,7 +1443,6 @@ msdosfs_readdir(ap) struct dirent *prev; struct dirent *crnt; u_char dirbuf[512]; /* holds converted dos directories */ - int i = 0; struct uio *uio = ap->a_uio; int ncookies = 1; u_int* cookies = NULL; @@ -1756,7 +1768,6 @@ msdosfs_bmap(ap) } */ *ap; { struct denode *dep = VTODE(ap->a_vp); - struct msdosfsmount *pmp = dep->de_pmp; if (ap->a_vpp != NULL) *ap->a_vpp = dep->de_devvp; @@ -1789,7 +1800,6 @@ msdosfs_strategy(ap) { struct buf *bp = ap->a_bp; struct denode *dep = VTODE(bp->b_vp); - struct msdosfsmount *pmp = dep->de_pmp; struct vnode *vp; int error = 0; @@ -1802,7 +1812,8 @@ msdosfs_strategy(ap) * don't allow files with holes, so we shouldn't ever see this. */ if (bp->b_blkno == bp->b_lblkno) { - if (error = pcbmap(dep, bp->b_lblkno, &bp->b_blkno, 0)) + error = pcbmap(dep, bp->b_lblkno, &bp->b_blkno, 0); + if (error) bp->b_blkno = -1; if (bp->b_blkno == -1) clrbuf(bp); @@ -1831,15 +1842,16 @@ msdosfs_print(ap) { struct denode *dep = VTODE(ap->a_vp); - printf("tag VT_MSDOSFS, startcluster %d, dircluster %d, diroffset %d ", + printf( + "tag VT_MSDOSFS, startcluster %d, dircluster %ld, diroffset %ld ", dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); printf(" dev %d, %d, %s\n", major(dep->de_dev), minor(dep->de_dev), dep->de_flag & DE_LOCKED ? "(LOCKED)" : ""); if (dep->de_lockholder) { - printf(" owner pid %d", dep->de_lockholder); + printf(" owner pid %d", (int)dep->de_lockholder); if (dep->de_lockwaiter) - printf(" waiting pid %d", dep->de_lockwaiter); + printf(" waiting pid %d", (int)dep->de_lockwaiter); printf("\n"); } return 0; diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index 62853c5e21bc..270b5b4b4d5b 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfsmount.h,v 1.1 1994/09/19 15:41:48 dfr Exp $ */ /* $NetBSD: msdosfsmount.h,v 1.7 1994/08/21 18:44:17 ws Exp $ */ /*- @@ -181,3 +181,5 @@ int msdosfs_sync __P((struct mount *, int, struct ucred *, struct proc *)); int msdosfs_fhtovp __P((struct mount *, struct fid *, struct mbuf *, struct vnode **, int *, struct ucred **)); int msdosfs_vptofh __P((struct vnode *, struct fid *)); int msdosfs_init __P(()); + +int mountmsdosfs __P((struct vnode *devvp, struct mount *mp, struct proc *p)); diff --git a/sys/msdosfs/fat.h b/sys/msdosfs/fat.h index 3867c87d5a9d..b5f223f46db3 100644 --- a/sys/msdosfs/fat.h +++ b/sys/msdosfs/fat.h @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: fat.h,v 1.1 1994/09/19 15:41:40 dfr Exp $ */ /* $NetBSD: fat.h,v 1.4 1994/08/21 18:43:57 ws Exp $ */ /*- @@ -94,4 +94,18 @@ int clusteralloc __P((struct msdosfsmount *pmp, u_long start, u_long count, u_lo int fatentry __P((int function, struct msdosfsmount *pmp, u_long cluster, u_long *oldcontents, u_long newcontents)); int freeclusterchain __P((struct msdosfsmount *pmp, u_long startchain)); int extendfile __P((struct denode *dep, u_long count, struct buf **bpp, u_long *ncp, int flags)); +void fc_purge __P((struct denode *dep, u_int frcn)); +void fc_lookup __P((struct denode *dep, u_long findcn, u_long *frcnp, u_long *fsrcnp)); + +int readep __P((struct msdosfsmount *pmp, u_long dirclu, u_long dirofs, struct buf **bpp, struct direntry **epp)); +int readde __P((struct denode *dep, struct buf **bpp, struct direntry **epp)); +int deextend __P((struct denode *dep, off_t length, struct ucred *cred)); +int fillinusemap __P((struct msdosfsmount *pmp)); +int reinsert __P((struct denode *dep)); +int dosdirempty __P((struct denode *dep)); +int createde __P((struct denode *dep, struct denode *ddep, struct denode **depp)); +int deupdat __P((struct denode *dep, struct timespec *tp, int waitfor)); +int removede __P((struct denode *pdep, struct denode *dep)); +int detrunc __P((struct denode *dep, u_long length, int flags, struct ucred *cred, struct proc *p)); +int doscheckpath __P(( struct denode *source, struct denode *target)); #endif /* KERNEL */ diff --git a/sys/msdosfs/msdosfs_conv.c b/sys/msdosfs/msdosfs_conv.c index da8ce976a600..035eb0552aa4 100644 --- a/sys/msdosfs/msdosfs_conv.c +++ b/sys/msdosfs/msdosfs_conv.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_conv.c,v 1.1 1994/09/19 15:41:40 dfr Exp $ */ /* $NetBSD: msdosfs_conv.c,v 1.6.2.1 1994/08/30 02:27:57 cgd Exp $ */ /* @@ -23,6 +23,7 @@ #include <sys/param.h> #include <sys/time.h> #include <sys/kernel.h> /* defines tz */ +#include <sys/systm.h> /* defines tz */ /* * MSDOSFS include files. @@ -166,8 +167,9 @@ dos2unixtime(dd, dt, tsp) */ month = (dd & DD_MONTH_MASK) >> DD_MONTH_SHIFT; if (month == 0) { - printf("dos2unixtime(): month value out of range (%d)\n", - month); + printf( + "dos2unixtime(): month value out of range (%ld)\n", + month); month = 1; } for (m = 0; m < month - 1; m++) { diff --git a/sys/msdosfs/msdosfs_denode.c b/sys/msdosfs/msdosfs_denode.c index 681286349102..c671dc913c96 100644 --- a/sys/msdosfs/msdosfs_denode.c +++ b/sys/msdosfs/msdosfs_denode.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_denode.c,v 1.1 1994/09/19 15:41:41 dfr Exp $ */ /* $NetBSD: msdosfs_denode.c,v 1.9 1994/08/21 18:44:00 ws Exp $ */ /*- @@ -55,8 +55,11 @@ #include <sys/proc.h> #include <sys/buf.h> #include <sys/vnode.h> +#include <sys/types.h> #include <sys/kernel.h> /* defines "time" */ +#include <vm/vm.h> + #include <msdosfs/bpb.h> #include <msdosfs/msdosfsmount.h> #include <msdosfs/direntry.h> @@ -110,7 +113,8 @@ msdosfs_hashins(dep) struct denode **depp, *deq; depp = &dehashtbl[DEHASH(dep->de_dev, dep->de_dirclust + dep->de_diroffset)]; - if (deq = *depp) + deq = *depp; + if (deq) deq->de_prev = &dep->de_next; dep->de_next = deq; dep->de_prev = depp; @@ -129,7 +133,8 @@ msdosfs_hashrem(dep) struct denode *dep; { struct denode *deq; - if (deq = dep->de_next) + deq = dep->de_next; + if (deq) deq->de_prev = dep->de_prev; *dep->de_prev = deq; #ifdef DIAGNOSTIC @@ -197,7 +202,8 @@ deget(pmp, dirclust, diroffset, direntptr, depp) * entry that represented the file happens to be reused while the * deleted file is still open. */ - if (ldep = msdosfs_hashget(dev, dirclust, diroffset)) { + ldep = msdosfs_hashget(dev, dirclust, diroffset); + if (ldep) { *depp = ldep; return 0; } @@ -208,7 +214,8 @@ deget(pmp, dirclust, diroffset, direntptr, depp) * copy it from the passed disk buffer. */ /* getnewvnode() does a VREF() on the vnode */ - if (error = getnewvnode(VT_MSDOSFS, mntp, msdosfs_vnodeop_p, &nvp)) { + error = getnewvnode(VT_MSDOSFS, mntp, msdosfs_vnodeop_p, &nvp); + if (error) { *depp = 0; return error; } @@ -309,11 +316,8 @@ deupdat(dep, tp, waitfor) int waitfor; { int error; - daddr_t bn; - int diro; struct buf *bp; struct direntry *dirp; - struct msdosfsmount *pmp = dep->de_pmp; struct timespec ts; struct vnode *vp = DETOV(dep); @@ -338,7 +342,8 @@ deupdat(dep, tp, waitfor) * Read in the cluster containing the directory entry we want to * update. */ - if (error = readde(dep, &bp, &dirp)) + error = readde(dep, &bp, &dirp); + if (error) return error; /* @@ -388,6 +393,7 @@ detrunc(dep, length, flags, cred, p) int isadir = dep->de_Attributes & ATTR_DIRECTORY; struct buf *bp; struct msdosfsmount *pmp = dep->de_pmp; + struct timespec ts; #ifdef MSDOSFS_DEBUG printf("detrunc(): file %s, length %d, flags %d\n", dep->de_Name, length, flags); @@ -402,7 +408,8 @@ detrunc(dep, length, flags, cred, p) * directory's life. */ if (DETOV(dep)->v_flag & VROOT) { - printf("detrunc(): can't truncate root directory, clust %d, offset %d\n", + printf( + "detrunc(): can't truncate root directory, clust %ld, offset %ld\n", dep->de_dirclust, dep->de_diroffset); return EINVAL; } @@ -426,7 +433,8 @@ detrunc(dep, length, flags, cred, p) dep->de_StartCluster = 0; eofentry = ~0; } else { - if (error = pcbmap(dep, de_clcount(pmp, length) - 1, 0, &eofentry)) { + error = pcbmap(dep, de_clcount(pmp, length) - 1, 0, &eofentry); + if (error) { #ifdef MSDOSFS_DEBUG printf("detrunc(): pcbmap fails %d\n", error); #endif @@ -480,7 +488,8 @@ detrunc(dep, length, flags, cred, p) dep->de_flag |= DE_UPDATE; vflags = (length > 0 ? V_SAVE : 0) | V_SAVEMETA; vinvalbuf(DETOV(dep), vflags, cred, p, 0, 0); - allerror = deupdat(dep, &time, 1); + TIMEVAL_TO_TIMESPEC(&time, &ts); + allerror = deupdat(dep, &ts, 1); #ifdef MSDOSFS_DEBUG printf("detrunc(): allerror %d, eofentry %d\n", allerror, eofentry); @@ -525,6 +534,7 @@ deextend(dep, length, cred) struct msdosfsmount *pmp = dep->de_pmp; u_long count; int error; + struct timespec ts; /* * The root of a DOS filesystem cannot be extended. @@ -537,7 +547,8 @@ deextend(dep, length, cred) * Is this really important? */ if (dep->de_Attributes & ATTR_DIRECTORY) { - if (error = suser(cred, NULL)) + error = suser(cred, NULL); + if (error) return error; } @@ -551,7 +562,8 @@ deextend(dep, length, cred) if (count > 0) { if (count > pmp->pm_freeclustercount) return ENOSPC; - if (error = extendfile(dep, count, NULL, NULL, DE_CLEAR)) { + error = extendfile(dep, count, NULL, NULL, DE_CLEAR); + if (error) { /* truncate the added clusters away again */ (void) detrunc(dep, dep->de_FileSize, 0, cred, NULL); return error; @@ -560,7 +572,8 @@ deextend(dep, length, cred) dep->de_flag |= DE_UPDATE; dep->de_FileSize = length; - return deupdat(dep, &time, 1); + TIMEVAL_TO_TIMESPEC(&time, &ts); + return deupdat(dep, &ts, 1); } /* @@ -570,8 +583,6 @@ deextend(dep, length, cred) int reinsert(dep) struct denode *dep; { - union dehead *deh; - /* * Fix up the denode cache. If the denode is for a directory, * there is nothing to do since the hash is based on the starting @@ -595,7 +606,6 @@ msdosfs_reclaim(ap) { struct vnode *vp = ap->a_vp; struct denode *dep = VTODE(vp); - int i; extern int prtactive; #ifdef MSDOSFS_DEBUG @@ -638,6 +648,7 @@ msdosfs_inactive(ap) struct denode *dep = VTODE(vp); int error = 0; extern int prtactive; + struct timespec ts; #ifdef MSDOSFS_DEBUG printf("msdosfs_inactive(): dep %08x, de_Name[0] %x\n", dep, dep->de_Name[0]); @@ -671,7 +682,8 @@ msdosfs_inactive(ap) dep->de_flag |= DE_UPDATE; dep->de_Name[0] = SLOT_DELETED; } - DE_UPDAT(dep, &time, 0); + TIMEVAL_TO_TIMESPEC(&time, &ts); + DE_UPDAT(dep, &ts, 0); VOP_UNLOCK(vp); dep->de_flag = 0; diff --git a/sys/msdosfs/msdosfs_fat.c b/sys/msdosfs/msdosfs_fat.c index 9a2f11785b12..9ab23a24d0ab 100644 --- a/sys/msdosfs/msdosfs_fat.c +++ b/sys/msdosfs/msdosfs_fat.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_fat.c,v 1.1 1994/09/19 15:41:43 dfr Exp $ */ /* $NetBSD: msdosfs_fat.c,v 1.12 1994/08/21 18:44:04 ws Exp $ */ /*- @@ -85,10 +85,6 @@ int fc_largedistance; /* off by more than LMMAX */ /* Byte offset in FAT on filesystem pmp, cluster cn */ #define FATOFS(pmp, cn) (FAT12(pmp) ? (cn) * 3 / 2 : (cn) * 2) -void fc_lookup(struct denode *dep, u_long findcn, - u_long *frcnp, u_long *fsrcnp); -void fc_purge(struct denode *dep, u_int frcn); - static void fatblock(pmp, ofs, bnp, sizep, bop) struct msdosfsmount *pmp; @@ -255,7 +251,8 @@ hiteof:; * Find the closest entry in the fat cache to the cluster we are looking * for. */ -void fc_lookup(dep, findcn, frcnp, fsrcnp) +void +fc_lookup(dep, findcn, frcnp, fsrcnp) struct denode *dep; u_long findcn; u_long *frcnp; @@ -471,7 +468,8 @@ fatentry(function, pmp, cn, oldcontents, newcontents) byteoffset = FATOFS(pmp, cn); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; if (function & FAT_GET) { @@ -540,7 +538,8 @@ fatchain(pmp, start, count, fillwith) while (count > 0) { byteoffset = FATOFS(pmp, start); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; while (count > 0) { start++; @@ -603,7 +602,8 @@ chainlength(pmp, start, count) while (++idx <= max_idx) { if (len >= count) break; - if (map = pmp->pm_inusemap[idx]) { + map = pmp->pm_inusemap[idx]; + if (map) { len += ffs(map) - 1; break; } @@ -670,7 +670,6 @@ clusteralloc(pmp, start, count, fillwith, retcluster, got) u_long *retcluster; u_long *got; { - int error; u_long idx; u_long len, newst, foundcn, foundl, cn, l; u_int map; @@ -768,7 +767,8 @@ freeclusterchain(pmp, cluster) if (lbn != bn) { if (bp) updatefats(pmp, bp, bn); - if (error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + if (error) return error; lbn = bn; } @@ -916,7 +916,8 @@ extendfile(dep, count, bpp, ncp, flags) cn = 0; else cn = dep->de_fc[FC_LASTFC].fc_fsrcn + 1; - if (error = clusteralloc(pmp, cn, count, CLUST_EOFE, &cn, &got)) + error = clusteralloc(pmp, cn, count, CLUST_EOFE, &cn, &got); + if (error) return error; count -= got; diff --git a/sys/msdosfs/msdosfs_lookup.c b/sys/msdosfs/msdosfs_lookup.c index c67f888ac1a2..269184269737 100644 --- a/sys/msdosfs/msdosfs_lookup.c +++ b/sys/msdosfs/msdosfs_lookup.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfs_lookup.c,v 1.1 1994/09/19 15:41:44 dfr Exp $ */ /* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */ /*- @@ -53,6 +53,7 @@ #include <sys/buf.h> #include <sys/vnode.h> #include <sys/mount.h> +#include <sys/systm.h> #include <msdosfs/bpb.h> #include <msdosfs/direntry.h> @@ -137,7 +138,8 @@ msdosfs_lookup(ap) * See if the component of the pathname we are looking for is in * the directory cache. If so then do a few things and return. */ - if (error = cache_lookup(vdp, vpp, cnp)) { + error = cache_lookup(vdp, vpp, cnp); + if (error) { int vpid; if (error == ENOENT) @@ -172,7 +174,8 @@ msdosfs_lookup(ap) if (lockparent && pdp != vdp && (flags & ISLASTCN)) VOP_UNLOCK(pdp); } - if (error = VOP_LOCK(pdp)) + error = VOP_LOCK(pdp); + if (error) return error; vdp = pdp; dp = VTODE(vdp); @@ -227,12 +230,14 @@ msdosfs_lookup(ap) */ rootreloff = 0; for (frcn = 0;; frcn++) { - if (error = pcbmap(dp, frcn, &bn, &cluster)) { + error = pcbmap(dp, frcn, &bn, &cluster); + if (error) { if (error == E2BIG) break; return error; } - if (error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, &bp)) + error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster,NOCRED,&bp); + if (error) return error; for (diroff = 0; diroff < pmp->pm_depclust; diroff++) { dep = (struct direntry *) bp->b_data + diroff; @@ -459,7 +464,6 @@ createde(dep, ddep, depp) struct denode *ddep; struct denode **depp; { - int bn; int error; u_long dirclust, diroffset; struct direntry *ndep; @@ -479,7 +483,8 @@ createde(dep, ddep, depp) * case. */ if (ddep->de_fndclust == (u_long)-1) { - if (error = extendfile(ddep, 1, &bp, &dirclust, DE_CLEAR)) + error = extendfile(ddep, 1, &bp, &dirclust, DE_CLEAR); + if (error) return error; ndep = (struct direntry *) bp->b_data; /* @@ -515,7 +520,8 @@ createde(dep, ddep, depp) if (error) return error; } - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { vput(DETOV(*depp)); /* free the vnode we got on error */ return error; } @@ -659,7 +665,6 @@ doscheckpath(source, target) struct denode *target; { daddr_t scn; - struct denode dummy; struct msdosfsmount *pmp; struct direntry *ep; struct denode *dep; @@ -737,7 +742,8 @@ readep(pmp, dirclu, dirofs, bpp, epp) daddr_t bn; bn = detobn(pmp, dirclu, dirofs); - if (error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, bpp)) { + error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, NOCRED, bpp); + if (error) { *bpp = NULL; return error; } diff --git a/sys/msdosfs/msdosfs_vfsops.c b/sys/msdosfs/msdosfs_vfsops.c index f9243765c7e0..1c36f8a56c9b 100644 --- a/sys/msdosfs/msdosfs_vfsops.c +++ b/sys/msdosfs/msdosfs_vfsops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vfsops.c,v 1.2 1994/09/19 19:24:44 dfr Exp $ */ +/* $Id: msdosfs_vfsops.c,v 1.3 1994/09/21 03:47:16 wollman Exp $ */ /* $NetBSD: msdosfs_vfsops.c,v 1.19 1994/08/21 18:44:10 ws Exp $ */ /*- @@ -93,7 +93,8 @@ msdosfs_mount(mp, path, data, ndp, p) /* * Copy in the args for the mount request. */ - if (error = copyin(data, (caddr_t) & args, sizeof(struct msdosfs_args))) + error = copyin(data, (caddr_t) & args, sizeof(struct msdosfs_args)); + if (error) return error; /* @@ -259,17 +260,20 @@ mountmsdosfs(devvp, mp, p) * old buffers from this filesystem. Presumably this prevents us * from running into buffers that are the wrong blocksize. */ - if (error = vfs_mountedon(devvp)) + error = vfs_mountedon(devvp); + if (error) return error; if (vcount(devvp) > 1) return EBUSY; - if (error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0)) + error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); + if (error) return error; /* * Now open the block special file. */ - if (error = VOP_OPEN(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, p)) + error = VOP_OPEN(devvp, ronly ? FREAD : FREAD | FWRITE, FSCRED, p); + if (error) return error; needclose = 1; #ifdef HDSUPPORT @@ -287,7 +291,8 @@ mountmsdosfs(devvp, mp, p) * also add some checking on the bsOemName field. So far I've seen * the following values: "IBM 3.3" "MSDOS3.3" "MSDOS5.0" */ - if (error = bread(devvp, 0, 512, NOCRED, &bp0)) + error = bread(devvp, 0, 512, NOCRED, &bp0); + if (error) goto error_exit; bp0->b_flags |= B_AGE; bsp = (union bootsector *) bp0->b_data; @@ -493,7 +498,6 @@ msdosfs_unmount(mp, mntflags, p) int flags = 0; int error; struct msdosfsmount *pmp = (struct msdosfsmount *) mp->mnt_data; - struct vnode *vp = pmp->pm_devvp; /* only the mounter, or superuser can unmount */ if ((p->p_cred->p_ruid != pmp->pm_mounter) && @@ -507,7 +511,8 @@ msdosfs_unmount(mp, mntflags, p) } #ifdef QUOTA #endif - if (error = vflush(mp, NULLVP, flags)) + error = vflush(mp, NULLVP, flags); + if (error) return error; pmp->pm_devvp->v_specflags &= ~SI_MOUNTEDON; #ifdef MSDOSFS_DEBUG @@ -561,6 +566,7 @@ msdosfs_quotactl(mp, cmds, uid, arg, p) struct proc *p; { #ifdef QUOTA + return EOPNOTSUPP; #else return EOPNOTSUPP; #endif @@ -646,7 +652,8 @@ loop: continue; if (vget(vp, 1)) /* not there anymore? */ goto loop; - if (error = VOP_FSYNC(vp, cred, waitfor, p)) + error = VOP_FSYNC(vp, cred, waitfor, p); + if (error) allerror = error; vput(vp); /* done with this one */ } @@ -654,7 +661,8 @@ loop: /* * Flush filesystem control info. */ - if (error = VOP_FSYNC(pmp->pm_devvp, cred, waitfor, p)) + error = VOP_FSYNC(pmp->pm_devvp, cred, waitfor, p); + if (error) allerror = error; return allerror; } diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c index b2a5bf75be7c..5235e2d6a3ae 100644 --- a/sys/msdosfs/msdosfs_vnops.c +++ b/sys/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_vnops.c,v 1.1 1994/09/19 15:41:46 dfr Exp $ */ +/* $Id: msdosfs_vnops.c,v 1.2 1994/09/21 03:47:17 wollman Exp $ */ /* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */ /*- @@ -62,6 +62,9 @@ #include <miscfs/specfs/specdev.h> /* XXX */ /* defines v_rdev */ #include <sys/malloc.h> #include <sys/dir.h> /* defines dirent structure */ +#include <sys/signalvar.h> + +#include <vm/vm.h> #include <msdosfs/bpb.h> #include <msdosfs/direntry.h> @@ -152,7 +155,6 @@ msdosfs_mknod(ap) } */ *ap; { int error; - struct denode *pdep = VTODE(ap->a_dvp); switch (ap->a_vap->va_type) { case VDIR: @@ -382,12 +384,14 @@ msdosfs_setattr(ap) if (vap->va_size != VNOVAL) { if (ap->a_vp->v_type == VDIR) return EISDIR; - if (error = detrunc(dep, vap->va_size, 0, cred, ap->a_p)) + error = detrunc(dep, vap->va_size, 0, cred, ap->a_p); + if (error) return error; } if (vap->va_mtime.ts_sec != VNOVAL) { dep->de_flag |= DE_UPDATE; - if (error = deupdat(dep, &vap->va_mtime, 1)) + error = deupdat(dep, &vap->va_mtime, 1); + if (error) return error; } @@ -406,7 +410,8 @@ msdosfs_setattr(ap) } if (vap->va_flags != VNOVAL) { - if (error = suser(cred, &ap->a_p->p_acflag)) + error = suser(cred, &ap->a_p->p_acflag); + if (error) return error; if (cred->cr_uid == 0) dep->de_flag = vap->va_flags; @@ -433,7 +438,6 @@ msdosfs_read(ap) int isadir; long n; long on; - daddr_t bn; daddr_t lbn; daddr_t rablock; int rasize; @@ -539,7 +543,9 @@ msdosfs_write(ap) struct denode *dep = VTODE(vp); struct msdosfsmount *pmp = dep->de_pmp; struct ucred *cred = ap->a_cred; + struct timespec ts; + TIMEVAL_TO_TIMESPEC(&time, &ts); #ifdef MSDOSFS_DEBUG printf("msdosfs_write(vp %08x, uio %08x, ioflag %08x, cred %08x\n", vp, uio, ioflag, cred); @@ -627,7 +633,8 @@ msdosfs_write(ap) do { bn = de_blk(pmp, uio->uio_offset); if (isadir) { - if (error = pcbmap(dep, bn, &bn, 0)) + error = pcbmap(dep, bn, &bn, 0); + if (error) break; } else if (bn > lastcn) { error = ENOSPC; @@ -650,8 +657,9 @@ msdosfs_write(ap) */ if (!isadir) { if (bp->b_blkno == bp->b_lblkno) { - if (error = pcbmap(dep, bp->b_lblkno, - &bp->b_blkno, 0)) + error = pcbmap(dep, bp->b_lblkno, + &bp->b_blkno, 0); + if (error) bp->b_blkno = -1; } if (bp->b_blkno == -1) { @@ -665,7 +673,8 @@ msdosfs_write(ap) /* * The block we need to write into exists, so read it in. */ - if (error = bread(thisvp, bn, pmp->pm_bpcluster, cred, &bp)) + error = bread(thisvp, bn, pmp->pm_bpcluster, cred, &bp); + if (error) break; } @@ -719,7 +728,7 @@ errexit: error = 0; } } else { - error = deupdat(dep, &time, 1); + error = deupdat(dep, &ts, 1); } return error; } @@ -780,7 +789,9 @@ msdosfs_fsync(ap) { struct vnode *vp = ap->a_vp; int wait = ap->a_waitfor == MNT_WAIT; - int error; + struct timespec ts; + + TIMEVAL_TO_TIMESPEC(&time, &ts); #if 0 /* @@ -790,7 +801,7 @@ msdosfs_fsync(ap) */ vflushbuf(vp, wait ? B_SYNC : 0); #endif - return deupdat(VTODE(vp), &time, wait); + return deupdat(VTODE(vp), &ts, wait); } /* @@ -1004,14 +1015,13 @@ msdosfs_rename(ap) /* doscheckpath() vput()'s tddep */ error = doscheckpath(fdep, tddep); tddep = NULL; - if (error) { + if (error) goto bad; - } if ((ap->a_tcnp->cn_flags & SAVESTART) == 0) panic("msdosfs_rename(): lost to startdir"); - if (error = relookup(ap->a_tdvp, &tvp, ap->a_tcnp)) { + error = relookup(ap->a_tdvp, &tvp, ap->a_tcnp); + if (error) goto bad; - } tddep = VTODE(ap->a_tdvp); tdep = tvp ? VTODE(tvp) : NULL; } @@ -1039,9 +1049,9 @@ msdosfs_rename(ap) } to_dirclust = tdep->de_dirclust; to_diroffset = tdep->de_diroffset; - if (error = removede(tddep,tdep)) { + error = removede(tddep,tdep); + if (error) goto bad; - } vput(ap->a_tvp); tdep = NULL; @@ -1060,15 +1070,15 @@ msdosfs_rename(ap) if (newparent == 0) { /* tddep and fddep point to the same denode here */ VOP_LOCK(ap->a_fvp); /* ap->a_fdvp is already locked */ - if (error = readep(fddep->de_pmp, - fdep->de_dirclust, - fdep->de_diroffset, - &bp, &ep)) { + error = readep(fddep->de_pmp, fdep->de_dirclust, + fdep->de_diroffset, &bp, &ep); + if (error) { VOP_UNLOCK(ap->a_fvp); goto bad; } bcopy(toname, ep->deName, 11); - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { VOP_UNLOCK(ap->a_fvp); goto bad; } @@ -1107,16 +1117,16 @@ msdosfs_rename(ap) goto bad; } VOP_LOCK(ap->a_fdvp); - if (error = readep(fddep->de_pmp, - fddep->de_fndclust, - fddep->de_fndoffset, - &bp, &ep)) { + error = readep(fddep->de_pmp, fddep->de_fndclust, + fddep->de_fndoffset, &bp, &ep); + if (error) { VOP_UNLOCK(ap->a_fvp); VOP_UNLOCK(ap->a_fdvp); goto bad; } ep->deName[0] = SLOT_DELETED; - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { VOP_UNLOCK(ap->a_fvp); VOP_UNLOCK(ap->a_fdvp); goto bad; @@ -1171,19 +1181,21 @@ struct { struct direntry dot; struct direntry dotdot; } dosdirtemplate = { - - ". ", " ", /* the . entry */ - ATTR_DIRECTORY, /* file attribute */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* resevered */ - 210, 4, 210, 4, /* time and date */ - 0, 0, /* startcluster */ - 0, 0, 0, 0, /* filesize */ - ".. ", " ", /* the .. entry */ - ATTR_DIRECTORY, /* file attribute */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* resevered */ - 210, 4, 210, 4, /* time and date */ - 0, 0, /* startcluster */ - 0, 0, 0, 0, /* filesize */ + { + ". ", " ", /* the . entry */ + ATTR_DIRECTORY, /* file attribute */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* resevered */ + {210, 4}, {210, 4}, /* time and date */ + {0, 0}, /* startcluster */ + {0, 0, 0, 0}, /* filesize */ + },{ + ".. ", " ", /* the .. entry */ + ATTR_DIRECTORY, /* file attribute */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* resevered */ + {210, 4}, {210, 4}, /* time and date */ + {0, 0}, /* startcluster */ + {0, 0, 0, 0}, /* filesize */ + } }; int @@ -1225,7 +1237,8 @@ msdosfs_mkdir(ap) /* * Allocate a cluster to hold the about to be created directory. */ - if (error = clusteralloc(pmp, 0, 1, CLUST_EOFE, &newcluster, NULL)) { + error = clusteralloc(pmp, 0, 1, CLUST_EOFE, &newcluster, NULL); + if (error) { free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); return error; @@ -1251,7 +1264,8 @@ msdosfs_mkdir(ap) putushort(denp->deStartCluster, pdep->de_StartCluster); putushort(denp->deDate, dDate); putushort(denp->deTime, dTime); - if (error = bwrite(bp)) { + error = bwrite(bp); + if (error) { clusterfree(pmp, newcluster, NULL); free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); @@ -1326,7 +1340,8 @@ msdosfs_rmdir(ap) * up access and eventually msdosfs_reclaim() will be called which * will remove it from the denode cache. */ - if (error = removede(ddep,dep)) + error = removede(ddep,dep); + if (error) goto out; /* @@ -1341,7 +1356,7 @@ msdosfs_rmdir(ap) /* * Truncate the directory that is being deleted. */ - error = detrunc(dep, (u_long) 0, IO_SYNC); + error = detrunc(dep, (u_long) 0, IO_SYNC, NOCRED, NULL); cache_purge(DETOV(dep)); out: ; @@ -1364,8 +1379,6 @@ msdosfs_symlink(ap) char *a_target; } */ *ap; { - struct denode *pdep = VTODE(ap->a_dvp); - free(ap->a_cnp->cn_pnbuf, M_NAMEI); vput(ap->a_dvp); return EINVAL; @@ -1430,7 +1443,6 @@ msdosfs_readdir(ap) struct dirent *prev; struct dirent *crnt; u_char dirbuf[512]; /* holds converted dos directories */ - int i = 0; struct uio *uio = ap->a_uio; int ncookies = 1; u_int* cookies = NULL; @@ -1756,7 +1768,6 @@ msdosfs_bmap(ap) } */ *ap; { struct denode *dep = VTODE(ap->a_vp); - struct msdosfsmount *pmp = dep->de_pmp; if (ap->a_vpp != NULL) *ap->a_vpp = dep->de_devvp; @@ -1789,7 +1800,6 @@ msdosfs_strategy(ap) { struct buf *bp = ap->a_bp; struct denode *dep = VTODE(bp->b_vp); - struct msdosfsmount *pmp = dep->de_pmp; struct vnode *vp; int error = 0; @@ -1802,7 +1812,8 @@ msdosfs_strategy(ap) * don't allow files with holes, so we shouldn't ever see this. */ if (bp->b_blkno == bp->b_lblkno) { - if (error = pcbmap(dep, bp->b_lblkno, &bp->b_blkno, 0)) + error = pcbmap(dep, bp->b_lblkno, &bp->b_blkno, 0); + if (error) bp->b_blkno = -1; if (bp->b_blkno == -1) clrbuf(bp); @@ -1831,15 +1842,16 @@ msdosfs_print(ap) { struct denode *dep = VTODE(ap->a_vp); - printf("tag VT_MSDOSFS, startcluster %d, dircluster %d, diroffset %d ", + printf( + "tag VT_MSDOSFS, startcluster %d, dircluster %ld, diroffset %ld ", dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); printf(" dev %d, %d, %s\n", major(dep->de_dev), minor(dep->de_dev), dep->de_flag & DE_LOCKED ? "(LOCKED)" : ""); if (dep->de_lockholder) { - printf(" owner pid %d", dep->de_lockholder); + printf(" owner pid %d", (int)dep->de_lockholder); if (dep->de_lockwaiter) - printf(" waiting pid %d", dep->de_lockwaiter); + printf(" waiting pid %d", (int)dep->de_lockwaiter); printf("\n"); } return 0; diff --git a/sys/msdosfs/msdosfsmount.h b/sys/msdosfs/msdosfsmount.h index 62853c5e21bc..270b5b4b4d5b 100644 --- a/sys/msdosfs/msdosfsmount.h +++ b/sys/msdosfs/msdosfsmount.h @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: msdosfsmount.h,v 1.1 1994/09/19 15:41:48 dfr Exp $ */ /* $NetBSD: msdosfsmount.h,v 1.7 1994/08/21 18:44:17 ws Exp $ */ /*- @@ -181,3 +181,5 @@ int msdosfs_sync __P((struct mount *, int, struct ucred *, struct proc *)); int msdosfs_fhtovp __P((struct mount *, struct fid *, struct mbuf *, struct vnode **, int *, struct ucred **)); int msdosfs_vptofh __P((struct vnode *, struct fid *)); int msdosfs_init __P(()); + +int mountmsdosfs __P((struct vnode *devvp, struct mount *mp, struct proc *p)); |