From: Brian Behlendorf Date: Thu, 17 Feb 2011 19:26:51 +0000 (-0800) Subject: Fix symlink(2) inode reference count X-Git-Tag: zfs-0.6.0-rc1~1^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=efd1832bc615a4e32259e31d1c7ff0af14f5c1b2;p=zfs Fix symlink(2) inode reference count Under Linux sys_symlink(2) should result in a inode being created with one reference for the inode itself, and a second reference on the inode which is held by the new dentry. Under Solaris this appears not to be the case. Their zfs_symlink() handler drops the inode reference before returning. The result of this under Linux is that the reference count for symlinks is always one smaller than it should have been. This results in a BUG() when the symlink is unlinked. To handle this the Linux port now keeps the inode reference which differs from the Solaris behavior. This results in correct reference counts. Closes #96 --- diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 8bff0ef4b..fcc85b8a0 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -3169,7 +3169,6 @@ top: zfs_dirent_unlock(dl); *ipp = ZTOI(zp); - iput(ZTOI(zp)); if (zsb->z_os->os_sync == ZFS_SYNC_ALWAYS) zil_commit(zilog, 0);