diff options
author | Jeremy Allison <jra@samba.org> | 2013-03-25 09:54:50 -0700 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2013-03-28 17:51:22 +0100 |
commit | ffe14d99083fe5344fa7678e7ad780d930398427 (patch) | |
tree | a2b5f2f51f8636df40724540ced3d37eb9fe300b /source3 | |
parent | adbe6cba005a2060b0f641e91b500574f4637a36 (diff) | |
download | samba-ffe14d99083fe5344fa7678e7ad780d930398427.tar.gz samba-ffe14d99083fe5344fa7678e7ad780d930398427.tar.bz2 samba-ffe14d99083fe5344fa7678e7ad780d930398427.zip |
Optimization suggested by Volker. Don't do a stat system call on normal read path.
Only do it if we need it in the sendfile() path.
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Thu Mar 28 17:51:22 CET 2013 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/reply.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 8b500c5387..0d9f415a43 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -3666,11 +3666,6 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req, struct lock_struct lock; int saved_errno = 0; - if(fsp_stat(fsp) == -1) { - reply_nterror(req, map_nt_error_from_unix(errno)); - return; - } - init_strict_lock_struct(fsp, (uint64_t)req->smbpid, (uint64_t)startpos, (uint64_t)smb_maxcnt, READ_LOCK, &lock); @@ -3680,16 +3675,6 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req, return; } - if (!S_ISREG(fsp->fsp_name->st.st_ex_mode) || - (startpos > fsp->fsp_name->st.st_ex_size) - || (smb_maxcnt > (fsp->fsp_name->st.st_ex_size - startpos))) { - /* - * We already know that we would do a short read, so don't - * try the sendfile() path. - */ - goto nosendfile_read; - } - /* * We can only use sendfile on a non-chained packet * but we can use on a non-oplocked file. tridge proved this @@ -3704,6 +3689,21 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req, uint8 headerbuf[smb_size + 12 * 2]; DATA_BLOB header; + if(fsp_stat(fsp) == -1) { + reply_nterror(req, map_nt_error_from_unix(errno)); + goto strict_unlock; + } + + if (!S_ISREG(fsp->fsp_name->st.st_ex_mode) || + (startpos > fsp->fsp_name->st.st_ex_size) || + (smb_maxcnt > (fsp->fsp_name->st.st_ex_size - startpos))) { + /* + * We already know that we would do a short read, so don't + * try the sendfile() path. + */ + goto nosendfile_read; + } + /* * Set up the packet header before send. We * assume here the sendfile will work (get the |