CIFS: Move statfs to ops struct
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
983c88a497
commit
76ec5e3384
3 changed files with 43 additions and 25 deletions
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Reference in a new issue