NFSv4 cannot unmount ESTALE directories (in some cases).

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If you use NFSv4 to "mount server:/foo/bar /mnt", then "rm -r" /foo/bar on the
server, then accesses to /mnt will naturally return ESTALE.

Unfortunately "umount /mnt" will also return ESTALE and leave the stale
directory mounted.  Adding "-l" or "-f" to "umount" doesn't help.

The problem is that nfs_lookup_revalidate fails.  As the mountpoint is never
not accessed by a lookup (after the initial mount) it seems a bit pointless
calling d_revalidate in this case ... by maybe not.

I can make the problem go away by testing for LOOKUP_JUMP and having
nfs_lookup_revalidate never fail if that flag it set (for a directory).

The resulting patch is:
---
 fs/nfs/dir.c |    7 +++++++
 1 file changed, 7 insertions(+)

--- linux-3.0-SLE11-SP2.orig/fs/nfs/dir.c
+++ linux-3.0-SLE11-SP2/fs/nfs/dir.c
@@ -1183,6 +1183,13 @@ out_zap_parent:
 			goto out_valid;
 		if (dentry->d_flags & DCACHE_DISCONNECTED)
 			goto out_valid;
+		if (flags & LOOKUP_JUMPED)
+			/* Didn't use a name to get here, so saying
+			 * the name is invalid is pointless.
+			 * This allows "umount" to succeed on a
+			 * STALE mountpoint.
+			 */
+			goto out_valid;
 		shrink_dcache_parent(dentry);
 	}
 	d_drop(dentry);


However I cannot easily tell if this is an elegant solution of an ugly hack,
and am hoping that someone who understands revalidation and LOOKUP_JUMPED
better than I (who only discovered the latter today) could provide advice.

Al?  Trond?  Should  I make this into a formal patch submission, or is there
a better way?

Thanks,
NeilBrown

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux