summaryrefslogtreecommitdiff
path: root/fs/cifs/cifsfs.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-03-27 13:52:49 -0400
committerDavid S. Miller <davem@davemloft.net>2013-03-27 13:52:49 -0400
commite2a553dbf18a5177fdebe29495c32a8e7fd3a4db (patch)
tree5ccb3d498325a7aaf93f49549eca03cb7861ca1c /fs/cifs/cifsfs.c
parent7559d97993ae7d552c96313155286f372cf4cf7c (diff)
parenta8c45289f215e137825bf9630d0abb41c1dc41ff (diff)
downloadolio-linux-3.10-e2a553dbf18a5177fdebe29495c32a8e7fd3a4db.tar.xz
olio-linux-3.10-e2a553dbf18a5177fdebe29495c32a8e7fd3a4db.zip
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: include/net/ipip.h The changes made to ipip.h in 'net' were already included in 'net-next' before that header was moved to another location. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/cifs/cifsfs.c')
-rw-r--r--fs/cifs/cifsfs.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 3cf8a15af91..345fc89c428 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -91,6 +91,30 @@ struct workqueue_struct *cifsiod_wq;
__u8 cifs_client_guid[SMB2_CLIENT_GUID_SIZE];
#endif
+/*
+ * Bumps refcount for cifs super block.
+ * Note that it should be only called if a referece to VFS super block is
+ * already held, e.g. in open-type syscalls context. Otherwise it can race with
+ * atomic_dec_and_test in deactivate_locked_super.
+ */
+void
+cifs_sb_active(struct super_block *sb)
+{
+ struct cifs_sb_info *server = CIFS_SB(sb);
+
+ if (atomic_inc_return(&server->active) == 1)
+ atomic_inc(&sb->s_active);
+}
+
+void
+cifs_sb_deactive(struct super_block *sb)
+{
+ struct cifs_sb_info *server = CIFS_SB(sb);
+
+ if (atomic_dec_and_test(&server->active))
+ deactivate_super(sb);
+}
+
static int
cifs_read_super(struct super_block *sb)
{