[CIFS] New CIFS POSIX mkdir performance improvement (part 2)
Fix incorrect parsing of return data Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
2dd29d3133
commit
cbac3cba66
|
@ -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:
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue