Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Sep 2021 01:09:00 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 7b81dd6f3d6d - stable/13 - msdosfs deget(): add locking flags argument
Message-ID:  <202109030109.183190g5004754@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=7b81dd6f3d6df9ad40b46cdbc8b0a46e911a326d

commit 7b81dd6f3d6df9ad40b46cdbc8b0a46e911a326d
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-08-01 17:53:12 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-09-03 01:08:35 +0000

    msdosfs deget(): add locking flags argument
    
    (cherry picked from commit ae7e8a02e6e93455e026036132c4d053b2c12ad9)
---
 sys/fs/msdosfs/denode.h                |  2 +-
 sys/fs/msdosfs/msdosfs_denode.c        | 13 ++++++++-----
 sys/fs/msdosfs/msdosfs_lookup.c        | 15 +++++++++------
 sys/fs/msdosfs/msdosfs_vfsops.c        |  5 +++--
 usr.sbin/makefs/msdos/msdosfs_denode.c |  2 +-
 usr.sbin/makefs/msdos/msdosfs_lookup.c |  2 +-
 usr.sbin/makefs/msdos/msdosfs_vfsops.c |  2 +-
 7 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/sys/fs/msdosfs/denode.h b/sys/fs/msdosfs/denode.h
index e179bcfa7dd5..fae05749bede 100644
--- a/sys/fs/msdosfs/denode.h
+++ b/sys/fs/msdosfs/denode.h
@@ -273,7 +273,7 @@ int msdosfs_lookup_ino(struct vnode *vdp, struct vnode **vpp,
 /*
  * Internal service routine prototypes.
  */
-int deget(struct msdosfsmount *, u_long, u_long, struct denode **);
+int deget(struct msdosfsmount *, u_long, u_long, int, struct denode **);
 int uniqdosname(struct denode *, struct componentname *, u_char *);
 
 int readep(struct msdosfsmount *pmp, u_long dirclu, u_long dirofs,  struct buf **bpp, struct direntry **epp);
diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c
index 158b3cdda4da..9573a85490f0 100644
--- a/sys/fs/msdosfs/msdosfs_denode.c
+++ b/sys/fs/msdosfs/msdosfs_denode.c
@@ -92,11 +92,12 @@ de_vncmpf(struct vnode *vp, void *arg)
  *	       diroffset is relative to the beginning of the root directory,
  *	       otherwise it is cluster relative.
  * diroffset - offset past begin of cluster of denode we want
+ * lkflags   - locking flags (LK_NOWAIT)
  * depp	     - returns the address of the gotten denode.
  */
 int
 deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset,
-    struct denode **depp)
+    int lkflags, struct denode **depp)
 {
 	int error;
 	uint64_t inode;
@@ -107,9 +108,11 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset,
 	struct buf *bp;
 
 #ifdef MSDOSFS_DEBUG
-	printf("deget(pmp %p, dirclust %lu, diroffset %lx, depp %p)\n",
-	    pmp, dirclust, diroffset, depp);
+	printf("deget(pmp %p, dirclust %lu, diroffset %lx, flags %#x, "
+	    "depp %p)\n",
+	    pmp, dirclust, diroffset, flags, depp);
 #endif
+	MPASS((lkflags & LK_TYPE_MASK) == LK_EXCLUSIVE);
 
 	/*
 	 * On FAT32 filesystems, root is a (more or less) normal
@@ -133,7 +136,7 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset,
 	 */
 	inode = (uint64_t)pmp->pm_bpcluster * dirclust + diroffset;
 
-	error = vfs_hash_get(mntp, inode, LK_EXCLUSIVE, curthread, &nvp,
+	error = vfs_hash_get(mntp, inode, lkflags, curthread, &nvp,
 	    de_vncmpf, &inode);
 	if (error)
 		return (error);
@@ -170,7 +173,7 @@ deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset,
 		*depp = NULL;
 		return (error);
 	}
-	error = vfs_hash_insert(nvp, inode, LK_EXCLUSIVE, curthread, &xvp,
+	error = vfs_hash_insert(nvp, inode, lkflags, curthread, &xvp,
 	    de_vncmpf, &inode);
 	if (error) {
 		*depp = NULL;
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index bdfff7bf3206..d47f2969904b 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -86,7 +86,8 @@ msdosfs_deget_dotdot(struct mount *mp, void *arg, int lkflags,
 
 	pmp = VFSTOMSDOSFS(mp);
 	dd_arg = arg;
-	error = deget(pmp, dd_arg->cluster, dd_arg->blkoff,  &rdp);
+	error = deget(pmp, dd_arg->cluster, dd_arg->blkoff,
+	    LK_EXCLUSIVE, &rdp);
 	if (error == 0)
 		*rvp = DETOV(rdp);
 	return (error);
@@ -495,7 +496,7 @@ foundroot:
 			*vpp = vdp;
 			return (0);
 		}
-		error = deget(pmp, cluster, blkoff, &tdp);
+		error = deget(pmp, cluster, blkoff, LK_EXCLUSIVE, &tdp);
 		if (error)
 			return (error);
 		*vpp = DETOV(tdp);
@@ -523,7 +524,8 @@ foundroot:
 		if (dp->de_StartCluster == scn && isadir)
 			return (EISDIR);
 
-		if ((error = deget(pmp, cluster, blkoff, &tdp)) != 0)
+		if ((error = deget(pmp, cluster, blkoff, LK_EXCLUSIVE,
+		    &tdp)) != 0)
 			return (error);
 		*vpp = DETOV(tdp);
 		cnp->cn_flags |= SAVENAME;
@@ -569,7 +571,8 @@ foundroot:
 		VREF(vdp);	/* we want ourself, ie "." */
 		*vpp = vdp;
 	} else {
-		if ((error = deget(pmp, cluster, blkoff, &tdp)) != 0)
+		if ((error = deget(pmp, cluster, blkoff, LK_EXCLUSIVE,
+		    &tdp)) != 0)
 			return (error);
 		*vpp = DETOV(tdp);
 	}
@@ -708,7 +711,7 @@ createde(struct denode *dep, struct denode *ddep, struct denode **depp,
 			else
 				diroffset = 0;
 		}
-		return deget(pmp, dirclust, diroffset, depp);
+		return (deget(pmp, dirclust, diroffset, LK_EXCLUSIVE, depp));
 	}
 
 	return 0;
@@ -862,7 +865,7 @@ doscheckpath(struct denode *source, struct denode *target)
 		brelse(bp);
 		bp = NULL;
 		/* NOTE: deget() clears dep on error */
-		if ((error = deget(pmp, scn, 0, &dep)) != 0)
+		if ((error = deget(pmp, scn, 0, LK_EXCLUSIVE, &dep)) != 0)
 			break;
 	}
 out:;
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index 187463cc7f4d..68c8a93a18af 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -847,7 +847,7 @@ msdosfs_root(struct mount *mp, int flags, struct vnode **vpp)
 #ifdef MSDOSFS_DEBUG
 	printf("msdosfs_root(); mp %p, pmp %p\n", mp, pmp);
 #endif
