Commit 76ec5e33 authored by Pavel Shilovsky's avatar Pavel Shilovsky Committed by Steve French

CIFS: Move statfs to ops struct

Signed-off-by: default avatarPavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent 983c88a4
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#ifdef CONFIG_CIFS_SMB2 #ifdef CONFIG_CIFS_SMB2
#include "smb2pdu.h" #include "smb2pdu.h"
#endif #endif
#define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */
int cifsFYI = 0; int cifsFYI = 0;
int cifsERROR = 1; int cifsERROR = 1;
...@@ -164,13 +163,12 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -164,13 +163,12 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
struct super_block *sb = dentry->d_sb; struct super_block *sb = dentry->d_sb;
struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_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; unsigned int xid;
int rc = 0;
xid = get_xid(); xid = get_xid();
buf->f_type = CIFS_MAGIC_NUMBER;
/* /*
* PATH_MAX may be too long - it would presumably be total path, * PATH_MAX may be too long - it would presumably be total path,
* but note that some servers (includinng Samba 3) have a shorter * but note that some servers (includinng Samba 3) have a shorter
...@@ -182,27 +180,8 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -182,27 +180,8 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_files = 0; /* undefined */ buf->f_files = 0; /* undefined */
buf->f_ffree = 0; /* unlimited */ buf->f_ffree = 0; /* unlimited */
/* if (server->ops->queryfs)
* We could add a second check for a QFS Unix capability bit rc = server->ops->queryfs(xid, tcon, buf);
*/
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);
free_xid(xid); free_xid(xid);
return 0; return 0;
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include "smb2pdu.h" #include "smb2pdu.h"
#endif #endif
#define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */
/* /*
* The sizes of various internal tables and strings * The sizes of various internal tables and strings
*/ */
...@@ -334,6 +336,9 @@ struct smb_version_operations { ...@@ -334,6 +336,9 @@ struct smb_version_operations {
/* send oplock break response */ /* send oplock break response */
int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *, int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
struct cifsInodeInfo *); struct cifsInodeInfo *);
/* query remote filesystem */
int (*queryfs)(const unsigned int, struct cifs_tcon *,
struct kstatfs *);
}; };
struct smb_version_values { struct smb_version_values {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/vfs.h>
#include "cifsglob.h" #include "cifsglob.h"
#include "cifsproto.h" #include "cifsproto.h"
#include "cifs_debug.h" #include "cifs_debug.h"
...@@ -872,6 +873,38 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid, ...@@ -872,6 +873,38 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
cinode->clientCanCacheRead ? 1 : 0); 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 = { struct smb_version_operations smb1_operations = {
.send_cancel = send_nt_cancel, .send_cancel = send_nt_cancel,
.compare_fids = cifs_compare_fids, .compare_fids = cifs_compare_fids,
...@@ -932,6 +965,7 @@ struct smb_version_operations smb1_operations = { ...@@ -932,6 +965,7 @@ struct smb_version_operations smb1_operations = {
.close_dir = cifs_close_dir, .close_dir = cifs_close_dir,
.calc_smb_size = smbCalcSize, .calc_smb_size = smbCalcSize,
.oplock_response = cifs_oplock_response, .oplock_response = cifs_oplock_response,
.queryfs = cifs_queryfs,
}; };
struct smb_version_values smb1_values = { struct smb_version_values smb1_values = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment