Commit 666d039e authored by Konstantin Baev's avatar Konstantin Baev

update sources/2.6.28

- source: cifs-2.6.git - refspec: v2.6.28-etercifs - commit: 9f132d1445a5a338b651b1db27b37aed3e7479e6 merge with new kernel minor version (v2.6.28.1)
parent 40ef4650
...@@ -122,7 +122,7 @@ static char *compose_mount_options(const char *sb_mountdata, ...@@ -122,7 +122,7 @@ static char *compose_mount_options(const char *sb_mountdata,
char **devname) char **devname)
{ {
int rc; int rc;
char *mountdata; char *mountdata = NULL;
int md_len; int md_len;
char *tkn_e; char *tkn_e;
char *srvIP = NULL; char *srvIP = NULL;
...@@ -136,10 +136,9 @@ static char *compose_mount_options(const char *sb_mountdata, ...@@ -136,10 +136,9 @@ static char *compose_mount_options(const char *sb_mountdata,
*devname = cifs_get_share_name(ref->node_name); *devname = cifs_get_share_name(ref->node_name);
rc = dns_resolve_server_name_to_ip(*devname, &srvIP); rc = dns_resolve_server_name_to_ip(*devname, &srvIP);
if (rc != 0) { if (rc != 0) {
cERROR(1, ("%s: Failed to resolve server part of %s to IP", cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d",
__func__, *devname)); __func__, *devname, rc));;
mountdata = ERR_PTR(rc); goto compose_mount_options_err;
goto compose_mount_options_out;
} }
/* md_len = strlen(...) + 12 for 'sep+prefixpath=' /* md_len = strlen(...) + 12 for 'sep+prefixpath='
* assuming that we have 'unc=' and 'ip=' in * assuming that we have 'unc=' and 'ip=' in
...@@ -149,8 +148,8 @@ static char *compose_mount_options(const char *sb_mountdata, ...@@ -149,8 +148,8 @@ static char *compose_mount_options(const char *sb_mountdata,
strlen(ref->node_name) + 12; strlen(ref->node_name) + 12;
mountdata = kzalloc(md_len+1, GFP_KERNEL); mountdata = kzalloc(md_len+1, GFP_KERNEL);
if (mountdata == NULL) { if (mountdata == NULL) {
mountdata = ERR_PTR(-ENOMEM); rc = -ENOMEM;
goto compose_mount_options_out; goto compose_mount_options_err;
} }
/* copy all options except of unc,ip,prefixpath */ /* copy all options except of unc,ip,prefixpath */
...@@ -197,18 +196,32 @@ static char *compose_mount_options(const char *sb_mountdata, ...@@ -197,18 +196,32 @@ static char *compose_mount_options(const char *sb_mountdata,
/* find & copy prefixpath */ /* find & copy prefixpath */
tkn_e = strchr(ref->node_name + 2, '\\'); tkn_e = strchr(ref->node_name + 2, '\\');
if (tkn_e == NULL) /* invalid unc, missing share name*/ if (tkn_e == NULL) {
goto compose_mount_options_out; /* invalid unc, missing share name*/
rc = -EINVAL;
goto compose_mount_options_err;
}
/*
* this function gives us a path with a double backslash prefix. We
* require a single backslash for DFS. Temporarily increment fullpath
* to put it in the proper form and decrement before freeing it.
*/
fullpath = build_path_from_dentry(dentry); fullpath = build_path_from_dentry(dentry);
if (!fullpath) {
rc = -ENOMEM;
goto compose_mount_options_err;
}
++fullpath;
tkn_e = strchr(tkn_e + 1, '\\'); tkn_e = strchr(tkn_e + 1, '\\');
if (tkn_e || strlen(fullpath) - (ref->path_consumed)) { if (tkn_e || (strlen(fullpath) - ref->path_consumed)) {
strncat(mountdata, &sep, 1); strncat(mountdata, &sep, 1);
strcat(mountdata, "prefixpath="); strcat(mountdata, "prefixpath=");
if (tkn_e) if (tkn_e)
strcat(mountdata, tkn_e + 1); strcat(mountdata, tkn_e + 1);
strcat(mountdata, fullpath + (ref->path_consumed)); strcat(mountdata, fullpath + ref->path_consumed);
} }
--fullpath;
kfree(fullpath); kfree(fullpath);
/*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/ /*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/
...@@ -217,6 +230,11 @@ static char *compose_mount_options(const char *sb_mountdata, ...@@ -217,6 +230,11 @@ static char *compose_mount_options(const char *sb_mountdata,
compose_mount_options_out: compose_mount_options_out:
kfree(srvIP); kfree(srvIP);
return mountdata; return mountdata;
compose_mount_options_err:
kfree(mountdata);
mountdata = ERR_PTR(rc);
goto compose_mount_options_out;
} }
...@@ -309,13 +327,19 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) ...@@ -309,13 +327,19 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
goto out_err; goto out_err;
} }
/*
* The MSDFS spec states that paths in DFS referral requests and
* responses must be prefixed by a single '\' character instead of
* the double backslashes usually used in the UNC. This function
* gives us the latter, so we must adjust the result.
*/
full_path = build_path_from_dentry(dentry); full_path = build_path_from_dentry(dentry);
if (full_path == NULL) { if (full_path == NULL) {
rc = -ENOMEM; rc = -ENOMEM;
goto out_err; goto out_err;
} }
rc = get_dfs_path(xid, ses , full_path, cifs_sb->local_nls, rc = get_dfs_path(xid, ses , full_path + 1, cifs_sb->local_nls,
&num_referrals, &referrals, &num_referrals, &referrals,
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
......
...@@ -2084,7 +2084,7 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping, ...@@ -2084,7 +2084,7 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping,
cFYI(1, ("write_begin from %lld len %d", (long long)pos, len)); cFYI(1, ("write_begin from %lld len %d", (long long)pos, len));
page = __grab_cache_page(mapping, index); page = grab_cache_page_write_begin(mapping, index, flags);
if (!page) { if (!page) {
rc = -ENOMEM; rc = -ENOMEM;
goto out; goto out;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment