diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-06 18:18:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 19:57:44 -0400 |
commit | e08fc0457af28f2ebec36296ea7ada6024fde81b (patch) | |
tree | 6107256ebc07539e63b1fe091f834660f09c7625 /fs/cifs/dir.c | |
parent | e922efc342d565a38eed3af377ff403f52148864 (diff) |
[PATCH] cifs_create() fix
cifs_create() did totally the wrong thing with nd->intent.open.flags:
it interpreted nd->intent.open.flags as the original open flags, not
the one transformed for open_namei(). Also it used the intent data
even if it was not filled in (if called from sys_mknod()).
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Cc: <viro@parcelfarce.linux.theplanet.co.uk>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Steven French <sfrench@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/cifs/dir.c')
-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")); |