Module Name: src Committed By: hannken Date: Sat Oct 23 07:38:33 UTC 2021
Modified Files: src/sys/fs/msdosfs: denode.h msdosfs_lookup.c msdosfs_vnops.c src/usr.sbin/makefs/msdos: msdosfs_vnops.c Log Message: Factor out the lookup results from struct denode. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/fs/msdosfs/denode.h cvs rdiff -u -r1.37 -r1.38 src/sys/fs/msdosfs/msdosfs_lookup.c cvs rdiff -u -r1.107 -r1.108 src/sys/fs/msdosfs/msdosfs_vnops.c cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/makefs/msdos/msdosfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/msdosfs/denode.h diff -u src/sys/fs/msdosfs/denode.h:1.26 src/sys/fs/msdosfs/denode.h:1.27 --- src/sys/fs/msdosfs/denode.h:1.26 Sun Jul 18 23:57:14 2021 +++ src/sys/fs/msdosfs/denode.h Sat Oct 23 07:38:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: denode.h,v 1.26 2021/07/18 23:57:14 dholland Exp $ */ +/* $NetBSD: denode.h,v 1.27 2021/10/23 07:38:33 hannken Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -147,7 +147,14 @@ struct fatcache { (dep)->de_fc[FC_NEXTTOLASTFC].fc_frcn = (dep)->de_fc[FC_LASTFC].fc_frcn; \ (dep)->de_fc[FC_NEXTTOLASTFC].fc_fsrcn = (dep)->de_fc[FC_LASTFC].fc_fsrcn; \ } while (0) - + +/* + * Auxiliary results from an msdosfs_lookup operation + */ +struct msdosfs_lookup_results { + u_long mlr_fndoffset; /* offset of found dir entry */ + int mlr_fndcnt; /* number of slots before de_fndoffset */ +}; /* * This is the in memory variant of a dos directory entry. It is usually @@ -168,8 +175,7 @@ struct denode { #define de_dirclust de_key.dk_dirclust #define de_diroffset de_key.dk_diroffset #define de_dirgen de_key.dk_dirgen - u_long de_fndoffset; /* offset of found dir entry */ - int de_fndcnt; /* number of slots before de_fndoffset */ + struct msdosfs_lookup_results de_crap; /* results from lookup */ long de_refcnt; /* reference count */ struct msdosfsmount *de_pmp; /* addr of our mount struct */ struct lockf *de_lockf; /* byte level lock list */ @@ -302,6 +308,7 @@ struct kauth_cred; int msdosfs_update(struct vnode *, const struct timespec *, const struct timespec *, int); int createde(struct denode *, struct denode *, + const struct msdosfs_lookup_results *, struct denode **, struct componentname *); int deextend(struct denode *, u_long, struct kauth_cred *); #ifdef MAKEFS @@ -316,7 +323,8 @@ int dosdirempty(struct denode *); int readde(struct denode *, struct buf **, struct direntry **); int readep(struct msdosfsmount *, u_long, u_long, struct buf **, struct direntry **); -int removede(struct denode *, struct denode *); +int removede(struct denode *, struct denode *, + const struct msdosfs_lookup_results *); int uniqdosname(struct denode *, struct componentname *, u_char *); int findwin95(struct denode *); int msdosfs_gop_alloc(struct vnode *, off_t, off_t, int, struct kauth_cred *); Index: src/sys/fs/msdosfs/msdosfs_lookup.c diff -u src/sys/fs/msdosfs/msdosfs_lookup.c:1.37 src/sys/fs/msdosfs/msdosfs_lookup.c:1.38 --- src/sys/fs/msdosfs/msdosfs_lookup.c:1.37 Sat Jul 24 21:31:38 2021 +++ src/sys/fs/msdosfs/msdosfs_lookup.c Sat Oct 23 07:38:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_lookup.c,v 1.37 2021/07/24 21:31:38 andvar Exp $ */ +/* $NetBSD: msdosfs_lookup.c,v 1.38 2021/10/23 07:38:33 hannken Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -52,7 +52,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.37 2021/07/24 21:31:38 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.38 2021/10/23 07:38:33 hannken Exp $"); #include <sys/param.h> @@ -320,21 +320,21 @@ msdosfs_lookup(void *v) * entry came from for whoever did * this lookup. */ - dp->de_fndoffset = diroff; + dp->de_crap.mlr_fndoffset = diroff; if (chksum_ok && nameiop == RENAME) { /* * Target had correct long name * directory entries, reuse them * as needed. */ - dp->de_fndcnt = wincnt - 1; + dp->de_crap.mlr_fndcnt = wincnt - 1; } else { /* * Long name directory entries * not present or corrupt, can only * reuse dos directory entry. */ - dp->de_fndcnt = 0; + dp->de_crap.mlr_fndcnt = 0; } goto found; @@ -389,8 +389,8 @@ notfound: * Return an indication of where the new directory * entry should be put. */ - dp->de_fndoffset = slotoffset; - dp->de_fndcnt = wincnt - 1; + dp->de_crap.mlr_fndoffset = slotoffset; + dp->de_crap.mlr_fndcnt = wincnt - 1; /* * We return with the directory locked, so that @@ -552,7 +552,9 @@ foundroot: * cnp - componentname needed for Win95 long filenames */ int -createde(struct denode *dep, struct denode *ddep, struct denode **depp, struct componentname *cnp) +createde(struct denode *dep, struct denode *ddep, + const struct msdosfs_lookup_results *mlr, + struct denode **depp, struct componentname *cnp) { int error, rberror; u_long dirclust, clusoffset; @@ -581,9 +583,9 @@ createde(struct denode *dep, struct deno * to extend the root directory. We just return an error in that * case. */ - if (ddep->de_fndoffset >= ddep->de_FileSize) { - u_long needlen = ddep->de_fndoffset + sizeof(struct direntry) - - ddep->de_FileSize; + if (mlr->mlr_fndoffset >= ddep->de_FileSize) { + u_long needlen = ddep->de_crap.mlr_fndoffset + + sizeof(struct direntry) - ddep->de_FileSize; dirclust = de_clcount(pmp, needlen); if ((error = extendfile(ddep, dirclust, 0, 0, DE_CLEAR)) != 0) { (void)detrunc(ddep, ddep->de_FileSize, 0, NOCRED); @@ -601,11 +603,11 @@ createde(struct denode *dep, struct deno * entry in. Then write it to disk. NOTE: DOS directories * do not get smaller as clusters are emptied. */ - error = pcbmap(ddep, de_cluster(pmp, ddep->de_fndoffset), + error = pcbmap(ddep, de_cluster(pmp, mlr->mlr_fndoffset), &bn, &dirclust, &blsize); if (error) goto err_norollback; - clusoffset = ddep->de_fndoffset; + clusoffset = mlr->mlr_fndoffset; if (dirclust != MSDOSFSROOT) clusoffset &= pmp->pm_crbomask; if ((error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, @@ -619,14 +621,14 @@ createde(struct denode *dep, struct deno /* * Now write the Win95 long name */ - if (ddep->de_fndcnt > 0) { + if (mlr->mlr_fndcnt > 0) { u_int8_t chksum = winChksum(ndep->deName); const u_char *un = (const u_char *)cnp->cn_nameptr; int unlen = cnp->cn_namelen; u_long xhavecnt; - fndoffset = ddep->de_fndoffset; - xhavecnt = ddep->de_fndcnt + 1; + fndoffset = mlr->mlr_fndoffset; + xhavecnt = mlr->mlr_fndcnt + 1; for(; wcnt < xhavecnt; wcnt++) { if ((fndoffset & pmp->pm_crbomask) == 0) { @@ -705,7 +707,7 @@ createde(struct denode *dep, struct deno * can't just call removede(), since directory is not in * consistent state. */ - fndoffset = ddep->de_fndoffset; + fndoffset = mlr->mlr_fndoffset; rberror = pcbmap(ddep, de_cluster(pmp, fndoffset), &bn, NULL, &blsize); if (rberror) @@ -716,7 +718,7 @@ createde(struct denode *dep, struct deno } ndep = bptoep(pmp, bp, clusoffset); - havecnt = ddep->de_fndcnt + 1; + havecnt = mlr->mlr_fndcnt + 1; for(i = wcnt; i <= havecnt; i++) { /* mark entry as deleted */ ndep->deName[0] = SLOT_DELETED; @@ -985,9 +987,11 @@ readde(struct denode *dep, struct buf ** * msdosfs_reclaim() which will remove the denode from the denode cache. */ int -removede(struct denode *pdep, struct denode *dep) +removede(struct denode *pdep, struct denode *dep, + const struct msdosfs_lookup_results *mlr) /* pdep: directory where the entry is removed */ /* dep: file to be removed */ + /* mlr: position of dep in pdep from lookup */ { int error; struct direntry *ep; @@ -995,7 +999,7 @@ removede(struct denode *pdep, struct den daddr_t bn; int blsize; struct msdosfsmount *pmp = pdep->de_pmp; - u_long offset = pdep->de_fndoffset; + u_long offset = mlr->mlr_fndoffset; #ifdef _KERNEL int async = pdep->de_pmp->pm_mountp->mnt_flag & MNT_ASYNC; #else @@ -1039,7 +1043,7 @@ removede(struct denode *pdep, struct den * entry in this block is a longfilename entry, too. */ if (ep->deAttributes != ATTR_WIN95 - && offset != pdep->de_fndoffset) { + && offset != mlr->mlr_fndoffset) { brelse(bp, 0); break; } Index: src/sys/fs/msdosfs/msdosfs_vnops.c diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.107 src/sys/fs/msdosfs/msdosfs_vnops.c:1.108 --- src/sys/fs/msdosfs/msdosfs_vnops.c:1.107 Wed Oct 20 03:08:17 2021 +++ src/sys/fs/msdosfs/msdosfs_vnops.c Sat Oct 23 07:38:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.107 2021/10/20 03:08:17 thorpej Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.108 2021/10/23 07:38:33 hannken Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.107 2021/10/20 03:08:17 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.108 2021/10/23 07:38:33 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -125,7 +125,7 @@ msdosfs_create(void *v) * change size. */ if (pdep->de_StartCluster == MSDOSFSROOT - && pdep->de_fndoffset >= pdep->de_FileSize) { + && pdep->de_crap.mlr_fndoffset >= pdep->de_FileSize) { error = ENOSPC; goto bad; } @@ -149,7 +149,7 @@ msdosfs_create(void *v) ndirent.de_pmp = pdep->de_pmp; ndirent.de_flag = DE_ACCESS | DE_CREATE | DE_UPDATE; DETIMES(&ndirent, NULL, NULL, NULL, pdep->de_pmp->pm_gmtoff); - if ((error = createde(&ndirent, pdep, &dep, cnp)) != 0) + if ((error = createde(&ndirent, pdep, &pdep->de_crap, &dep, cnp)) != 0) goto bad; *ap->a_vpp = DETOV(dep); cache_enter(ap->a_dvp, *ap->a_vpp, cnp->cn_nameptr, cnp->cn_namelen, @@ -725,7 +725,7 @@ msdosfs_remove(void *v) if (ap->a_vp->v_type == VDIR) error = EPERM; else - error = removede(ddep, dep); + error = removede(ddep, dep, &ddep->de_crap); #ifdef MSDOSFS_DEBUG printf("msdosfs_remove(), dep %p, usecount %d\n", dep, vrefcnt(ap->a_vp)); @@ -896,8 +896,8 @@ abortit: /* * Remember direntry place to use for destination */ - to_diroffset = dp->de_fndoffset; - to_count = dp->de_fndcnt; + to_diroffset = dp->de_crap.mlr_fndoffset; + to_count = dp->de_crap.mlr_fndcnt; /* * If ".." must be changed (ie the directory gets a new @@ -957,7 +957,7 @@ abortit: error = EISDIR; goto tdvpbad; } - if ((error = removede(dp, xp)) != 0) + if ((error = removede(dp, xp, &dp->de_crap)) != 0) goto tdvpbad; VN_KNOTE(tdvp, NOTE_WRITE); VN_KNOTE(tvp, NOTE_DELETE); @@ -1004,7 +1004,7 @@ abortit: VOP_UNLOCK(fdvp); xp = VTODE(fvp); zp = VTODE(fdvp); - from_diroffset = zp->de_fndoffset; + from_diroffset = zp->de_crap.mlr_fndoffset; /* * Ensure that the directory entry still exists and has not @@ -1033,17 +1033,18 @@ abortit: */ memcpy(oldname, ip->de_Name, 11); memcpy(ip->de_Name, toname, 11); /* update denode */ - dp->de_fndoffset = to_diroffset; - dp->de_fndcnt = to_count; - error = createde(ip, dp, (struct denode **)0, tcnp); + dp->de_crap.mlr_fndoffset = to_diroffset; + dp->de_crap.mlr_fndcnt = to_count; + error = createde(ip, dp, &dp->de_crap, (struct denode **)0, + tcnp); if (error) { memcpy(ip->de_Name, oldname, 11); VOP_UNLOCK(fvp); goto bad; } ip->de_refcnt++; - zp->de_fndoffset = from_diroffset; - if ((error = removede(zp, ip)) != 0) { + zp->de_crap.mlr_fndoffset = from_diroffset; + if ((error = removede(zp, ip, &zp->de_crap)) != 0) { /* XXX should really panic here, fs is corrupt */ VOP_UNLOCK(fvp); goto bad; @@ -1175,7 +1176,7 @@ msdosfs_mkdir(void *v) * change size. */ if (pdep->de_StartCluster == MSDOSFSROOT - && pdep->de_fndoffset >= pdep->de_FileSize) { + && pdep->de_crap.mlr_fndoffset >= pdep->de_FileSize) { error = ENOSPC; goto bad2; } @@ -1247,7 +1248,7 @@ msdosfs_mkdir(void *v) ndirent.de_FileSize = 0; ndirent.de_dev = pdep->de_dev; ndirent.de_devvp = pdep->de_devvp; - if ((error = createde(&ndirent, pdep, &dep, cnp)) != 0) + if ((error = createde(&ndirent, pdep, &pdep->de_crap, &dep, cnp)) != 0) goto bad; *ap->a_vpp = DETOV(dep); return (0); @@ -1301,7 +1302,7 @@ msdosfs_rmdir(void *v) * up access and eventually msdosfs_reclaim() will be called which * will remove it from the denode cache. */ - if ((error = removede(dp, ip)) != 0) + if ((error = removede(dp, ip, &dp->de_crap)) != 0) goto out; /* * This is where we decrement the link count in the parent Index: src/usr.sbin/makefs/msdos/msdosfs_vnops.c diff -u src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.19 src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.20 --- src/usr.sbin/makefs/msdos/msdosfs_vnops.c:1.19 Thu Apr 13 17:10:12 2017 +++ src/usr.sbin/makefs/msdos/msdosfs_vnops.c Sat Oct 23 07:38:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.19 2017/04/13 17:10:12 christos Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.20 2021/10/23 07:38:33 hannken Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -51,7 +51,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.19 2017/04/13 17:10:12 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.20 2021/10/23 07:38:33 hannken Exp $"); #include <sys/param.h> #include <sys/mman.h> @@ -281,8 +281,8 @@ msdosfs_findslot(struct denode *dp, stru * entry came from for whoever did * this lookup. */ - dp->de_fndoffset = diroff; - dp->de_fndcnt = 0; + dp->de_crap.mlr_fndoffset = diroff; + dp->de_crap.mlr_fndcnt = 0; return EEXIST; } @@ -323,8 +323,8 @@ notfound: * Return an indication of where the new directory * entry should be put. */ - dp->de_fndoffset = slotoffset; - dp->de_fndcnt = wincnt - 1; + dp->de_crap.mlr_fndoffset = slotoffset; + dp->de_crap.mlr_fndcnt = wincnt - 1; /* * We return with the directory locked, so that @@ -366,7 +366,7 @@ msdosfs_mkfile(const char *path, struct * change size. */ if (pdep->de_StartCluster == MSDOSFSROOT - && pdep->de_fndoffset >= pdep->de_FileSize) { + && pdep->de_crap.mlr_fndoffset >= pdep->de_FileSize) { error = ENOSPC; goto bad; } @@ -392,7 +392,7 @@ msdosfs_mkfile(const char *path, struct msdosfs_times(pmp, &ndirent, st); if ((error = msdosfs_findslot(pdep, &cn)) != 0) goto bad; - if ((error = createde(&ndirent, pdep, &dep, &cn)) != 0) + if ((error = createde(&ndirent, pdep, &pdep->de_crap, &dep, &cn)) != 0) goto bad; if ((error = msdosfs_wfile(path, dep, node)) != 0) goto bad; @@ -556,7 +556,7 @@ msdosfs_mkdire(const char *path, struct * change size. */ if (pdep->de_StartCluster == MSDOSFSROOT - && pdep->de_fndoffset >= pdep->de_FileSize) { + && pdep->de_crap.mlr_fndoffset >= pdep->de_FileSize) { error = ENOSPC; goto bad2; } @@ -633,7 +633,7 @@ msdosfs_mkdire(const char *path, struct ndirent.de_pmp = pdep->de_pmp; if ((error = msdosfs_findslot(pdep, &cn)) != 0) goto bad; - if ((error = createde(&ndirent, pdep, &dep, &cn)) != 0) + if ((error = createde(&ndirent, pdep, &pdep->de_crap, &dep, &cn)) != 0) goto bad; if ((error = msdosfs_updatede(dep)) != 0) goto bad;