diff options
author | Pavel Shilovsky <piastryyy@gmail.com> | 2010-11-25 17:20:20 +0300 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2011-01-06 19:07:54 +0000 |
commit | 7e12eddb73d4f288b0339ee13832a34d6bc4fd90 (patch) | |
tree | 6beacb189bb82572701e994046d7acb16698d3fb /fs | |
parent | eeb910a6d46103594eb63e6eba1aeb02022368a4 (diff) | |
download | linux-stable-7e12eddb73d4f288b0339ee13832a34d6bc4fd90.tar.gz linux-stable-7e12eddb73d4f288b0339ee13832a34d6bc4fd90.tar.bz2 linux-stable-7e12eddb73d4f288b0339ee13832a34d6bc4fd90.zip |
CIFS: Simplify cifs_open code
Make the code more general for use in posix and non-posix open.
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastryyy@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/file.c | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index f95ba451173f..97ddbf2fdfc3 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -340,6 +340,7 @@ int cifs_open(struct inode *inode, struct file *file) struct cifsFileInfo *pCifsFile = NULL; struct cifsInodeInfo *pCifsInode; char *full_path = NULL; + bool posix_open_ok = false; __u16 netfid; xid = GetXid(); @@ -378,17 +379,7 @@ int cifs_open(struct inode *inode, struct file *file) file->f_flags, &oplock, &netfid, xid); if (rc == 0) { cFYI(1, "posix open succeeded"); - - pCifsFile = cifs_new_fileinfo(netfid, file, tlink, - oplock); - if (pCifsFile == NULL) { - CIFSSMBClose(xid, tcon, netfid); - rc = -ENOMEM; - } - - cifs_fscache_set_inode_cookie(inode, file); - - goto out; + posix_open_ok = true; } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { if (tcon->ses->serverNOS) cERROR(1, "server %s of type %s returned" @@ -405,37 +396,38 @@ int cifs_open(struct inode *inode, struct file *file) or DFS errors */ } - rc = cifs_nt_open(full_path, inode, cifs_sb, tcon, file->f_flags, - &oplock, &netfid, xid); - if (rc) - goto out; + if (!posix_open_ok) { + rc = cifs_nt_open(full_path, inode, cifs_sb, tcon, + file->f_flags, &oplock, &netfid, xid); + if (rc) + goto out; + } pCifsFile = cifs_new_fileinfo(netfid, file, tlink, oplock); if (pCifsFile == NULL) { + CIFSSMBClose(xid, tcon, netfid); rc = -ENOMEM; goto out; } cifs_fscache_set_inode_cookie(inode, file); - if (oplock & CIFS_CREATE_ACTION) { + if ((oplock & CIFS_CREATE_ACTION) && !posix_open_ok && tcon->unix_ext) { /* time to set mode which we can not set earlier due to problems creating new read-only files */ - if (tcon->unix_ext) { - struct cifs_unix_set_info_args args = { - .mode = inode->i_mode, - .uid = NO_CHANGE_64, - .gid = NO_CHANGE_64, - .ctime = NO_CHANGE_64, - .atime = NO_CHANGE_64, - .mtime = NO_CHANGE_64, - .device = 0, - }; - CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args, - cifs_sb->local_nls, - cifs_sb->mnt_cifs_flags & - CIFS_MOUNT_MAP_SPECIAL_CHR); - } + struct cifs_unix_set_info_args args = { + .mode = inode->i_mode, + .uid = NO_CHANGE_64, + .gid = NO_CHANGE_64, + .ctime = NO_CHANGE_64, + .atime = NO_CHANGE_64, + .mtime = NO_CHANGE_64, + .device = 0, + }; + CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args, + cifs_sb->local_nls, + cifs_sb->mnt_cifs_flags & + CIFS_MOUNT_MAP_SPECIAL_CHR); } out: |