CIFS: Move statfs to ops struct
authorPavel Shilovsky <pshilovsky@samba.org>
Tue, 18 Sep 2012 23:20:33 +0000 (16:20 -0700)
committerSteve French <smfrench@gmail.com>
Tue, 25 Sep 2012 02:46:30 +0000 (21:46 -0500)
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/smb1ops.c

index 2829f374dbf78e044397ded8bb931f1cf6b6dfd1..4dda4890d776152f2f7a67bc22a32724fdf5bac2 100644 (file)
@@ -51,7 +51,6 @@
 #ifdef CONFIG_CIFS_SMB2
 #include "smb2pdu.h"
 #endif
-#define CIFS_MAGIC_NUMBER 0xFF534D42   /* the first four bytes of SMB PDUs */
 
 int cifsFYI = 0;
 int cifsERROR = 1;
@@ -164,13 +163,12 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
        struct super_block *sb = dentry->d_sb;
        struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
        struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
-       int rc = -EOPNOTSUPP;
+       struct TCP_Server_Info *server = tcon->ses->server;
        unsigned int xid;
+       int rc = 0;
 
        xid = get_xid();
 
-       buf->f_type = CIFS_MAGIC_NUMBER;
-
        /*
         * PATH_MAX may be too long - it would presumably be total path,
         * but note that some servers (includinng Samba 3) have a shorter
@@ -182,27 +180,8 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_files = 0;       /* undefined */
        buf->f_ffree = 0;       /* unlimited */
 
-       /*
-        * We could add a second check for a QFS Unix capability bit
-        */
-       if ((tcon->ses->capabilities & CAP_UNIX) &&
-           (CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability)))
-               rc = CIFSSMBQFSPosixInfo(xid, tcon, buf);
-
-       /*
-        * Only need to call the old QFSInfo if failed on newer one,
-        * e.g. by OS/2.
-        **/
-       if (rc && (tcon->ses->capabilities & CAP_NT_SMBS))
-               rc = CIFSSMBQFSInfo(xid, tcon, buf);
-
-       /*
-        * Some old Windows servers also do not support level 103, retry with
-        * older level one if old server failed the previous call or we
-        * bypassed it because we detected that this was an older LANMAN sess
-        */
-       if (rc)
-               rc = SMBOldQFSInfo(xid, tcon, buf);
+       if (server->ops->queryfs)
+               rc = server->ops->queryfs(xid, tcon, buf);
 
        free_xid(xid);
        return 0;
index a95c56dc70583fda0958f169def621237e4f353a..3c007fe641f986a00311e6215a27dfa7f06e42a1 100644 (file)
@@ -32,6 +32,8 @@
 #include "smb2pdu.h"
 #endif
 
+#define CIFS_MAGIC_NUMBER 0xFF534D42      /* the first four bytes of SMB PDUs */
+
 /*
  * The sizes of various internal tables and strings
  */
@@ -334,6 +336,9 @@ struct smb_version_operations {
        /* send oplock break response */
        int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
                               struct cifsInodeInfo *);
+       /* query remote filesystem */
+       int (*queryfs)(const unsigned int, struct cifs_tcon *,
+                      struct kstatfs *);
 };
 
 struct smb_version_values {
index f55b2e3476e8329fc34a76794aebbe5b95bc7e55..f6c7a1c9a1b66bde0db601d2fc05deb59d66d76f 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <linux/pagemap.h>
+#include <linux/vfs.h>
 #include "cifsglob.h"
 #include "cifsproto.h"
 #include "cifs_debug.h"
@@ -872,6 +873,38 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
                           cinode->clientCanCacheRead ? 1 : 0);
 }
 
+static int
+cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
+            struct kstatfs *buf)
+{
+       int rc = -EOPNOTSUPP;
+
+       buf->f_type = CIFS_MAGIC_NUMBER;
+
+       /*
+        * We could add a second check for a QFS Unix capability bit
+        */
+       if ((tcon->ses->capabilities & CAP_UNIX) &&
+           (CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability)))
+               rc = CIFSSMBQFSPosixInfo(xid, tcon, buf);
+
+       /*
+        * Only need to call the old QFSInfo if failed on newer one,
+        * e.g. by OS/2.
+        **/
+       if (rc && (tcon->ses->capabilities & CAP_NT_SMBS))
+               rc = CIFSSMBQFSInfo(xid, tcon, buf);
+
+       /*
+        * Some old Windows servers also do not support level 103, retry with
+        * older level one if old server failed the previous call or we
+        * bypassed it because we detected that this was an older LANMAN sess
+        */
+       if (rc)
+               rc = SMBOldQFSInfo(xid, tcon, buf);
+       return rc;
+}
+
 struct smb_version_operations smb1_operations = {
        .send_cancel = send_nt_cancel,
        .compare_fids = cifs_compare_fids,
@@ -932,6 +965,7 @@ struct smb_version_operations smb1_operations = {
        .close_dir = cifs_close_dir,
        .calc_smb_size = smbCalcSize,
        .oplock_response = cifs_oplock_response,
+       .queryfs = cifs_queryfs,
 };
 
 struct smb_version_values smb1_values = {