Loading fs/cifs/cifsglob.h +2 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,8 @@ struct smb_version_operations { int (*get_dfs_refer)(const unsigned int, struct cifs_ses *, const char *, struct dfs_info3_param **, unsigned int *, const struct nls_table *, int); /* informational QFS call */ void (*qfs_tcon)(const unsigned int, struct cifs_tcon *); }; struct smb_version_values { Loading fs/cifs/connect.c +24 −27 Original line number Diff line number Diff line Loading @@ -3600,9 +3600,9 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) { int rc; unsigned int xid; struct cifs_ses *pSesInfo; struct cifs_ses *ses; struct cifs_tcon *tcon; struct TCP_Server_Info *srvTcp; struct TCP_Server_Info *server; char *full_path; struct tcon_link *tlink; #ifdef CONFIG_CIFS_DFS_UPCALL Loading @@ -3619,39 +3619,39 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) if (referral_walks_count) { if (tcon) cifs_put_tcon(tcon); else if (pSesInfo) cifs_put_smb_ses(pSesInfo); else if (ses) cifs_put_smb_ses(ses); free_xid(xid); } #endif rc = 0; tcon = NULL; pSesInfo = NULL; srvTcp = NULL; ses = NULL; server = NULL; full_path = NULL; tlink = NULL; xid = get_xid(); /* get a reference to a tcp session */ srvTcp = cifs_get_tcp_session(volume_info); if (IS_ERR(srvTcp)) { rc = PTR_ERR(srvTcp); server = cifs_get_tcp_session(volume_info); if (IS_ERR(server)) { rc = PTR_ERR(server); bdi_destroy(&cifs_sb->bdi); goto out; } /* get a reference to a SMB session */ pSesInfo = cifs_get_smb_ses(srvTcp, volume_info); if (IS_ERR(pSesInfo)) { rc = PTR_ERR(pSesInfo); pSesInfo = NULL; ses = cifs_get_smb_ses(server, volume_info); if (IS_ERR(ses)) { rc = PTR_ERR(ses); ses = NULL; goto mount_fail_check; } /* search for existing tcon to this server share */ tcon = cifs_get_tcon(pSesInfo, volume_info); tcon = cifs_get_tcon(ses, volume_info); if (IS_ERR(tcon)) { rc = PTR_ERR(tcon); tcon = NULL; Loading @@ -3672,11 +3672,9 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) } else 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); } /* do not care if a following call succeed - informational */ if (!tcon->ipc && server->ops->qfs_tcon) server->ops->qfs_tcon(xid, tcon); cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info); cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info); Loading @@ -3694,8 +3692,8 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) * Chase the referral if found, otherwise continue normally. */ if (referral_walks_count == 0) { int refrc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb, false); int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, false); if (!refrc) { referral_walks_count++; goto try_mount_again; Loading Loading @@ -3733,8 +3731,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) goto mount_fail_check; } rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb, true); rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true); if (!rc) { referral_walks_count++; Loading @@ -3756,7 +3753,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) goto mount_fail_check; } tlink->tl_uid = pSesInfo->linux_uid; tlink->tl_uid = ses->linux_uid; tlink->tl_tcon = tcon; tlink->tl_time = jiffies; set_bit(TCON_LINK_MASTER, &tlink->tl_flags); Loading @@ -3777,10 +3774,10 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) /* up accidentally freeing someone elses tcon struct */ if (tcon) cifs_put_tcon(tcon); else if (pSesInfo) cifs_put_smb_ses(pSesInfo); else if (ses) cifs_put_smb_ses(ses); else cifs_put_tcp_session(srvTcp); cifs_put_tcp_session(server); bdi_destroy(&cifs_sb->bdi); } Loading fs/cifs/smb1ops.c +8 −0 Original line number Diff line number Diff line Loading @@ -410,6 +410,13 @@ cifs_negotiate(const unsigned int xid, struct cifs_ses *ses) return rc; } static void cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) { CIFSSMBQFSDeviceInfo(xid, tcon); CIFSSMBQFSAttributeInfo(xid, tcon); } struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids, Loading @@ -435,6 +442,7 @@ struct smb_version_operations smb1_operations = { .tree_connect = CIFSTCon, .tree_disconnect = CIFSSMBTDis, .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, }; struct smb_version_values smb1_values = { Loading Loading
fs/cifs/cifsglob.h +2 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,8 @@ struct smb_version_operations { int (*get_dfs_refer)(const unsigned int, struct cifs_ses *, const char *, struct dfs_info3_param **, unsigned int *, const struct nls_table *, int); /* informational QFS call */ void (*qfs_tcon)(const unsigned int, struct cifs_tcon *); }; struct smb_version_values { Loading
fs/cifs/connect.c +24 −27 Original line number Diff line number Diff line Loading @@ -3600,9 +3600,9 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) { int rc; unsigned int xid; struct cifs_ses *pSesInfo; struct cifs_ses *ses; struct cifs_tcon *tcon; struct TCP_Server_Info *srvTcp; struct TCP_Server_Info *server; char *full_path; struct tcon_link *tlink; #ifdef CONFIG_CIFS_DFS_UPCALL Loading @@ -3619,39 +3619,39 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) if (referral_walks_count) { if (tcon) cifs_put_tcon(tcon); else if (pSesInfo) cifs_put_smb_ses(pSesInfo); else if (ses) cifs_put_smb_ses(ses); free_xid(xid); } #endif rc = 0; tcon = NULL; pSesInfo = NULL; srvTcp = NULL; ses = NULL; server = NULL; full_path = NULL; tlink = NULL; xid = get_xid(); /* get a reference to a tcp session */ srvTcp = cifs_get_tcp_session(volume_info); if (IS_ERR(srvTcp)) { rc = PTR_ERR(srvTcp); server = cifs_get_tcp_session(volume_info); if (IS_ERR(server)) { rc = PTR_ERR(server); bdi_destroy(&cifs_sb->bdi); goto out; } /* get a reference to a SMB session */ pSesInfo = cifs_get_smb_ses(srvTcp, volume_info); if (IS_ERR(pSesInfo)) { rc = PTR_ERR(pSesInfo); pSesInfo = NULL; ses = cifs_get_smb_ses(server, volume_info); if (IS_ERR(ses)) { rc = PTR_ERR(ses); ses = NULL; goto mount_fail_check; } /* search for existing tcon to this server share */ tcon = cifs_get_tcon(pSesInfo, volume_info); tcon = cifs_get_tcon(ses, volume_info); if (IS_ERR(tcon)) { rc = PTR_ERR(tcon); tcon = NULL; Loading @@ -3672,11 +3672,9 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) } else 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); } /* do not care if a following call succeed - informational */ if (!tcon->ipc && server->ops->qfs_tcon) server->ops->qfs_tcon(xid, tcon); cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info); cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info); Loading @@ -3694,8 +3692,8 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) * Chase the referral if found, otherwise continue normally. */ if (referral_walks_count == 0) { int refrc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb, false); int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, false); if (!refrc) { referral_walks_count++; goto try_mount_again; Loading Loading @@ -3733,8 +3731,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) goto mount_fail_check; } rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb, true); rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true); if (!rc) { referral_walks_count++; Loading @@ -3756,7 +3753,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) goto mount_fail_check; } tlink->tl_uid = pSesInfo->linux_uid; tlink->tl_uid = ses->linux_uid; tlink->tl_tcon = tcon; tlink->tl_time = jiffies; set_bit(TCON_LINK_MASTER, &tlink->tl_flags); Loading @@ -3777,10 +3774,10 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) /* up accidentally freeing someone elses tcon struct */ if (tcon) cifs_put_tcon(tcon); else if (pSesInfo) cifs_put_smb_ses(pSesInfo); else if (ses) cifs_put_smb_ses(ses); else cifs_put_tcp_session(srvTcp); cifs_put_tcp_session(server); bdi_destroy(&cifs_sb->bdi); } Loading
fs/cifs/smb1ops.c +8 −0 Original line number Diff line number Diff line Loading @@ -410,6 +410,13 @@ cifs_negotiate(const unsigned int xid, struct cifs_ses *ses) return rc; } static void cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) { CIFSSMBQFSDeviceInfo(xid, tcon); CIFSSMBQFSAttributeInfo(xid, tcon); } struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids, Loading @@ -435,6 +442,7 @@ struct smb_version_operations smb1_operations = { .tree_connect = CIFSTCon, .tree_disconnect = CIFSSMBTDis, .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, }; struct smb_version_values smb1_values = { Loading