Skip to content

Commit

Permalink
CIFS: Move informational tcon calls to ops struct
Browse files Browse the repository at this point in the history
and rename variables in cifs_mount.

Signed-off-by: Pavel Shilovsky <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
piastry committed Jul 24, 2012
1 parent b669f33 commit af4281d
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 27 deletions.
2 changes: 2 additions & 0 deletions fs/cifs/cifsglob.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
51 changes: 24 additions & 27 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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++;
Expand All @@ -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);
Expand All @@ -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);
}

Expand Down
8 changes: 8 additions & 0 deletions fs/cifs/smb1ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 = {
Expand Down

0 comments on commit af4281d

Please sign in to comment.