diff options
author | Marcel Telka <[email protected]> | 2016-01-13 15:35:55 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-01-15 15:38:35 -0800 |
commit | 812e91a7e3abe59565462e4bb2a01724afddb042 (patch) | |
tree | c2dbb60a2d3dc2822459ce3190961e6d6493db44 | |
parent | 82f6f6e654a51b47f9f2d642197852ced80487ee (diff) |
Illumos 4039 - zfs_rename()/zfs_link() needs stronger test for XDEV
4039 zfs_rename()/zfs_link() needs stronger test for XDEV
Reviewed by: Gordon Ross <[email protected]>
Reviewed by: Kevin Crowe <[email protected]>
Reviewed by: Saso Kiselkov <[email protected]>
Reviewed by: Matthew Ahrens <[email protected]>
Approved by: Dan McDonald <[email protected]>
References:
https://www.illumos.org/issues/4039
https://github.com/illumos/illumos-gate/commit/18e6497
Porting notes:
- This check was updated in Linux in a similar fashion early on in
the port. Therefore, this patch just reorders the function and
updates the comment so it flows the same way as the upstream code.
Ported-by: Brian Behlendorf <[email protected]>
Closes #4218
-rw-r--r-- | module/zfs/zfs_vnops.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 64412a69d..311613ae5 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -3207,13 +3207,18 @@ zfs_rename(struct inode *sdip, char *snm, struct inode *tdip, char *tnm, ZFS_VERIFY_ZP(sdzp); zilog = zsb->z_log; + tdzp = ITOZ(tdip); + ZFS_VERIFY_ZP(tdzp); + + /* + * We check i_sb because snapshots and the ctldir must have different + * super blocks. + */ if (tdip->i_sb != sdip->i_sb || zfsctl_is_node(tdip)) { ZFS_EXIT(zsb); return (SET_ERROR(EXDEV)); } - tdzp = ITOZ(tdip); - ZFS_VERIFY_ZP(tdzp); if (zsb->z_utf8 && u8_validate(tnm, strlen(tnm), NULL, U8_VALIDATE_ENTIRE, &error) < 0) { ZFS_EXIT(zsb); @@ -3751,14 +3756,18 @@ zfs_link(struct inode *tdip, struct inode *sip, char *name, cred_t *cr) return (SET_ERROR(EPERM)); } + szp = ITOZ(sip); + ZFS_VERIFY_ZP(szp); + + /* + * We check i_sb because snapshots and the ctldir must have different + * super blocks. + */ if (sip->i_sb != tdip->i_sb || zfsctl_is_node(sip)) { ZFS_EXIT(zsb); return (SET_ERROR(EXDEV)); } - szp = ITOZ(sip); - ZFS_VERIFY_ZP(szp); - /* Prevent links to .zfs/shares files */ if ((error = sa_lookup(szp->z_sa_hdl, SA_ZPL_PARENT(zsb), |