2010/11/28 Pavel Shilovsky <[email protected]>:
> 2010/11/27 Shirish Pargaonkar <[email protected]>:
>> 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.
>
> Why do we need it?
Let's drop this question - you are right :)
>
>>
>>> +
>>> +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
>>>
>>
>
>
>
> --
> Best regards,
> Pavel Shilovsky.
>
--
Best regards,
Pavel Shilovsky.
--
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