git: ae7e8a02e6e9 - main - msdosfs deget(): add locking flags argument
Konstantin Belousov
kib at FreeBSD.org
Fri Aug 27 15:39:56 UTC 2021
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=ae7e8a02e6e93455e026036132c4d053b2c12ad9
commit ae7e8a02e6e93455e026036132c4d053b2c12ad9
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-08-01 17:53:12 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-08-27 15:39:45 +0000
msdosfs deget(): add locking flags argument
LK_EXCLUSIVE must be passed always, some consumers need the ability to
specify LK_NOWAIT
Reviewed by: mckusick
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D31464
---
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 f133f3f90cd6..80ebf250febf 100644
--- a/sys/fs/msdosfs/denode.h
+++ b/sys/fs/msdosfs/denode.h
@@ -275,7 +275,7 @@ int msdosfs_lookup_ino(struct vnode *vdp, struct vnode **vpp,
* Internal service routine prototypes.
*/
struct componentname;
-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 369533067ce9..d97e61f7932c 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);
@@ -171,7 +174,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 48c305824793..3fbd867275d2 100644
--- a/usr.sbin/makefs/msdos/msdosfs_denode.c
+++ b/usr.sbin/makefs/msdos/msdosfs_denode.c
@@ -84,7 +84,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 a4db6ae1a4a2..fb2f4deceaf2 100644
--- a/usr.sbin/makefs/msdos/msdosfs_lookup.c
+++ b/usr.sbin/makefs/msdos/msdosfs_lookup.c
@@ -187,7 +187,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 dd933bb2be61..508e044ac1ca 100644
--- a/usr.sbin/makefs/msdos/msdosfs_vfsops.c
+++ b/usr.sbin/makefs/msdos/msdosfs_vfsops.c
@@ -349,7 +349,7 @@ msdosfs_root(struct msdosfsmount *pmp, struct m_vnode *vp) {
int error;
*vp = *(struct m_vnode *)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;
}
More information about the dev-commits-src-all
mailing list