cifs: don't use vfsmount to pin superblock for oplock breaks
authorJeff Layton <jlayton@redhat.com>
Mon, 11 Oct 2010 19:07:19 +0000 (15:07 -0400)
committerSteve French <sfrench@us.ibm.com>
Tue, 12 Oct 2010 18:08:01 +0000 (18:08 +0000)
commitd7c86ff8cd00abc730fe5d031f43dc9138b6324e
treea1f264ce2f33e3ac77a459291b9a5e45a63e3bff
parenta5e18bc36e9e05ce0338d370a2ce4290910e43ea
cifs: don't use vfsmount to pin superblock for oplock breaks

Filesystems aren't really supposed to do anything with a vfsmount. It's
considered a layering violation since vfsmounts are entirely managed at
the VFS layer.

CIFS currently keeps an active reference to a vfsmount in order to
prevent the superblock vanishing before an oplock break has completed.
What we really want to do instead is to keep sb->s_active high until the
oplock break has completed. This patch borrows the scheme that NFS uses
for handling sillyrenames.

An atomic_t is added to the cifs_sb_info. When it transitions from 0 to
1, an extra reference to the superblock is taken (by bumping the
s_active value). When it transitions from 1 to 0, that reference is
dropped and a the superblock teardown may proceed if there are no more
references to it.

Also, the vfsmount pointer is removed from cifsFileInfo and from
cifs_new_fileinfo, and some bogus forward declarations are removed from
cifsfs.h.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: Suresh Jayaraman <sjayaraman@suse.de>
Acked-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifs_fs_sb.h
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/cifs/cifsglob.h
fs/cifs/cifsproto.h
fs/cifs/dir.c
fs/cifs/file.c