[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>
This commit is contained in:
parent
e922efc342
commit
e08fc0457a
@ -145,24 +145,23 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if(nd) {
|
||||
if ((nd->intent.open.flags & O_ACCMODE) == O_RDONLY)
|
||||
desiredAccess = GENERIC_READ;
|
||||
else if ((nd->intent.open.flags & O_ACCMODE) == O_WRONLY) {
|
||||
desiredAccess = GENERIC_WRITE;
|
||||
write_only = TRUE;
|
||||
} else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) {
|
||||
/* GENERIC_ALL is too much permission to request */
|
||||
/* can cause unnecessary access denied on create */
|
||||
/* desiredAccess = GENERIC_ALL; */
|
||||
desiredAccess = GENERIC_READ | GENERIC_WRITE;
|
||||
if(nd && (nd->flags & LOOKUP_OPEN)) {
|
||||
int oflags = nd->intent.open.flags;
|
||||
|
||||
desiredAccess = 0;
|
||||
if (oflags & FMODE_READ)
|
||||
desiredAccess |= GENERIC_READ;
|
||||
if (oflags & FMODE_WRITE) {
|
||||
desiredAccess |= GENERIC_WRITE;
|
||||
if (!(oflags & FMODE_READ))
|
||||
write_only = TRUE;
|
||||
}
|
||||
|
||||
if((nd->intent.open.flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
||||
if((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
||||
disposition = FILE_CREATE;
|
||||
else if((nd->intent.open.flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
|
||||
else if((oflags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
|
||||
disposition = FILE_OVERWRITE_IF;
|
||||
else if((nd->intent.open.flags & O_CREAT) == O_CREAT)
|
||||
else if((oflags & O_CREAT) == O_CREAT)
|
||||
disposition = FILE_OPEN_IF;
|
||||
else {
|
||||
cFYI(1,("Create flag not set in create function"));
|
||||
|
Loading…
Reference in New Issue
Block a user