diff options
-rw-r--r-- | fs/cifs/cifsfs.c | 21 | ||||
-rw-r--r-- | fs/cifs/cifsglob.h | 4 | ||||
-rw-r--r-- | fs/cifs/ioctl.c | 21 |
3 files changed, 25 insertions, 21 deletions
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 461a706b237b..6322aada491f 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -169,7 +169,8 @@ cifs_put_super(struct super_block *sb) | |||
169 | static int | 169 | static int |
170 | cifs_statfs(struct super_block *sb, struct kstatfs *buf) | 170 | cifs_statfs(struct super_block *sb, struct kstatfs *buf) |
171 | { | 171 | { |
172 | int xid, rc = -EOPNOTSUPP; | 172 | int xid; |
173 | int rc = -EOPNOTSUPP; | ||
173 | struct cifs_sb_info *cifs_sb; | 174 | struct cifs_sb_info *cifs_sb; |
174 | struct cifsTconInfo *pTcon; | 175 | struct cifsTconInfo *pTcon; |
175 | 176 | ||
@@ -181,17 +182,18 @@ cifs_statfs(struct super_block *sb, struct kstatfs *buf) | |||
181 | buf->f_type = CIFS_MAGIC_NUMBER; | 182 | buf->f_type = CIFS_MAGIC_NUMBER; |
182 | 183 | ||
183 | /* instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO */ | 184 | /* instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO */ |
184 | buf->f_namelen = PATH_MAX; /* PATH_MAX may be too long - it would presumably | 185 | buf->f_namelen = PATH_MAX; /* PATH_MAX may be too long - it would |
185 | be length of total path, note that some servers may be | 186 | presumably be total path, but note |
186 | able to support more than this, but best to be safe | 187 | that some servers (includinng Samba 3) |
187 | since Win2k and others can not handle very long filenames */ | 188 | have a shorter maximum path */ |
188 | buf->f_files = 0; /* undefined */ | 189 | buf->f_files = 0; /* undefined */ |
189 | buf->f_ffree = 0; /* unlimited */ | 190 | buf->f_ffree = 0; /* unlimited */ |
190 | 191 | ||
191 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 192 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
192 | /* BB we could add a second check for a QFS Unix capability bit */ | 193 | /* BB we could add a second check for a QFS Unix capability bit */ |
193 | /* BB FIXME check CIFS_POSIX_EXTENSIONS Unix cap first FIXME BB */ | 194 | /* BB FIXME check CIFS_POSIX_EXTENSIONS Unix cap first FIXME BB */ |
194 | if (pTcon->ses->capabilities & CAP_UNIX) | 195 | if ((pTcon->ses->capabilities & CAP_UNIX) && (CIFS_POSIX_EXTENSIONS & |
196 | le64_to_cpu(pTcon->fsUnixInfo.Capability))) | ||
195 | rc = CIFSSMBQFSPosixInfo(xid, pTcon, buf); | 197 | rc = CIFSSMBQFSPosixInfo(xid, pTcon, buf); |
196 | 198 | ||
197 | /* Only need to call the old QFSInfo if failed | 199 | /* Only need to call the old QFSInfo if failed |
@@ -204,9 +206,10 @@ cifs_statfs(struct super_block *sb, struct kstatfs *buf) | |||
204 | int f_type; | 206 | int f_type; |
205 | __fsid_t f_fsid; | 207 | __fsid_t f_fsid; |
206 | int f_namelen; */ | 208 | int f_namelen; */ |
207 | /* BB get from info put in tcon struct at mount time with call to QFSAttrInfo */ | 209 | /* BB get from info in tcon struct at mount time call to QFSAttrInfo */ |
208 | FreeXid(xid); | 210 | FreeXid(xid); |
209 | return 0; /* always return success? what if volume is no longer available? */ | 211 | return 0; /* always return success? what if volume is no |
212 | longer available? */ | ||
210 | } | 213 | } |
211 | 214 | ||
212 | static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd) | 215 | static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd) |
@@ -600,9 +603,7 @@ struct file_operations cifs_dir_ops = { | |||
600 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 603 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
601 | .dir_notify = cifs_dir_notify, | 604 | .dir_notify = cifs_dir_notify, |
602 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | 605 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ |
603 | #ifdef CONFIG_CIFS_POSIX | ||
604 | .ioctl = cifs_ioctl, | 606 | .ioctl = cifs_ioctl, |
605 | #endif /* CONFIG_CIFS_POSIX */ | ||
606 | }; | 607 | }; |
607 | 608 | ||
608 | static void | 609 | static void |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index fe1409799513..322a12450ad3 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -318,7 +318,9 @@ struct mid_q_entry { | |||
318 | struct task_struct *tsk; /* task waiting for response */ | 318 | struct task_struct *tsk; /* task waiting for response */ |
319 | struct smb_hdr *resp_buf; /* response buffer */ | 319 | struct smb_hdr *resp_buf; /* response buffer */ |
320 | int midState; /* wish this were enum but can not pass to wait_event */ | 320 | int midState; /* wish this were enum but can not pass to wait_event */ |
321 | __u8 command; /* smb command code */ | 321 | __u8 command; /* smb command code */ |
322 | unsigned multiPart:1; /* multiple responses to one SMB request */ | ||
323 | unsigned largeBuf:1; /* if valid response, is pointer to large buf */ | ||
322 | }; | 324 | }; |
323 | 325 | ||
324 | struct oplock_q_entry { | 326 | struct oplock_q_entry { |
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index 711bb7a3a98e..b0ea6687ab55 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
@@ -35,35 +35,37 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
35 | unsigned int command, unsigned long arg) | 35 | unsigned int command, unsigned long arg) |
36 | { | 36 | { |
37 | int rc = -ENOTTY; /* strange error - but the precedent */ | 37 | int rc = -ENOTTY; /* strange error - but the precedent */ |
38 | int xid; | ||
39 | struct cifs_sb_info *cifs_sb; | ||
38 | #ifdef CONFIG_CIFS_POSIX | 40 | #ifdef CONFIG_CIFS_POSIX |
39 | __u64 ExtAttrBits = 0; | 41 | __u64 ExtAttrBits = 0; |
40 | __u64 ExtAttrMask = 0; | 42 | __u64 ExtAttrMask = 0; |
41 | #endif /* CONFIG_CIFS_POSIX */ | ||
42 | __u64 caps; | 43 | __u64 caps; |
43 | int xid; | ||
44 | struct cifs_sb_info *cifs_sb; | ||
45 | struct cifsTconInfo *tcon; | 44 | struct cifsTconInfo *tcon; |
46 | struct cifsFileInfo *pSMBFile = | 45 | struct cifsFileInfo *pSMBFile = |
47 | (struct cifsFileInfo *)filep->private_data; | 46 | (struct cifsFileInfo *)filep->private_data; |
47 | #endif /* CONFIG_CIFS_POSIX */ | ||
48 | 48 | ||
49 | xid = GetXid(); | 49 | xid = GetXid(); |
50 | 50 | ||
51 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); | 51 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); |
52 | 52 | ||
53 | cifs_sb = CIFS_SB(inode->i_sb); | 53 | cifs_sb = CIFS_SB(inode->i_sb); |
54 | tcon = cifs_sb->tcon; | ||
55 | 54 | ||
55 | #ifdef CONFIG_CIFS_POSIX | ||
56 | tcon = cifs_sb->tcon; | ||
56 | if(tcon) | 57 | if(tcon) |
57 | caps = le64_to_cpu(tcon->fsUnixInfo.Capability); | 58 | caps = le64_to_cpu(tcon->fsUnixInfo.Capability); |
58 | else { | 59 | else { |
59 | rc = -EIO; | 60 | rc = -EIO; |
60 | goto cifs_ioctl_out; | 61 | FreeXid(xid); |
62 | return -EIO; | ||
61 | } | 63 | } |
64 | #endif /* CONFIG_CIFS_POSIX */ | ||
62 | 65 | ||
63 | switch(command) { | 66 | switch(command) { |
64 | case CIFS_IOC_CHECKUMOUNT: | 67 | case CIFS_IOC_CHECKUMOUNT: |
65 | cFYI(1,("User unmount attempted")); | 68 | cFYI(1,("User unmount attempted")); |
66 | /* BB FIXME - add missing code here FIXME */ | ||
67 | if(cifs_sb->mnt_uid == current->uid) | 69 | if(cifs_sb->mnt_uid == current->uid) |
68 | rc = 0; | 70 | rc = 0; |
69 | else { | 71 | else { |
@@ -75,7 +77,7 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
75 | case EXT2_IOC_GETFLAGS: | 77 | case EXT2_IOC_GETFLAGS: |
76 | if(CIFS_UNIX_EXTATTR_CAP & caps) { | 78 | if(CIFS_UNIX_EXTATTR_CAP & caps) { |
77 | if (pSMBFile == NULL) | 79 | if (pSMBFile == NULL) |
78 | goto cifs_ioctl_out; | 80 | break; |
79 | rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, | 81 | rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, |
80 | &ExtAttrBits, &ExtAttrMask); | 82 | &ExtAttrBits, &ExtAttrMask); |
81 | if(rc == 0) | 83 | if(rc == 0) |
@@ -89,10 +91,10 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
89 | if(CIFS_UNIX_EXTATTR_CAP & caps) { | 91 | if(CIFS_UNIX_EXTATTR_CAP & caps) { |
90 | if(get_user(ExtAttrBits,(int __user *)arg)) { | 92 | if(get_user(ExtAttrBits,(int __user *)arg)) { |
91 | rc = -EFAULT; | 93 | rc = -EFAULT; |
92 | goto cifs_ioctl_out; | 94 | break; |
93 | } | 95 | } |
94 | if (pSMBFile == NULL) | 96 | if (pSMBFile == NULL) |
95 | goto cifs_ioctl_out; | 97 | break; |
96 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, | 98 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, |
97 | extAttrBits, &ExtAttrMask);*/ | 99 | extAttrBits, &ExtAttrMask);*/ |
98 | 100 | ||
@@ -105,7 +107,6 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
105 | break; | 107 | break; |
106 | } | 108 | } |
107 | 109 | ||
108 | cifs_ioctl_out: | ||
109 | FreeXid(xid); | 110 | FreeXid(xid); |
110 | return rc; | 111 | return rc; |
111 | } | 112 | } |