Commit 0b0e0b5f authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
  [CIFS] report rename failure when target file is locked by Windows
  [CIFS] Allow null user connections
  [CIFS] Fix readdir breakage when blocksize set too small
parents 895663cd 8e87d4dc
Version 1.46 Version 1.46
------------ ------------
Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps. Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps.
Allow null user to be specified on mount ("username="). Do not return
EINVAL on readdir when filldir fails due to overwritten blocksize
(fixes FC problem). Return error in rename 2nd attempt retry (ie report
if rename by handle also fails, after rename by path fails, we were
not reporting whether the retry worked or not).
Version 1.45 Version 1.45
------------ ------------
......
...@@ -822,10 +822,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -822,10 +822,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else if (strnicmp(data, "nouser_xattr",12) == 0) { } else if (strnicmp(data, "nouser_xattr",12) == 0) {
vol->no_xattr = 1; vol->no_xattr = 1;
} else if (strnicmp(data, "user", 4) == 0) { } else if (strnicmp(data, "user", 4) == 0) {
if (!value || !*value) { if (!value) {
printk(KERN_WARNING printk(KERN_WARNING
"CIFS: invalid or missing username\n"); "CIFS: invalid or missing username\n");
return 1; /* needs_arg; */ return 1; /* needs_arg; */
} else if(!*value) {
/* null user, ie anonymous, authentication */
vol->nullauth = 1;
} }
if (strnlen(value, 200) < 200) { if (strnlen(value, 200) < 200) {
vol->username = value; vol->username = value;
...@@ -1642,6 +1645,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1642,6 +1645,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* BB fixme parse for domain name here */ /* BB fixme parse for domain name here */
cFYI(1, ("Username: %s ", volume_info.username)); cFYI(1, ("Username: %s ", volume_info.username));
} else if (volume_info.nullauth) {
cFYI(1,("null user"));
} else { } else {
cifserror("No username specified"); cifserror("No username specified");
/* In userspace mount helper we can get user name from alternate /* In userspace mount helper we can get user name from alternate
......
...@@ -885,10 +885,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, ...@@ -885,10 +885,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
if (info_buf_source != NULL) { if (info_buf_source != NULL) {
info_buf_target = info_buf_source + 1; info_buf_target = info_buf_source + 1;
rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, if (pTcon->ses->capabilities & CAP_UNIX)
info_buf_source, cifs_sb_source->local_nls, rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName,
cifs_sb_source->mnt_cifs_flags & info_buf_source,
CIFS_MOUNT_MAP_SPECIAL_CHR); cifs_sb_source->local_nls,
cifs_sb_source->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
/* else rc is still EEXIST so will fall through to
unlink the target and retry rename */
if (rc == 0) { if (rc == 0) {
rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName,
info_buf_target, info_buf_target,
...@@ -937,7 +941,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, ...@@ -937,7 +941,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
cifs_sb_source->mnt_cifs_flags & cifs_sb_source->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
if (rc==0) { if (rc==0) {
CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, rc = CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName,
cifs_sb_source->local_nls, cifs_sb_source->local_nls,
cifs_sb_source->mnt_cifs_flags & cifs_sb_source->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
......
...@@ -896,6 +896,10 @@ static int cifs_filldir(char *pfindEntry, struct file *file, ...@@ -896,6 +896,10 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
tmp_inode->i_ino,obj_type); tmp_inode->i_ino,obj_type);
if(rc) { if(rc) {
cFYI(1,("filldir rc = %d",rc)); cFYI(1,("filldir rc = %d",rc));
/* we can not return filldir errors to the caller
since they are "normal" when the stat blocksize
is too small - we return remapped error instead */
rc = -EOVERFLOW;
} }
dput(tmp_dentry); dput(tmp_dentry);
...@@ -1074,6 +1078,11 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) ...@@ -1074,6 +1078,11 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
we want to check for that here? */ we want to check for that here? */
rc = cifs_filldir(current_entry, file, rc = cifs_filldir(current_entry, file,
filldir, direntry, tmp_buf, max_len); filldir, direntry, tmp_buf, max_len);
if(rc == -EOVERFLOW) {
rc = 0;
break;
}
file->f_pos++; file->f_pos++;
if(file->f_pos == if(file->f_pos ==
cifsFile->srch_inf.index_of_last_entry) { cifsFile->srch_inf.index_of_last_entry) {
......
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