[XFS] Invalidate dentry in unlink/rmdir if in case-insensitive mode
authorBarry Naujok <bnaujok@sgi.com>
Mon, 16 Jun 2008 02:07:41 +0000 (12:07 +1000)
committerNiv Sardi <xaiki@debian.org>
Mon, 28 Jul 2008 06:58:47 +0000 (16:58 +1000)
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: Barry Naujok <bnaujok@sgi.com>
Signed-off-by: Christoph Hellwig <hch@infradead.org>
fs/xfs/linux-2.6/xfs_iops.c

index 62330f2..190ed61 100644 (file)
@@ -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;
 }