Re: [patch] skip posix open if nameidata is null
Shirish Pargaonkar <[email protected]>
| Newsgroups | gmane.linux.file-systems.cifs |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Apr 2, 2010 at 5:44 PM, Jeff Layton <[email protected]> wrote: > On Fri, 2 Apr 2010 12:32:58 -0500 > [email protected] wrote: > >> While creating a file on a server which supports unix extensions >> such as Samba, if a file is being created which does not supply >> nameidata (i.e. nd is null), cifs client can oops when calling >> cifs_posix_open. >> >> The simplest solution is, do not open a file using posix semantics >> if nameidata parameter is NULL even if server supports posix semantics. >> >> I do not see a way to reach vfsmount (structure) field if nameidata >> is not supplied to call posix open (cifs_posix_open). >> >> >> Signed-off-by: Shirish Pargaonkar <[email protected]> >> Reported-by: Eugene Teo <[email protected]> >> --- >> >> diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c >> index e9f7ecc..eef8d83 100644 >> --- a/fs/cifs/dir.c >> +++ b/fs/cifs/dir.c >> @@ -317,7 +317,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, >> else >> oflags = FMODE_READ; >> >> - if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) && >> + if (nd && tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) && >> (CIFS_UNIX_POSIX_PATH_OPS_CAP & >> le64_to_cpu(tcon->fsUnixInfo.Capability))) { >> rc = cifs_posix_open(full_path, &newinode, nd->path.mnt, > > There's nothing inherently special about posix opens that prevents them > from working when nd is NULL. Instead of doing this, it would probably > be preferable to have posix opens do what "regular" opens do when nd is > NULL -- close the file before returning from cifs_create. > > -- > Jeff Layton <[email protected]> > Agree that just because nd is null, caller should not miss out on posix semantics, but the way code is written now, there is no way to access super_block within cifs_posix_open if nd is NULL, will have to modify cifs_posix_open to expect both vfsmount and super_block when invoked and handle null nd/vfsmount case within. Regards, Shirish