diff options
-rw-r--r-- | fs/cifs/CHANGES | 8 | ||||
-rw-r--r-- | fs/cifs/README | 7 | ||||
-rw-r--r-- | fs/cifs/cifs_fs_sb.h | 2 | ||||
-rw-r--r-- | fs/cifs/cifsfs.h | 2 | ||||
-rw-r--r-- | fs/cifs/connect.c | 14 | ||||
-rw-r--r-- | fs/cifs/inode.c | 4 | ||||
-rw-r--r-- | fs/cifs/readdir.c | 10 |
7 files changed, 39 insertions, 8 deletions
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 3196d4c4eed3..b0429ea524fb 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -1,3 +1,11 @@ | |||
1 | Version 1.36 | ||
2 | ------------ | ||
3 | Add mount option for disabling the default behavior of sending byte range lock | ||
4 | requests to the server (necessary for certain applications which break with | ||
5 | mandatory lock behavior such as Evolution), and also mount option for | ||
6 | requesting case insensitive matching for path based requests (requesting | ||
7 | case sensitive is the default). | ||
8 | |||
1 | Version 1.35 | 9 | Version 1.35 |
2 | ------------ | 10 | ------------ |
3 | Add writepage performance improvements. Fix path name conversions | 11 | Add writepage performance improvements. Fix path name conversions |
diff --git a/fs/cifs/README b/fs/cifs/README index 34b0cf7111f3..3b610d08dc1e 100644 --- a/fs/cifs/README +++ b/fs/cifs/README | |||
@@ -407,6 +407,13 @@ A partial list of the supported mount options follows: | |||
407 | This has no effect if the server does not support | 407 | This has no effect if the server does not support |
408 | Unicode on the wire. | 408 | Unicode on the wire. |
409 | nomapchars Do not translate any of these seven characters (default). | 409 | nomapchars Do not translate any of these seven characters (default). |
410 | nocase Request case insensitive path name matching (case | ||
411 | sensitive is the default if the server suports it). | ||
412 | nobrl Do not send byte range lock requests to the server. | ||
413 | This is necessary for certain applications that break | ||
414 | with cifs style mandatory byte range locks (and most | ||
415 | cifs servers do not yet support requesting advisory | ||
416 | byte range locks). | ||
410 | remount remount the share (often used to change from ro to rw mounts | 417 | remount remount the share (often used to change from ro to rw mounts |
411 | or vice versa) | 418 | or vice versa) |
412 | 419 | ||
diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h index 6b93587c490e..5fb695f1e50b 100644 --- a/fs/cifs/cifs_fs_sb.h +++ b/fs/cifs/cifs_fs_sb.h | |||
@@ -26,6 +26,8 @@ | |||
26 | #define CIFS_MOUNT_MAP_SPECIAL_CHR 0x20 /* remap illegal chars in filenames */ | 26 | #define CIFS_MOUNT_MAP_SPECIAL_CHR 0x20 /* remap illegal chars in filenames */ |
27 | #define CIFS_MOUNT_POSIX_PATHS 0x40 /* Negotiate posix pathnames if possible. */ | 27 | #define CIFS_MOUNT_POSIX_PATHS 0x40 /* Negotiate posix pathnames if possible. */ |
28 | #define CIFS_MOUNT_UNX_EMUL 0x80 /* Network compat with SFUnix emulation */ | 28 | #define CIFS_MOUNT_UNX_EMUL 0x80 /* Network compat with SFUnix emulation */ |
29 | #define CIFS_MOUNT_CASE_INSENS 0x100 /* Request case insenstive searches */ | ||
30 | #define CIFS_MOUNT_NO_BRL 0x200 /* No sending byte range locks to srv */ | ||
29 | 31 | ||
30 | struct cifs_sb_info { | 32 | struct cifs_sb_info { |
31 | struct cifsTconInfo *tcon; /* primary mount */ | 33 | struct cifsTconInfo *tcon; /* primary mount */ |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 78af5850c558..cf45ca359dba 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
@@ -96,5 +96,5 @@ extern ssize_t cifs_getxattr(struct dentry *, const char *, void *, size_t); | |||
96 | extern ssize_t cifs_listxattr(struct dentry *, char *, size_t); | 96 | extern ssize_t cifs_listxattr(struct dentry *, char *, size_t); |
97 | extern int cifs_ioctl (struct inode * inode, struct file * filep, | 97 | extern int cifs_ioctl (struct inode * inode, struct file * filep, |
98 | unsigned int command, unsigned long arg); | 98 | unsigned int command, unsigned long arg); |
99 | #define CIFS_VERSION "1.35" | 99 | #define CIFS_VERSION "1.36" |
100 | #endif /* _CIFSFS_H */ | 100 | #endif /* _CIFSFS_H */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index ef0432c44482..6b21f6aa9f60 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -79,6 +79,8 @@ struct smb_vol { | |||
79 | unsigned remap:1; /* set to remap seven reserved chars in filenames */ | 79 | unsigned remap:1; /* set to remap seven reserved chars in filenames */ |
80 | unsigned posix_paths:1; /* unset to not ask for posix pathnames. */ | 80 | unsigned posix_paths:1; /* unset to not ask for posix pathnames. */ |
81 | unsigned sfu_emul:1; | 81 | unsigned sfu_emul:1; |
82 | unsigned nocase; /* request case insensitive filenames */ | ||
83 | unsigned nobrl; /* disable sending byte range locks to srv */ | ||
82 | unsigned int rsize; | 84 | unsigned int rsize; |
83 | unsigned int wsize; | 85 | unsigned int wsize; |
84 | unsigned int sockopt; | 86 | unsigned int sockopt; |
@@ -1040,6 +1042,12 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) | |||
1040 | vol->posix_paths = 1; | 1042 | vol->posix_paths = 1; |
1041 | } else if (strnicmp(data, "noposixpaths", 12) == 0) { | 1043 | } else if (strnicmp(data, "noposixpaths", 12) == 0) { |
1042 | vol->posix_paths = 0; | 1044 | vol->posix_paths = 0; |
1045 | } else if (strnicmp(data, "nocase", 6) == 0) { | ||
1046 | vol->nocase = 1; | ||
1047 | } else if (strnicmp(data, "brl", 3) == 0) { | ||
1048 | vol->nobrl = 0; | ||
1049 | } else if (strnicmp(data, "nobrl", 5) == 0) { | ||
1050 | vol->nobrl = 1; | ||
1043 | } else if (strnicmp(data, "setuids", 7) == 0) { | 1051 | } else if (strnicmp(data, "setuids", 7) == 0) { |
1044 | vol->setuids = 1; | 1052 | vol->setuids = 1; |
1045 | } else if (strnicmp(data, "nosetuids", 9) == 0) { | 1053 | } else if (strnicmp(data, "nosetuids", 9) == 0) { |
@@ -1699,9 +1707,13 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1699 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR; | 1707 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR; |
1700 | if(volume_info.sfu_emul) | 1708 | if(volume_info.sfu_emul) |
1701 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL; | 1709 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL; |
1710 | if(volume_info.nocase) | ||
1711 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CASE_INSENS; | ||
1712 | if(volume_info.nobrl) | ||
1713 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL; | ||
1702 | 1714 | ||
1703 | if(volume_info.direct_io) { | 1715 | if(volume_info.direct_io) { |
1704 | cERROR(1,("mounting share using direct i/o")); | 1716 | cFYI(1,("mounting share using direct i/o")); |
1705 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; | 1717 | cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; |
1706 | } | 1718 | } |
1707 | 1719 | ||
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 628aa1a9fe64..ed3e9207d92e 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -166,6 +166,8 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
166 | inode->i_fop = &cifs_file_direct_ops; | 166 | inode->i_fop = &cifs_file_direct_ops; |
167 | else | 167 | else |
168 | inode->i_fop = &cifs_file_ops; | 168 | inode->i_fop = &cifs_file_ops; |
169 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
170 | inode->i_fop->lock = NULL; | ||
169 | inode->i_data.a_ops = &cifs_addr_ops; | 171 | inode->i_data.a_ops = &cifs_addr_ops; |
170 | } else if (S_ISDIR(inode->i_mode)) { | 172 | } else if (S_ISDIR(inode->i_mode)) { |
171 | cFYI(1, (" Directory inode")); | 173 | cFYI(1, (" Directory inode")); |
@@ -369,6 +371,8 @@ int cifs_get_inode_info(struct inode **pinode, | |||
369 | inode->i_fop = &cifs_file_direct_ops; | 371 | inode->i_fop = &cifs_file_direct_ops; |
370 | else | 372 | else |
371 | inode->i_fop = &cifs_file_ops; | 373 | inode->i_fop = &cifs_file_ops; |
374 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
375 | inode->i_fop->lock = NULL; | ||
372 | inode->i_data.a_ops = &cifs_addr_ops; | 376 | inode->i_data.a_ops = &cifs_addr_ops; |
373 | } else if (S_ISDIR(inode->i_mode)) { | 377 | } else if (S_ISDIR(inode->i_mode)) { |
374 | cFYI(1, (" Directory inode ")); | 378 | cFYI(1, (" Directory inode ")); |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index dec3c9dd04d7..ef5eb804ce82 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -194,6 +194,8 @@ static void fill_in_inode(struct inode *tmp_inode, | |||
194 | tmp_inode->i_fop = &cifs_file_direct_ops; | 194 | tmp_inode->i_fop = &cifs_file_direct_ops; |
195 | else | 195 | else |
196 | tmp_inode->i_fop = &cifs_file_ops; | 196 | tmp_inode->i_fop = &cifs_file_ops; |
197 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
198 | tmp_inode->i_fop->lock = NULL; | ||
197 | tmp_inode->i_data.a_ops = &cifs_addr_ops; | 199 | tmp_inode->i_data.a_ops = &cifs_addr_ops; |
198 | 200 | ||
199 | if(isNewInode) | 201 | if(isNewInode) |
@@ -298,6 +300,8 @@ static void unix_fill_in_inode(struct inode *tmp_inode, | |||
298 | tmp_inode->i_fop = &cifs_file_direct_ops; | 300 | tmp_inode->i_fop = &cifs_file_direct_ops; |
299 | else | 301 | else |
300 | tmp_inode->i_fop = &cifs_file_ops; | 302 | tmp_inode->i_fop = &cifs_file_ops; |
303 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
304 | tmp_inode->i_fop->lock = NULL; | ||
301 | tmp_inode->i_data.a_ops = &cifs_addr_ops; | 305 | tmp_inode->i_data.a_ops = &cifs_addr_ops; |
302 | 306 | ||
303 | if(isNewInode) | 307 | if(isNewInode) |
@@ -557,7 +561,6 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
557 | char * end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + | 561 | char * end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + |
558 | smbCalcSize((struct smb_hdr *) | 562 | smbCalcSize((struct smb_hdr *) |
559 | cifsFile->srch_inf.ntwrk_buf_start); | 563 | cifsFile->srch_inf.ntwrk_buf_start); |
560 | /* dump_cifs_file_struct(file,"found entry in fce "); */ | ||
561 | first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry | 564 | first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry |
562 | - cifsFile->srch_inf.entries_in_buffer; | 565 | - cifsFile->srch_inf.entries_in_buffer; |
563 | pos_in_buf = index_to_find - first_entry_in_buffer; | 566 | pos_in_buf = index_to_find - first_entry_in_buffer; |
@@ -595,7 +598,6 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
595 | *num_to_ret = 0; | 598 | *num_to_ret = 0; |
596 | } else | 599 | } else |
597 | *num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf; | 600 | *num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf; |
598 | /* dump_cifs_file_struct(file, "end fce ");*/ | ||
599 | 601 | ||
600 | return rc; | 602 | return rc; |
601 | } | 603 | } |
@@ -815,14 +817,12 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
815 | FreeXid(xid); | 817 | FreeXid(xid); |
816 | return -EIO; | 818 | return -EIO; |
817 | } | 819 | } |
818 | /* dump_cifs_file_struct(file, "Begin rdir "); */ | ||
819 | 820 | ||
820 | cifs_sb = CIFS_SB(file->f_dentry->d_sb); | 821 | cifs_sb = CIFS_SB(file->f_dentry->d_sb); |
821 | pTcon = cifs_sb->tcon; | 822 | pTcon = cifs_sb->tcon; |
822 | if(pTcon == NULL) | 823 | if(pTcon == NULL) |
823 | return -EINVAL; | 824 | return -EINVAL; |
824 | 825 | ||
825 | /* cFYI(1,("readdir2 pos: %lld",file->f_pos)); */ | ||
826 | 826 | ||
827 | switch ((int) file->f_pos) { | 827 | switch ((int) file->f_pos) { |
828 | case 0: | 828 | case 0: |
@@ -876,7 +876,6 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
876 | cifsFile->search_resume_name = NULL; */ | 876 | cifsFile->search_resume_name = NULL; */ |
877 | 877 | ||
878 | /* BB account for . and .. in f_pos as special case */ | 878 | /* BB account for . and .. in f_pos as special case */ |
879 | /* dump_cifs_file_struct(file, "rdir after default ");*/ | ||
880 | 879 | ||
881 | rc = find_cifs_entry(xid,pTcon, file, | 880 | rc = find_cifs_entry(xid,pTcon, file, |
882 | ¤t_entry,&num_to_fill); | 881 | ¤t_entry,&num_to_fill); |
@@ -924,7 +923,6 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) | |||
924 | } /* end switch */ | 923 | } /* end switch */ |
925 | 924 | ||
926 | rddir2_exit: | 925 | rddir2_exit: |
927 | /* dump_cifs_file_struct(file, "end rdir "); */ | ||
928 | FreeXid(xid); | 926 | FreeXid(xid); |
929 | return rc; | 927 | return rc; |
930 | } | 928 | } |