Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx> --- fs/cifs/connect.c | 35 ++++++++++++++++++++++++++++++----- fs/cifs/inode.c | 16 +++++++++++++--- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 60c63b6..9015009 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -100,6 +100,9 @@ cifs_reconnect(struct TCP_Server_Info *server) server->tcpStatus = CifsNeedReconnect; spin_unlock(&GlobalMid_Lock); server->maxBuf = 0; +#ifdef CONFIG_CIFS_SMB2 + server->max_read = 0; +#endif cFYI(1, "Reconnecting tcp session"); @@ -314,7 +317,14 @@ cifs_echo_request(struct work_struct *work) time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ)) goto requeue_echo; - rc = CIFSSMBEcho(server); +#ifdef CONFIG_CIFS_SMB2 + if (server->is_smb2) + /* temporarilly disable echo requests for SMB2 */ + rc = 0; + else +#endif + rc = CIFSSMBEcho(server); + if (rc) cFYI(1, "Unable to send echo request to server: %s", server->hostname); @@ -2347,7 +2357,7 @@ cifs_put_tcon(struct cifs_tcon *tcon) static struct cifs_tcon * cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info) { - int rc, xid; + int rc = 0, xid; struct cifs_tcon *tcon; tcon = cifs_find_tcon(ses, volume_info->UNC); @@ -2549,6 +2559,12 @@ get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path, char *temp_unc; int rc = 0; +#ifdef CONFIG_CIFS_SMB2 + if (pSesInfo->server->is_smb2) { + /* add missing smb2 dfs code here */ + return -EREMOTE; + } +#endif *pnum_referrals = 0; *preferrals = NULL; @@ -3444,10 +3460,18 @@ try_mount_again: tcon->unix_ext = 0; /* server does not support them */ /* do not care if following two calls succeed - informational */ - if (!tcon->ipc) { - CIFSSMBQFSDeviceInfo(xid, tcon); - CIFSSMBQFSAttributeInfo(xid, tcon); +#ifdef CONFIG_CIFS_SMB2 + if (tcon->ses->server->is_smb2) { + /* add missing calls here */ + } else { +#endif + if (!tcon->ipc) { + CIFSSMBQFSDeviceInfo(xid, tcon); + CIFSSMBQFSAttributeInfo(xid, tcon); + } +#ifdef CONFIG_CIFS_SMB2 } +#endif cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info); cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info); @@ -3760,6 +3784,7 @@ int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses) return 0; /* we have one credit to start with */ atomic_set(&server->credits, 1); + server->current_smb2_mid = 0; rc = SMB2_negotiate(xid, ses); /* BB we probably don't need to retry with modern servers */ if (rc == -EAGAIN) diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index b086633..8ea171f 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -775,12 +775,22 @@ char *cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb, /* if no prefix path, simply set path to the root of share to "" */ if (pplen == 0) { - full_path = kmalloc(1, GFP_KERNEL); - if (full_path) - full_path[0] = 0; + int len = 1; +#ifdef CONFIG_CIFS_SMB2 + if (vol->use_smb2) + len = 2; +#endif + full_path = kzalloc(len, GFP_KERNEL); return full_path; } +#ifdef CONFIG_CIFS_SMB2 + if (vol->use_smb2) { + cERROR(1, "prefixpath is not supported for smb2 now"); + return NULL; + } +#endif + if (tcon->Flags & SMB_SHARE_IS_IN_DFS) dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1); else -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html