Commit d532506c authored by Barry Naujok's avatar Barry Naujok Committed by Niv Sardi
Browse files

[XFS] Invalidate dentry in unlink/rmdir if in case-insensitive mode



The vfs_unlink/d_delete functionality in the Linux VFS make the
dentry negative if it is the only inode being referenced. Case-insensitive
mode doesn't work with negative dentries, so if using CI-mode, invalidate
the dentry on unlink/rmdir.

SGI-PV: 983102
SGI-Modid: xfs-linux-melb:xfs-kern:31308a

Signed-off-by: default avatarBarry Naujok <bnaujok@sgi.com>
Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
parent 87affd08
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -475,6 +475,13 @@ xfs_vn_unlink(
	if (likely(!error)) {
		xfs_validate_fields(dir);	/* size needs update */
		xfs_validate_fields(inode);
		/*
		 * With unlink, the VFS makes the dentry "negative": no inode,
		 * but still hashed. This is incompatible with case-insensitive
		 * mode, so invalidate (unhash) the dentry in CI-mode.
		 */
		if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
			d_invalidate(dentry);
	}
	return -error;
}
@@ -531,6 +538,13 @@ xfs_vn_rmdir(
	if (likely(!error)) {
		xfs_validate_fields(inode);
		xfs_validate_fields(dir);
		/*
		 * With rmdir, the VFS makes the dentry "negative": no inode,
		 * but still hashed. This is incompatible with case-insensitive
		 * mode, so invalidate (unhash) the dentry in CI-mode.
		 */
		if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
			d_invalidate(dentry);
	}
	return -error;
}