summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2015-12-16 17:01:15 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2015-12-16 17:01:15 +0000
commit218f153e09d377617516c74f9fec2c45d029acab (patch)
treebdd6f60eddc8848ee79befec282e7285271cafa9 /usr/src
parentee7a338786277b45cdb678fa003662b33db5ba29 (diff)
downloadillumos-joyent-218f153e09d377617516c74f9fec2c45d029acab.tar.gz
OS-5040 code review cleanup for vnode pre-rename events
Reviewed by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/pcfs/pc_dir.c51
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_fem.c2
-rw-r--r--usr/src/uts/common/fs/tmpfs/tmp_vnops.c22
-rw-r--r--usr/src/uts/common/fs/udfs/udf_vnops.c20
-rw-r--r--usr/src/uts/common/fs/ufs/ufs_vnops.c11
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_vnops.c8
-rw-r--r--usr/src/uts/common/sys/vnode.h2
7 files changed, 70 insertions, 46 deletions
diff --git a/usr/src/uts/common/fs/pcfs/pc_dir.c b/usr/src/uts/common/fs/pcfs/pc_dir.c
index aa78b8587e..c28c9c6345 100644
--- a/usr/src/uts/common/fs/pcfs/pc_dir.c
+++ b/usr/src/uts/common/fs/pcfs/pc_dir.c
@@ -25,7 +25,7 @@
*/
/*
- * Copyright (c) 2014, Joyent, Inc. All rights reserved.
+ * Copyright 2015, Joyent, Inc.
*/
#include <sys/param.h>
@@ -564,7 +564,7 @@ pc_rename(
caller_context_t *ctp)
{
struct pcnode *pcp; /* pcnode we are trying to rename */
- struct pcnode *tpcp; /* pcnode that's in our way */
+ struct pcnode *tpcp = NULL; /* pcnode that's in our way */
struct pcslot slot;
int error;
struct vnode *vp = PCTOV(dp);
@@ -646,7 +646,6 @@ top:
brelse(slot.sl_bp);
vnevent_pre_rename_dest(PCTOV(tpcp), PCTOV(tdp), tnm, ctp);
- VN_RELE(PCTOV(tpcp));
/*
* Error cases (from rename(2)):
@@ -662,6 +661,8 @@ top:
error = pc_dirremove(tdp, tnm,
(struct vnode *)NULL, VREG, ctp);
if (error == 0) {
+ VN_RELE(PCTOV(tpcp));
+ tpcp = NULL;
VN_RELE(PCTOV(pcp));
goto top;
}
@@ -671,6 +672,8 @@ top:
error = pc_dirremove(tdp, tnm,
(struct vnode *)NULL, VDIR, ctp);
if (error == 0) {
+ VN_RELE(PCTOV(tpcp));
+ tpcp = NULL;
VN_RELE(PCTOV(pcp));
goto top;
}
@@ -714,8 +717,8 @@ top:
brelse(slot.sl_bp);
ndirentries = direntries_needed(tdp, tnm);
if (ndirentries == -1) {
- VN_RELE(PCTOV(pcp));
- return (EINVAL);
+ error = EINVAL;
+ goto done;
}
/*
* first see if we have enough space to create the new
@@ -723,14 +726,13 @@ top:
*/
offset = pc_find_free_space(tdp, ndirentries);
if (offset == -1) {
- VN_RELE(PCTOV(pcp));
- return (ENOSPC);
+ error = ENOSPC;
+ goto done;
}
error = pc_findentry(dp, snm, &slot, &lfn_offset);
if (error) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
pct_lo = slot.sl_ep->pcd_scluster_lo;
if (IS_FAT32(fsp))
@@ -749,9 +751,8 @@ top:
brelse(slot.sl_bp);
error = pc_remove_long_fn(dp, lfn_offset);
if (error) {
- VN_RELE(PCTOV(pcp));
pc_mark_irrecov(VFSTOPCFS(vp->v_vfsp));
- return (error);
+ goto done;
}
} else {
slot.sl_ep->pcd_filename[0] =
@@ -761,9 +762,9 @@ top:
brelse(slot.sl_bp);
}
if (error) {
- VN_RELE(PCTOV(pcp));
pc_mark_irrecov(VFSTOPCFS(vp->v_vfsp));
- return (EIO);
+ error = EIO;
+ goto done;
}
/*
@@ -771,8 +772,7 @@ top:
*/
direntries = pc_name_to_pcdir(tdp, tnm, ndirentries, &error);
if (direntries == NULL) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
if (dp != tdp)
@@ -784,16 +784,14 @@ top:
offset);
kmem_free(direntries, ndirentries * sizeof (struct pcdir));
if (error) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
/* advance to short name */
offset += (ndirentries - 1) * sizeof (struct pcdir);
boff = pc_blkoff(fsp, offset);
error = pc_blkatoff(tdp, offset, &bp, &ep);
if (error) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
blkno = pc_daddrdb(fsp, bp->b_blkno);
ep->pcd_scluster_lo = pct_lo;
@@ -816,28 +814,31 @@ top:
pcp->pc_flags |= PC_CHG;
brelse(bp);
if (error) {
- VN_RELE(PCTOV(pcp));
pc_mark_irrecov(VFSTOPCFS(vp->v_vfsp));
- return (EIO);
+ error = EIO;
+ goto done;
}
/* No need to fix ".." if we're renaming within a dir */
if (oldisdir && dp != tdp) {
if ((error = pc_dirfixdotdot(pcp, dp, tdp)) != 0) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
}
if ((error = pc_nodeupdate(pcp)) != 0) {
- VN_RELE(PCTOV(pcp));
- return (error);
+ goto done;
}
}
if (error == 0) {
+ if (tpcp != NULL)
+ vnevent_rename_dest(PCTOV(tpcp), PCTOV(tdp), tnm, ctp);
vnevent_rename_src(PCTOV(pcp), PCTOV(dp), snm, ctp);
vnevent_rename_dest_dir(PCTOV(tdp), PCTOV(pcp), tnm, ctp);
}
+done:
+ if (tpcp != NULL)
+ VN_RELE(PCTOV(tpcp));
VN_RELE(PCTOV(pcp));
return (error);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_fem.c b/usr/src/uts/common/fs/smbsrv/smb_fem.c
index 0a35a5cee4..896863f254 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_fem.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_fem.c
@@ -573,11 +573,13 @@ smb_fem_oplock_vnevent(
if (ct != &smb_ct) {
switch (vnevent) {
case VE_REMOVE:
+ case VE_PRE_RENAME_DEST:
case VE_RENAME_DEST:
flags = SMB_OPLOCK_BREAK_TO_NONE |
SMB_OPLOCK_BREAK_BATCH;
rc = smb_fem_oplock_break(arg, ct, flags);
break;
+ case VE_PRE_RENAME_SRC:
case VE_RENAME_SRC:
flags = SMB_OPLOCK_BREAK_TO_LEVEL_II |
SMB_OPLOCK_BREAK_BATCH;
diff --git a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c
index 47b91865b8..20d39ad008 100644
--- a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c
+++ b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c
@@ -1195,8 +1195,9 @@ tmp_rename(
struct tmpnode *fromparent;
struct tmpnode *toparent;
struct tmpnode *fromtp = NULL; /* source tmpnode */
+ struct tmpnode *totp = NULL; /* target tmpnode */
struct tmount *tm = (struct tmount *)VTOTM(odvp);
- int error, err;
+ int error;
int samedir = 0; /* set if odvp == ndvp */
struct vnode *realvp;
@@ -1253,6 +1254,14 @@ tmp_rename(
goto done;
}
+ if (tdirlookup(toparent, nnm, &totp, cred) == 0)
+ vnevent_pre_rename_dest(TNTOV(totp), ndvp, nnm, ct);
+
+ /* Notify the target dir. if not the same as the source dir. */
+ if (ndvp != odvp) {
+ vnevent_pre_rename_dest_dir(ndvp, TNTOV(fromtp), nnm, ct);
+ }
+
/*
* Link source to new target
*/
@@ -1274,10 +1283,6 @@ tmp_rename(
}
vnevent_pre_rename_src(TNTOV(fromtp), odvp, onm, ct);
- /* Notify the target dir. if not the same as the source dir. */
- if (ndvp != odvp) {
- vnevent_pre_rename_dest_dir(ndvp, TNTOV(fromtp), nnm, ct);
- }
/*
* Unlink from source.
@@ -1285,7 +1290,7 @@ tmp_rename(
rw_enter(&fromparent->tn_rwlock, RW_WRITER);
rw_enter(&fromtp->tn_rwlock, RW_WRITER);
- error = err = tdirdelete(fromparent, fromtp, onm, DR_RENAME, cred);
+ error = tdirdelete(fromparent, fromtp, onm, DR_RENAME, cred);
/*
* The following handles the case where our source tmpnode was
@@ -1301,13 +1306,16 @@ tmp_rename(
rw_exit(&fromtp->tn_rwlock);
rw_exit(&fromparent->tn_rwlock);
- if (err == 0) {
+ if (error == 0) {
vnevent_rename_src(TNTOV(fromtp), odvp, onm, ct);
+ /* vnevent_rename_dest event emitted in tdirenter(). */
vnevent_rename_dest_dir(ndvp, TNTOV(fromtp), nnm, ct);
}
done:
tmpnode_rele(fromtp);
+ if (totp != NULL)
+ tmpnode_rele(totp);
mutex_exit(&tm->tm_renamelck);
TRACE_5(TR_FAC_TMPFS, TR_TMPFS_RENAME,
diff --git a/usr/src/uts/common/fs/udfs/udf_vnops.c b/usr/src/uts/common/fs/udfs/udf_vnops.c
index 7650016f26..1463eac31c 100644
--- a/usr/src/uts/common/fs/udfs/udf_vnops.c
+++ b/usr/src/uts/common/fs/udfs/udf_vnops.c
@@ -911,9 +911,10 @@ udf_rename(
caller_context_t *ct,
int flags)
{
- int32_t error = 0, err;
+ int32_t error = 0;
struct udf_vfs *udf_vfsp;
struct ud_inode *sip; /* source inode */
+ struct ud_inode *tip = NULL; /* target inode */
struct ud_inode *sdp, *tdp; /* source and target parent inode */
struct vnode *realvp;
@@ -974,6 +975,14 @@ udf_rename(
rw_exit(&sdp->i_contents);
goto errout;
}
+
+ if (ud_dirlook(tdp, tnm, &tip, cr, 0) == 0)
+ vnevent_pre_rename_dest(ITOV(tip), tdvp, tnm, ct);
+
+ /* Notify the target dir. if not the same as the source dir. */
+ if (sdvp != tdvp)
+ vnevent_pre_rename_dest_dir(tdvp, ITOV(sip), tnm, ct);
+
rw_exit(&sip->i_contents);
rw_exit(&sdp->i_contents);
@@ -1006,19 +1015,24 @@ udf_rename(
* If the entry has changed just forget about it. Release
* the source inode.
*/
- if ((error = err = ud_dirremove(sdp, snm, sip, (struct vnode *)0,
+ if ((error = ud_dirremove(sdp, snm, sip, (struct vnode *)0,
DR_RENAME, cr, ct)) == ENOENT) {
error = 0;
}
rw_exit(&sdp->i_rwlock);
- if (err == 0)
+ if (error == 0) {
vnevent_rename_src(ITOV(sip), sdvp, snm, ct);
+ /* vnevent_rename_dest event emitted in ud_direnter() */
+ vnevent_rename_dest_dir(tdvp, ITOV(sip), tnm, ct);
+ }
errout:
ITIMES(sdp);
ITIMES(tdp);
VN_RELE(ITOV(sip));
+ if (tip != NULL)
+ VN_RELE(ITOV(tip));
mutex_exit(&udf_vfsp->udf_rename_lck);
return (error);
diff --git a/usr/src/uts/common/fs/ufs/ufs_vnops.c b/usr/src/uts/common/fs/ufs/ufs_vnops.c
index bbc67acf83..a6729ee8cc 100644
--- a/usr/src/uts/common/fs/ufs/ufs_vnops.c
+++ b/usr/src/uts/common/fs/ufs/ufs_vnops.c
@@ -3710,9 +3710,6 @@ retry_firstlock:
goto errout;
}
- if (terr == 0 && tvp != NULL)
- vnevent_rename_dest(tvp, tdvp, tnm, ct);
-
/*
* Unlink the source.
* Remove the source entry. ufs_dirremove() checks that the entry
@@ -3724,8 +3721,12 @@ retry_firstlock:
DR_RENAME, cr)) == ENOENT)
error = 0;
- vnevent_rename_src(ITOV(sip), sdvp, snm, ct);
- vnevent_rename_dest_dir(tdvp, ITOV(sip), tnm, ct);
+ if (error == 0) {
+ vnevent_rename_src(ITOV(sip), sdvp, snm, ct);
+ if (tvp != NULL)
+ vnevent_rename_dest(tvp, tdvp, tnm, ct);
+ vnevent_rename_dest_dir(tdvp, ITOV(sip), tnm, ct);
+ }
errout:
if (slot.fbp)
diff --git a/usr/src/uts/common/fs/zfs/zfs_vnops.c b/usr/src/uts/common/fs/zfs/zfs_vnops.c
index b55c2aec45..95630d9a9c 100644
--- a/usr/src/uts/common/fs/zfs/zfs_vnops.c
+++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c
@@ -3716,12 +3716,8 @@ top:
return (error);
}
- if (tzp) {
- /* Attempt to remove the existing target */
+ if (tzp) /* Attempt to remove the existing target */
error = zfs_link_destroy(tdl, tzp, tx, zflg, NULL);
- if (error == 0)
- vnevent_rename_dest(ZTOV(tzp), tdvp, tnm, ct);
- }
if (error == 0) {
error = zfs_link_create(tdl, szp, tx, ZRENAMING);
@@ -3766,6 +3762,8 @@ top:
if (error == 0) {
vnevent_rename_src(ZTOV(szp), sdvp, snm, ct);
+ if (tzp)
+ vnevent_rename_dest(ZTOV(tzp), tdvp, tnm, ct);
vnevent_rename_dest_dir(tdvp, ZTOV(szp), tnm, ct);
}
out:
diff --git a/usr/src/uts/common/sys/vnode.h b/usr/src/uts/common/sys/vnode.h
index 9bcff72268..987db9d8bb 100644
--- a/usr/src/uts/common/sys/vnode.h
+++ b/usr/src/uts/common/sys/vnode.h
@@ -1309,7 +1309,7 @@ void vnevent_pre_rename_src(vnode_t *, vnode_t *, char *,
void vnevent_pre_rename_dest(vnode_t *, vnode_t *, char *,
caller_context_t *);
void vnevent_pre_rename_dest_dir(vnode_t *, vnode_t *, char *,
- caller_context_t *ct);
+ caller_context_t *);
/* Vnode specific data */
void vsd_create(uint_t *, void (*)(void *));