-	error = deget(pmp, MSDOSFSROOT, MSDOSFSROOT_OFS, &ndep);
+	error = deget(pmp, MSDOSFSROOT, MSDOSFSROOT_OFS, LK_EXCLUSIVE, &ndep);
 	if (error)
 		return (error);
 	*vpp = DETOV(ndep);
@@ -988,7 +988,8 @@ msdosfs_fhtovp(struct mount *mp, struct fid *fhp, int flags, struct vnode **vpp)
 	struct denode *dep;
 	int error;
 
-	error = deget(pmp, defhp->defid_dirclust, defhp->defid_dirofs, &dep);
+	error = deget(pmp, defhp->defid_dirclust, defhp->defid_dirofs,
+	    LK_EXCLUSIVE, &dep);
 	if (error) {
 		*vpp = NULLVP;
 		return (error);
diff --git a/usr.sbin/makefs/msdos/msdosfs_denode.c b/usr.sbin/makefs/msdos/msdosfs_denode.c
index 283ef2e83e0b..7d37c7df3a3d 100644
--- a/usr.sbin/makefs/msdos/msdosfs_denode.c
+++ b/usr.sbin/makefs/msdos/msdosfs_denode.c
@@ -87,7 +87,7 @@ __FBSDID("$FreeBSD$");
  */
 int
 deget(struct msdosfsmount *pmp, u_long dirclust, u_long diroffset,
-    struct denode **depp)
+    int lkflags __unused, struct denode **depp)
 {
 	int error;
 	uint64_t inode;
diff --git a/usr.sbin/makefs/msdos/msdosfs_lookup.c b/usr.sbin/makefs/msdos/msdosfs_lookup.c
index 27ce216a488f..dd6acb7ee37c 100644
--- a/usr.sbin/makefs/msdos/msdosfs_lookup.c
+++ b/usr.sbin/makefs/msdos/msdosfs_lookup.c
@@ -188,7 +188,7 @@ createde(struct denode *dep, struct denode *ddep, struct denode **depp,
 			else
 				diroffset = 0;
 		}
-		return deget(pmp, dirclust, diroffset, depp);
+		return deget(pmp, dirclust, diroffset, 0, depp);
 	}
 
 	return 0;
diff --git a/usr.sbin/makefs/msdos/msdosfs_vfsops.c b/usr.sbin/makefs/msdos/msdosfs_vfsops.c
index 07fc91cccd4a..4a5c658b7949 100644
--- a/usr.sbin/makefs/msdos/msdosfs_vfsops.c
+++ b/usr.sbin/makefs/msdos/msdosfs_vfsops.c
@@ -353,7 +353,7 @@ msdosfs_root(struct msdosfsmount *pmp, struct vnode *vp) {
 	int error;
 
 	*vp = *pmp->pm_devvp;
-	if ((error = deget(pmp, MSDOSFSROOT, MSDOSFSROOT_OFS, &ndep)) != 0) {
+	if ((error = deget(pmp, MSDOSFSROOT, MSDOSFSROOT_OFS, 0, &ndep)) != 0) {
 		errno = error;
 		return -1;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109030109.183190g5004754>