diff options
-rw-r--r-- | fs/cifs/dir.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 3f3538d4a1fa..d335269bd91c 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -145,24 +145,23 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
145 | return -ENOMEM; | 145 | return -ENOMEM; |
146 | } | 146 | } |
147 | 147 | ||
148 | if(nd) { | 148 | if(nd && (nd->flags & LOOKUP_OPEN)) { |
149 | if ((nd->intent.open.flags & O_ACCMODE) == O_RDONLY) | 149 | int oflags = nd->intent.open.flags; |
150 | desiredAccess = GENERIC_READ; | 150 | |
151 | else if ((nd->intent.open.flags & O_ACCMODE) == O_WRONLY) { | 151 | desiredAccess = 0; |
152 | desiredAccess = GENERIC_WRITE; | 152 | if (oflags & FMODE_READ) |
153 | write_only = TRUE; | 153 | desiredAccess |= GENERIC_READ; |
154 | } else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) { | 154 | if (oflags & FMODE_WRITE) { |
155 | /* GENERIC_ALL is too much permission to request */ | 155 | desiredAccess |= GENERIC_WRITE; |
156 | /* can cause unnecessary access denied on create */ | 156 | if (!(oflags & FMODE_READ)) |
157 | /* desiredAccess = GENERIC_ALL; */ | 157 | write_only = TRUE; |
158 | desiredAccess = GENERIC_READ | GENERIC_WRITE; | ||
159 | } | 158 | } |
160 | 159 | ||
161 | if((nd->intent.open.flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) | 160 | if((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) |
162 | disposition = FILE_CREATE; | 161 | disposition = FILE_CREATE; |
163 | else if((nd->intent.open.flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) | 162 | else if((oflags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) |
164 | disposition = FILE_OVERWRITE_IF; | 163 | disposition = FILE_OVERWRITE_IF; |
165 | else if((nd->intent.open.flags & O_CREAT) == O_CREAT) | 164 | else if((oflags & O_CREAT) == O_CREAT) |
166 | disposition = FILE_OPEN_IF; | 165 | disposition = FILE_OPEN_IF; |
167 | else { | 166 | else { |
168 | cFYI(1,("Create flag not set in create function")); | 167 | cFYI(1,("Create flag not set in create function")); |