Fixed parsing of mount options when doing DFS submount
Since these hit the same routines, and are relatively small, it is easier to review them as one patch. Fixed incorrect handling of the last option in some cases Fixed prefixpath handling convert path_consumed into host depended string length (in bytes) Use non default separator if it is provided in the original mount options Acked-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Igor Mammedov <niallain@gmail.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
committed by
Steve French
parent
ab3f992983
commit
2c55608f28
@@ -3899,6 +3899,27 @@ GetInodeNumOut:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* computes length of UCS string converted to host codepage
|
||||
* @src: UCS string
|
||||
* @maxlen: length of the input string in UCS characters
|
||||
* (not in bytes)
|
||||
*
|
||||
* return: size of input string in host codepage
|
||||
*/
|
||||
static int hostlen_fromUCS(const __le16 *src, const int maxlen,
|
||||
const struct nls_table *nls_codepage) {
|
||||
int i;
|
||||
int hostlen = 0;
|
||||
char to[4];
|
||||
int charlen;
|
||||
for (i = 0; (i < maxlen) && src[i]; ++i) {
|
||||
charlen = nls_codepage->uni2char(le16_to_cpu(src[i]),
|
||||
to, NLS_MAX_CHARSET_SIZE);
|
||||
hostlen += charlen > 0 ? charlen : 1;
|
||||
}
|
||||
return hostlen;
|
||||
}
|
||||
|
||||
/* parses DFS refferal V3 structure
|
||||
* caller is responsible for freeing target_nodes
|
||||
* returns:
|
||||
@@ -3909,7 +3930,8 @@ static int
|
||||
parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
|
||||
unsigned int *num_of_nodes,
|
||||
struct dfs_info3_param **target_nodes,
|
||||
const struct nls_table *nls_codepage)
|
||||
const struct nls_table *nls_codepage, int remap,
|
||||
const char *searchName)
|
||||
{
|
||||
int i, rc = 0;
|
||||
char *data_end;
|
||||
@@ -3960,7 +3982,17 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
|
||||
struct dfs_info3_param *node = (*target_nodes)+i;
|
||||
|
||||
node->flags = le16_to_cpu(pSMBr->DFSFlags);
|
||||
node->path_consumed = le16_to_cpu(pSMBr->PathConsumed);
|
||||
if (is_unicode) {
|
||||
__le16 *tmp = kmalloc(strlen(searchName)*2, GFP_KERNEL);
|
||||
cifsConvertToUCS((__le16 *) tmp, searchName,
|
||||
PATH_MAX, nls_codepage, remap);
|
||||
node->path_consumed = hostlen_fromUCS(tmp,
|
||||
le16_to_cpu(pSMBr->PathConsumed)/2,
|
||||
nls_codepage);
|
||||
kfree(tmp);
|
||||
} else
|
||||
node->path_consumed = le16_to_cpu(pSMBr->PathConsumed);
|
||||
|
||||
node->server_type = le16_to_cpu(ref->ServerType);
|
||||
node->ref_flag = le16_to_cpu(ref->ReferralEntryFlags);
|
||||
|
||||
@@ -4093,7 +4125,8 @@ getDFSRetry:
|
||||
|
||||
/* parse returned result into more usable form */
|
||||
rc = parse_DFS_referrals(pSMBr, num_of_nodes,
|
||||
target_nodes, nls_codepage);
|
||||
target_nodes, nls_codepage, remap,
|
||||
searchName);
|
||||
|
||||
GetDFSRefExit:
|
||||
cifs_buf_release(pSMB);
|
||||
|
Reference in New Issue
Block a user