diff options
| author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-12-16 17:01:15 +0000 |
|---|---|---|
| committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-12-16 17:01:15 +0000 |
| commit | 218f153e09d377617516c74f9fec2c45d029acab (patch) | |
| tree | bdd6f60eddc8848ee79befec282e7285271cafa9 /usr/src | |
| parent | ee7a338786277b45cdb678fa003662b33db5ba29 (diff) | |
| download | illumos-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.c | 51 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_fem.c | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/tmpfs/tmp_vnops.c | 22 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/udfs/udf_vnops.c | 20 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/ufs/ufs_vnops.c | 11 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/zfs/zfs_vnops.c | 8 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/vnode.h | 2 |
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 *)); |
