diff options
author | kib <kib@FreeBSD.org> | 2010-04-02 14:03:01 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-04-02 14:03:01 +0000 |
commit | 86c35b90b77323913c46c2542f163e5102676b8c (patch) | |
tree | ec8d0023a72bda7c769835052bff384653dd6e65 | |
parent | e8a282c847cf81961f24d89e4a4d2f6116aa0bd9 (diff) | |
download | FreeBSD-src-86c35b90b77323913c46c2542f163e5102676b8c.zip FreeBSD-src-86c35b90b77323913c46c2542f163e5102676b8c.tar.gz |
Add function vop_rename_fail(9) that performs needed cleanup for locks
and references of the VOP_RENAME(9) arguments. Use vop_rename_fail()
in deadfs_rename().
Tested by: Mikolaj Golub
MFC after: 1 week
-rw-r--r-- | sys/fs/deadfs/dead_vnops.c | 10 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 14 | ||||
-rw-r--r-- | sys/sys/vnode.h | 2 |
3 files changed, 18 insertions, 8 deletions
diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c index 7a07b38..e255654 100644 --- a/sys/fs/deadfs/dead_vnops.c +++ b/sys/fs/deadfs/dead_vnops.c @@ -225,13 +225,7 @@ dead_rename(ap) struct componentname *a_tcnp; } */ *ap; { - if (ap->a_tvp) - vput(ap->a_tvp); - if (ap->a_tdvp == ap->a_tvp) - vrele(ap->a_tdvp); - else - vput(ap->a_tdvp); - vrele(ap->a_fdvp); - vrele(ap->a_fvp); + + vop_rename_fail(ap); return (EXDEV); } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index daaa5b1..9d4b3a9 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -3751,6 +3751,20 @@ assert_vop_slocked(struct vnode *vp, const char *str) #endif /* DEBUG_VFS_LOCKS */ void +vop_rename_fail(struct vop_rename_args *ap) +{ + + if (ap->a_tvp != NULL) + vput(ap->a_tvp); + if (ap->a_tdvp == ap->a_tvp) + vrele(ap->a_tdvp); + else + vput(ap->a_tdvp); + vrele(ap->a_fdvp); + vrele(ap->a_fvp); +} + +void vop_rename_pre(void *ap) { struct vop_rename_args *a = ap; diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 4c84ea3..b5784e4 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -720,6 +720,8 @@ void vop_symlink_post(void *a, int rc); void vop_unlock_post(void *a, int rc); void vop_unlock_pre(void *a); +void vop_rename_fail(struct vop_rename_args *ap); + #define VOP_WRITE_PRE(ap) \ struct vattr va; \ int error, osize, ooffset, noffset; \ |