Commit cbac3cba authored by Steve French's avatar Steve French

[CIFS] New CIFS POSIX mkdir performance improvement (part 2)

Fix incorrect parsing of return data
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 2dd29d31
...@@ -1008,9 +1008,12 @@ PsxCreat: ...@@ -1008,9 +1008,12 @@ PsxCreat:
if(cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction) if(cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction)
*pOplock |= CIFS_CREATE_ACTION; *pOplock |= CIFS_CREATE_ACTION;
/* check to make sure response data is there */ /* check to make sure response data is there */
if(psx_rsp->ReturnedLevel != SMB_QUERY_FILE_UNIX_BASIC) if(psx_rsp->ReturnedLevel != SMB_QUERY_FILE_UNIX_BASIC) {
pRetData->Type = -1; /* unknown */ pRetData->Type = -1; /* unknown */
else { #ifdef CONFIG_CIFS_DEBUG2
cFYI(1,("unknown type"));
#endif
} else {
if(pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) if(pSMBr->ByteCount < sizeof(OPEN_PSX_RSP)
+ sizeof(FILE_UNIX_BASIC_INFO)) { + sizeof(FILE_UNIX_BASIC_INFO)) {
cERROR(1,("Open response data too small")); cERROR(1,("Open response data too small"));
...@@ -1018,7 +1021,7 @@ PsxCreat: ...@@ -1018,7 +1021,7 @@ PsxCreat:
goto psx_create_err; goto psx_create_err;
} }
memcpy((char *) pRetData, memcpy((char *) pRetData,
(char *)&psx_rsp + sizeof(OPEN_PSX_RSP), (char *)psx_rsp + sizeof(OPEN_PSX_RSP),
sizeof (FILE_UNIX_BASIC_INFO)); sizeof (FILE_UNIX_BASIC_INFO));
} }
......
...@@ -796,6 +796,9 @@ static void posix_fill_in_inode(struct inode *tmp_inode, ...@@ -796,6 +796,9 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
cFYI(1,("unknown inode type %d",type)); cFYI(1,("unknown inode type %d",type));
} }
#ifdef CONFIG_CIFS_DEBUG2
cFYI(1,("object type: %d", type));
#endif
tmp_inode->i_uid = le64_to_cpu(pData->Uid); tmp_inode->i_uid = le64_to_cpu(pData->Uid);
tmp_inode->i_gid = le64_to_cpu(pData->Gid); tmp_inode->i_gid = le64_to_cpu(pData->Gid);
tmp_inode->i_nlink = le64_to_cpu(pData->Nlinks); tmp_inode->i_nlink = le64_to_cpu(pData->Nlinks);
...@@ -903,6 +906,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -903,6 +906,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
cFYI(1, ("posix mkdir returned 0x%x", rc)); cFYI(1, ("posix mkdir returned 0x%x", rc));
d_drop(direntry); d_drop(direntry);
} else { } else {
int obj_type;
if (pInfo->Type == -1) /* no return info - go query */ if (pInfo->Type == -1) /* no return info - go query */
goto mkdir_get_info; goto mkdir_get_info;
/*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need to set uid/gid */ /*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need to set uid/gid */
...@@ -911,19 +915,36 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -911,19 +915,36 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
direntry->d_op = &cifs_ci_dentry_ops; direntry->d_op = &cifs_ci_dentry_ops;
else else
direntry->d_op = &cifs_dentry_ops; direntry->d_op = &cifs_dentry_ops;
newinode = new_inode(inode->i_sb);
if (newinode == NULL)
goto mkdir_get_info;
/* Is an i_ino of zero legal? */
/* Are there sanity checks we can use to ensure that
the server is really filling in that field? */
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
newinode->i_ino =
(unsigned long)pInfo->UniqueId;
} /* note ino incremented to unique num in new_inode */
if(inode->i_sb->s_flags & MS_NOATIME)
newinode->i_flags |= S_NOATIME | S_NOCMTIME;
newinode->i_nlink = 2;
insert_inode_hash(newinode);
d_instantiate(direntry, newinode); d_instantiate(direntry, newinode);
if (direntry->d_inode) {
int obj_type; /* we already checked in POSIXCreate whether
direntry->d_inode->i_nlink = 2; frame was long enough */
/* already checked in POSIXCreate whether posix_fill_in_inode(direntry->d_inode,
frame was long enough */
posix_fill_in_inode(direntry->d_inode,
pInfo, &obj_type, 1 /* NewInode */); pInfo, &obj_type, 1 /* NewInode */);
/* could double check that we actually #ifdef CONFIG_CIFS_DEBUG2
* created what we thought we did ie cFYI(1,("instantiated dentry %p %s to inode %p",
* a directory direntry, direntry->d_name.name, newinode));
*/
} if(newinode->i_nlink != 2)
cFYI(1,("unexpected number of links %d",
newinode->i_nlink));
#endif
} }
kfree(pInfo); kfree(pInfo);
goto mkdir_out; goto mkdir_out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment