1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-14 00:58:38 +03:00

smbd: Pull mtime handling into open_file_ntcreate

This is a performance improvement for heavily contended files, in
particular in a cluster. The separate call to get_file_infos makes us
pull the locking.tdb record twice per open. For a contended file this
can be a performance penalty, this gets the # of record accesses for
the open/close cycle down from 3 to 2.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Nov 23 00:40:49 CET 2013 on sn-devel-104
This commit is contained in:
Volker Lendecke 2013-11-22 16:24:42 +00:00 committed by Jeremy Allison
parent 4e344aba4e
commit a793ac016d
4 changed files with 23 additions and 38 deletions

View File

@ -457,7 +457,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
struct timespec c_timespec;
struct timespec a_timespec;
struct timespec m_timespec;
struct timespec write_time_ts;
NTSTATUS status;
int oplock_request;
uint8_t oplock_granted = NO_OPLOCK_RETURN;
@ -657,14 +656,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
fattr = FILE_ATTRIBUTE_NORMAL;
}
/* Deal with other possible opens having a modified
write time. JRA. */
ZERO_STRUCT(write_time_ts);
get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
if (!null_timespec(write_time_ts)) {
update_stat_ex_mtime(&smb_fname->st, write_time_ts);
}
/* Create time. */
create_timespec = get_create_timespec(conn, fsp, smb_fname);
a_timespec = smb_fname->st.st_ex_atime;
@ -1001,7 +992,6 @@ static void call_nt_transact_create(connection_struct *conn,
struct timespec c_timespec;
struct timespec a_timespec;
struct timespec m_timespec;
struct timespec write_time_ts;
struct ea_list *ea_list = NULL;
NTSTATUS status;
size_t param_len;
@ -1270,14 +1260,6 @@ static void call_nt_transact_create(connection_struct *conn,
fattr = FILE_ATTRIBUTE_NORMAL;
}
/* Deal with other possible opens having a modified
write time. JRA. */
ZERO_STRUCT(write_time_ts);
get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
if (!null_timespec(write_time_ts)) {
update_stat_ex_mtime(&smb_fname->st, write_time_ts);
}
/* Create time. */
create_timespec = get_create_timespec(conn, fsp, smb_fname);
a_timespec = smb_fname->st.st_ex_atime;

View File

@ -2845,6 +2845,17 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
(unsigned int)new_unx_mode));
}
{
/*
* Deal with other opens having a modified write time.
*/
struct timespec write_time = get_share_mode_write_time(lck);
if (!null_timespec(write_time)) {
update_stat_ex_mtime(&fsp->fsp_name->st, write_time);
}
}
TALLOC_FREE(lck);
return NT_STATUS_OK;
@ -3281,6 +3292,18 @@ static NTSTATUS open_directory(connection_struct *conn,
}
}
{
/*
* Deal with other opens having a modified write time. Is this
* possible for directories?
*/
struct timespec write_time = get_share_mode_write_time(lck);
if (!null_timespec(write_time)) {
update_stat_ex_mtime(&fsp->fsp_name->st, write_time);
}
}
TALLOC_FREE(lck);
if (pinfo) {

View File

@ -1967,18 +1967,6 @@ void reply_open(struct smb_request *req)
size = smb_fname->st.st_ex_size;
fattr = dos_mode(conn, smb_fname);
/* Deal with other possible opens having a modified
write time. JRA. */
if (ask_sharemode) {
struct timespec write_time_ts;
ZERO_STRUCT(write_time_ts);
get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
if (!null_timespec(write_time_ts)) {
update_stat_ex_mtime(&smb_fname->st, write_time_ts);
}
}
mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime);
if (fattr & FILE_ATTRIBUTE_DIRECTORY) {

View File

@ -411,7 +411,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
struct smb_request *smb1req = NULL;
files_struct *result = NULL;
int info;
struct timespec write_time_ts;
struct smb2_create_blobs out_context_blobs;
int requested_oplock_level;
struct smb2_create_blob *dhnc = NULL;
@ -1066,13 +1065,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
}
state->out_file_attributes = dos_mode(result->conn,
result->fsp_name);
/* Deal with other possible opens having a modified
write time. JRA. */
ZERO_STRUCT(write_time_ts);
get_file_infos(result->file_id, 0, NULL, &write_time_ts);
if (!null_timespec(write_time_ts)) {
update_stat_ex_mtime(&result->fsp_name->st, write_time_ts);
}
unix_timespec_to_nt_time(&state->out_creation_time,
get_create_timespec(smb1req->conn, result,