Index | Thread | Search

From:
Sebastien Marie <semarie@kapouay.eu.org>
Subject:
Re: patch: vfs cleanup - VOP_REMOVE
To:
tech@openbsd.org
Date:
Mon, 13 May 2024 08:05:48 +0200

Download raw body.

Thread
Hi,

New interation on the VOP_REMOVE cleanup.

the following diff only move vnode unlocking and ref dropping to
FS-indep part.

while here, it ensures all vop_remove field are setted, and always call
the function.

the change is very conservative: it only adds vnode ref drop/unlock
where it was absent because it should be unreachable (and if it wasn't,
it should fix things).

I let the VN_KNOTE() part outside of this diff for now, as it could lead
to behaviour change. it will be addressed in a separated diff (which
could be more easily reverted).

Comments or OK ?
-- 
Sebastien Marie

diff b30de97d4acfcd79cc3c5aa8ebe33237055e4d04 refs/heads/vfs2
commit - b30de97d4acfcd79cc3c5aa8ebe33237055e4d04
commit + 32bd54f0b6349b702168bcd6fdbcbb1be5d8d085
blob - 244c781a0dd00eb4ce8152af5e97efb759e09d5e
blob + c1b80006058ee204726390881acaf4fb0e87402e
--- sys/isofs/udf/udf_vnops.c
+++ sys/isofs/udf/udf_vnops.c
@@ -84,7 +84,7 @@ const struct vops udf_vops = {
 	.vop_fsync	= NULL,
 	.vop_link	= NULL,
 	.vop_mknod	= NULL,
-	.vop_remove	= NULL,
+	.vop_remove	= eopnotsupp,
 	.vop_rename	= NULL,
 	.vop_revoke	= NULL,
 	.vop_mkdir	= NULL,
blob - 4412725a90c89e63443f543df1ef3c3bb64228d9
blob + 8cd1484d17850691bc342bfaa867c44b7d787b03
--- sys/kern/vfs_sync.c
+++ sys/kern/vfs_sync.c
@@ -238,7 +238,7 @@ const struct vops sync_vops = {
 	.vop_read	= NULL,
 	.vop_readdir	= NULL,
 	.vop_readlink	= NULL,
-	.vop_remove	= NULL,
+	.vop_remove	= eopnotsupp,
 	.vop_rename	= NULL,
 	.vop_revoke	= NULL,
 	.vop_mkdir	= NULL,
blob - 3d08b2ec5ca669aedbc2c97e592a4c50af5498bb
blob + 7c9c59b04bdc735b6abc1b9580812c9b6b28c100
--- sys/kern/vfs_vops.c
+++ sys/kern/vfs_vops.c
@@ -319,6 +319,7 @@ VOP_FSYNC(struct vnode *vp, struct ucred *cred, int wa
 int
 VOP_REMOVE(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
 {
+	int error;
 	struct vop_remove_args a;
 	a.a_dvp = dvp;
         a.a_vp = vp;
@@ -327,10 +328,15 @@ VOP_REMOVE(struct vnode *dvp, struct vnode *vp, struct
 	ASSERT_VP_ISLOCKED(dvp);
 	ASSERT_VP_ISLOCKED(vp);
 
-	if (dvp->v_op->vop_remove == NULL)
-		return (EOPNOTSUPP);
+	error = dvp->v_op->vop_remove(&a);
 
-	return ((dvp->v_op->vop_remove)(&a));
+	if (dvp == vp)
+		vrele(vp);
+	else
+		vput(vp);
+	vput(dvp);
+
+	return error;
 }
 
 int
blob - 173d70562f64dc55d3ab479d9f536316fd1b7dd9
blob + 71634d26d1751115cd7999f41db81a005cf6a0f3
--- sys/miscfs/fuse/fuse_vnops.c
+++ sys/miscfs/fuse/fuse_vnops.c
@@ -1512,11 +1512,6 @@ fusefs_remove(void *v)
 	fb_delete(fbuf);
 out:
 	pool_put(&namei_pool, cnp->cn_pnbuf);
-	if (dvp == vp)
-		vrele(vp);
-	else
-		vput(vp);
-	vput(dvp);
 	return (error);
 }
 
blob - 12d22a95ce0e71f74a7425580296492b4a705d47
blob + 8ab2d25c81ddf85f5868d121a11c5ca18df05da8
--- sys/msdosfs/msdosfs_vnops.c
+++ sys/msdosfs/msdosfs_vnops.c
@@ -810,12 +810,7 @@ msdosfs_remove(void *v)
 	printf("msdosfs_remove(), dep %p, v_usecount %d\n", dep,
 	    ap->a_vp->v_usecount);
 #endif
-	if (ddep == dep)
-		vrele(ap->a_vp);
-	else
-		vput(ap->a_vp);	/* causes msdosfs_inactive() to be called
-				 * via vrele() */
-	vput(ap->a_dvp);
+
 	return (error);
 }
 
blob - 7bb05c1f6333d819ea2846bb5054ccd3bec30589
blob + bacefd79af8a56f4a4ed018dafaa1ba13bd888d8
--- sys/nfs/nfs_vnops.c
+++ sys/nfs/nfs_vnops.c
@@ -1725,11 +1725,6 @@ nfs_remove(void *v)
 	NFS_INVALIDATE_ATTRCACHE(np);
 	VN_KNOTE(vp, NOTE_DELETE);
 	VN_KNOTE(dvp, NOTE_WRITE);
-	if (vp == dvp)
-		vrele(vp);
-	else
-		vput(vp);
-	vput(dvp);
 	return (error);
 }
 
blob - af3a9898af7aa7695be87a604ec35ba8cea24eda
blob + 04b741f9854a6905314c6d5badcdb2efac3aa5eb
--- sys/ntfs/ntfs_vnops.c
+++ sys/ntfs/ntfs_vnops.c
@@ -689,7 +689,7 @@ const struct vops ntfs_vops = {
 	.vop_link	= NULL,
 	.vop_mknod	= NULL,
 	.vop_readlink	= NULL,
-	.vop_remove	= NULL,
+	.vop_remove	= eopnotsupp,
 	.vop_rename	= NULL,
 	.vop_revoke	= NULL,
 	.vop_mkdir	= NULL,
blob - b1c68fdebba338a23f6ed36e305b6c5df930a294
blob + ae825d9606777c71d9b95ac7619e11389a2423b1
--- sys/tmpfs/tmpfs_vnops.c
+++ sys/tmpfs/tmpfs_vnops.c
@@ -692,8 +692,6 @@ tmpfs_remove(void *v)
 	tmpfs_dirent_t *de;
 	int error;
 
-	KASSERT(VOP_ISLOCKED(dvp));
-	KASSERT(VOP_ISLOCKED(vp));
 	KASSERT(cnp->cn_flags & HASBUF);
 
 	if (vp->v_type == VDIR) {
@@ -742,13 +740,6 @@ tmpfs_remove(void *v)
 	error = 0;
 out:
 	pool_put(&namei_pool, cnp->cn_pnbuf);
-	/* Drop the references and unlock the vnodes. */
-	vput(vp);
-	if (dvp == vp) {
-		vrele(dvp);
-	} else {
-		vput(dvp);
-	}
 	return error;
 }
 
blob - 0097f2380c5cfd9c10bed12e4e3a06b9272022a6
blob + f25607dd206957ea6523be7694d6a44e8a4705e2
--- sys/ufs/ext2fs/ext2fs_vnops.c
+++ sys/ufs/ext2fs/ext2fs_vnops.c
@@ -410,11 +410,6 @@ ext2fs_remove(void *v)
 		ip->i_flag |= IN_CHANGE;
 	}
 out:
-	if (dvp == vp)
-		vrele(vp);
-	else
-		vput(vp);
-	vput(dvp);
 	return (error);
 }
 
blob - d329284990703d35b484e26d2d59af1a6ac9df73
blob + ce54a340bcbc345c9b2c37d654846209a8f62afe
--- sys/ufs/ufs/ufs_vnops.c
+++ sys/ufs/ufs/ufs_vnops.c
@@ -595,11 +595,6 @@ ufs_remove(void *v)
 	VN_KNOTE(vp, NOTE_DELETE);
 	VN_KNOTE(dvp, NOTE_WRITE);
  out:
-	if (dvp == vp)
-		vrele(vp);
-	else
-		vput(vp);
-	vput(dvp);
 	return (error);
 }