Fix incomplete __mntput locking
authorAl Viro <viro@ZenIV.linux.org.uk>
Mon, 16 Feb 2009 02:38:12 +0000 (02:38 +0000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 17 Feb 2009 22:02:08 +0000 (14:02 -0800)
commit1a88b5364b535edaa321d70a566e358390ff0872
tree41c557358a595de85ba8a7a7697901ff21d1de1a
parentd2f8d7ee1a9b4650b4e43325b321801264f7c37a
Fix incomplete __mntput locking

Getting this wrong caused

WARNING: at fs/namespace.c:636 mntput_no_expire+0xac/0xf2()

due to optimistically checking cpu_writer->mnt outside the spinlock.

Here's what we really want:
 * we know that nobody will set cpu_writer->mnt to mnt from now on
 * all changes to that sucker are done under cpu_writer->lock
 * we want the laziest equivalent of
spin_lock(&cpu_writer->lock);
if (likely(cpu_writer->mnt != mnt)) {
spin_unlock(&cpu_writer->lock);
continue;
}
/* do stuff */
  that would make sure we won't miss earlier setting of ->mnt done by
  another CPU.

Anyway, for now we just move the spin_lock() earlier and move the test
into the properly locked region.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Reported-and-tested-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/namespace.c