On Thu, Nov 25, 2010 at 8:44 AM, Pavel Shilovsky <[email protected]> wrote:
> Delete cifs_open_inode_helper and move non-posix open related things
> to cifs_nt_open function.
>
> Signed-off-by: Pavel Shilovsky <[email protected]>
> ---
> fs/cifs/cifsproto.h | 4 +
> fs/cifs/file.c | 184
> +++++++++++++++++++--------------------------------
> 2 files changed, 72 insertions(+), 116 deletions(-)
>
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 6ed59af..09d048c 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -113,6 +113,10 @@ extern int cifs_posix_open(char *full_path, struct inode
> **pinode,
> struct super_block *sb,
> int mode, unsigned int f_flags,
> __u32 *poplock, __u16 *pnetfid, int xid);
> +extern int cifs_nt_open(char *full_path, struct inode **pinode,
> + struct cifs_sb_info *cifs_sb, struct cifsTconInfo
> *tcon,
> + unsigned int f_flags, __u32 *poplock, __u16 *pnetfid,
> + int xid);
> void cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr);
> extern void cifs_unix_basic_to_fattr(struct cifs_fattr *fattr,
> FILE_UNIX_BASIC_INFO *info,
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index b857ce5..c7d642f 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -104,53 +104,6 @@ static inline int cifs_get_disposition(unsigned int
> flags)
> return FILE_OPEN;
> }
>
> -static inline int cifs_open_inode_helper(struct inode *inode,
> - struct cifsTconInfo *pTcon, __u32 oplock, FILE_ALL_INFO *buf,
> - char *full_path, int xid)
> -{
> - struct cifsInodeInfo *pCifsInode = CIFS_I(inode);
> - struct timespec temp;
> - int rc;
> -
> - if (pCifsInode->clientCanCacheRead) {
> - /* we have the inode open somewhere else
> - no need to discard cache data */
> - goto client_can_cache;
> - }
> -
> - /* BB need same check in cifs_create too? */
> - /* if not oplocked, invalidate inode pages if mtime or file
> - size changed */
> - temp = cifs_NTtimeToUnix(buf->LastWriteTime);
> - if (timespec_equal(&inode->i_mtime, &temp) &&
> - (inode->i_size ==
> - (loff_t)le64_to_cpu(buf->EndOfFile))) {
> - cFYI(1, "inode unchanged on server");
> - } else {
> - if (inode->i_mapping) {
> - /* BB no need to lock inode until after invalidate
> - since namei code should already have it locked? */
> - rc = filemap_write_and_wait(inode->i_mapping);
> - mapping_set_error(inode->i_mapping, rc);
> - }
> - cFYI(1, "invalidating remote inode since open detected it "
> - "changed");
> - invalidate_remote_inode(inode);
> - }
> -
> -client_can_cache:
> - if (pTcon->unix_ext)
> - rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
> - xid);
> - else
> - rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
> - xid, NULL);
> -
> - cifs_set_oplock_level(pCifsInode, oplock);
> -
> - return rc;
> -}
> -
> int cifs_posix_open(char *full_path, struct inode **pinode,
> struct super_block *sb, int mode, unsigned int f_flags,
> __u32 *poplock, __u16 *pnetfid, int xid)
> @@ -213,6 +166,71 @@ posix_open_ret:
> return rc;
> }
>
> +int cifs_nt_open(char *full_path, struct inode **pinode,
> + struct cifs_sb_info *cifs_sb, struct cifsTconInfo *tcon,
> + unsigned int f_flags, __u32 *poplock, __u16 *pnetfid, int
> xid)
> +{
> + int rc;
> + int desiredAccess;
> + int disposition;
> + FILE_ALL_INFO *buf;
> +
> + desiredAccess = cifs_convert_flags(f_flags);
> +
> +/*********************************************************************
> + * open flag mapping table:
> + *
> + * POSIX Flag CIFS Disposition
> + * ---------- ----------------
> + * O_CREAT FILE_OPEN_IF
> + * O_CREAT | O_EXCL FILE_CREATE
> + * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
> + * O_TRUNC FILE_OVERWRITE
> + * none of the above FILE_OPEN
> + *
> + * Note that there is not a direct match between disposition
> + * FILE_SUPERSEDE (ie create whether or not file exists although
> + * O_CREAT | O_TRUNC is similar but truncates the existing
> + * file rather than creating a new file as FILE_SUPERSEDE does
> + * (which uses the attributes / metadata passed in on open call)
> + *?
> + *? O_SYNC is a reasonable match to CIFS writethrough flag
> + *? and the read write flags match reasonably. O_LARGEFILE
> + *? is irrelevant because largefile support is always used
> + *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
> + * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
> + *********************************************************************/
> +
> + disposition = cifs_get_disposition(f_flags);
> +
> + /* BB pass O_SYNC flag through on file attributes .. BB */
> +
> + buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> +
> + if (tcon->ses->capabilities & CAP_NT_SMBS)
> + rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
> + desiredAccess, CREATE_NOT_DIR, pnetfid, poplock, buf,
> + cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
> + & CIFS_MOUNT_MAP_SPECIAL_CHR);
> + else
> + rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
> + desiredAccess, CREATE_NOT_DIR, pnetfid, poplock, buf,
> + cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
> + & CIFS_MOUNT_MAP_SPECIAL_CHR);
> +
> + if (rc)
> + goto out;
> +
> + rc = cifs_get_inode_info(pinode, full_path, buf, (*pinode)->i_sb,
> + xid, NULL);
I think netfid should be passed to cifs_get_inode_info.
> +
> +out:
> + kfree(buf);
> + return rc;
> +}
> +
> struct cifsFileInfo *
> cifs_new_fileinfo(__u16 fileHandle, struct file *file,
> struct tcon_link *tlink, __u32 oplock)
> @@ -317,10 +335,7 @@ int cifs_open(struct inode *inode, struct file *file)
> struct cifsFileInfo *pCifsFile = NULL;
> struct cifsInodeInfo *pCifsInode;
> char *full_path = NULL;
> - int desiredAccess;
> - int disposition;
> __u16 netfid;
> - FILE_ALL_INFO *buf = NULL;
>
> xid = GetXid();
>
> @@ -385,71 +400,9 @@ int cifs_open(struct inode *inode, struct file *file)
> or DFS errors */
> }
>
> - desiredAccess = cifs_convert_flags(file->f_flags);
> -
> -/*********************************************************************
> - * open flag mapping table:
> - *
> - * POSIX Flag CIFS Disposition
> - * ---------- ----------------
> - * O_CREAT FILE_OPEN_IF
> - * O_CREAT | O_EXCL FILE_CREATE
> - * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
> - * O_TRUNC FILE_OVERWRITE
> - * none of the above FILE_OPEN
> - *
> - * Note that there is not a direct match between disposition
> - * FILE_SUPERSEDE (ie create whether or not file exists although
> - * O_CREAT | O_TRUNC is similar but truncates the existing
> - * file rather than creating a new file as FILE_SUPERSEDE does
> - * (which uses the attributes / metadata passed in on open call)
> - *?
> - *? O_SYNC is a reasonable match to CIFS writethrough flag
> - *? and the read write flags match reasonably. O_LARGEFILE
> - *? is irrelevant because largefile support is always used
> - *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
> - * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
> - *********************************************************************/
> -
> - disposition = cifs_get_disposition(file->f_flags);
> -
> - /* BB pass O_SYNC flag through on file attributes .. BB */
> -
> - /* Also refresh inode by passing in file_info buf returned by SMBOpen
> - and calling get_inode_info with returned buf (at least helps
> - non-Unix server case) */
> -
> - /* BB we can not do this if this is the second open of a file
> - and the first handle has writebehind data, we might be
> - able to simply do a filemap_fdatawrite/filemap_fdatawait first */
> - buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
> - if (!buf) {
> - rc = -ENOMEM;
> - goto out;
> - }
> -
> - if (tcon->ses->capabilities & CAP_NT_SMBS)
> - rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
> - desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
> - cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
> - & CIFS_MOUNT_MAP_SPECIAL_CHR);
> - else
> - rc = -EIO; /* no NT SMB support fall into legacy open below */
> -
> - if (rc == -EIO) {
> - /* Old server, try legacy style OpenX */
> - rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
> - desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
> - cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
> - & CIFS_MOUNT_MAP_SPECIAL_CHR);
> - }
> - if (rc) {
> - cFYI(1, "cifs_open returned 0x%x", rc);
> - goto out;
> - }
> -
> - rc = cifs_open_inode_helper(inode, tcon, oplock, buf, full_path, xid);
> - if (rc != 0)
> + 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);
> @@ -481,7 +434,6 @@ int cifs_open(struct inode *inode, struct file *file)
> }
>
> out:
> - kfree(buf);
> kfree(full_path);
> FreeXid(xid);
> cifs_put_tlink(tlink);
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html