summaryrefslogtreecommitdiff
path: root/source3/smbd/smb2_read.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-12-14 16:32:10 -0800
committerJeremy Allison <jra@samba.org>2010-12-15 01:38:16 +0100
commit14c70346fc88d05dfabc14b0a932632470fee6fe (patch)
treed1382cdcb7bf0cb0804a7f374b92044b30cc9a83 /source3/smbd/smb2_read.c
parent3bc1cf94e3a0febe8d3d53229aa49c3d8eb8c1b6 (diff)
downloadsamba-14c70346fc88d05dfabc14b0a932632470fee6fe.tar.gz
samba-14c70346fc88d05dfabc14b0a932632470fee6fe.tar.bz2
samba-14c70346fc88d05dfabc14b0a932632470fee6fe.zip
Change interface of schedule_smb2_aio_read() to allocate the return DATA_BLOB.
Change smb2_read code to allocate return DATA_BLOB just before the read. Preparing for SMB2 sendfile change which will not need to allocate return buffer. Jeremy
Diffstat (limited to 'source3/smbd/smb2_read.c')
-rw-r--r--source3/smbd/smb2_read.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/source3/smbd/smb2_read.c b/source3/smbd/smb2_read.c
index b1866d1481..97f12d582c 100644
--- a/source3/smbd/smb2_read.c
+++ b/source3/smbd/smb2_read.c
@@ -290,16 +290,16 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
- state->out_data = data_blob_talloc(state, NULL, in_length);
- if (in_length > 0 && tevent_req_nomem(state->out_data.data, req)) {
- return tevent_req_post(req, ev);
- }
-
state->fsp = fsp;
if (IS_IPC(smbreq->conn)) {
struct tevent_req *subreq = NULL;
+ state->out_data = data_blob_talloc(state, NULL, in_length);
+ if (in_length > 0 && tevent_req_nomem(state->out_data.data, req)) {
+ return tevent_req_post(req, ev);
+ }
+
if (!fsp_is_np(fsp)) {
tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
return tevent_req_post(req, ev);
@@ -326,7 +326,8 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
status = schedule_smb2_aio_read(fsp->conn,
smbreq,
fsp,
- (char *)state->out_data.data,
+ state,
+ &state->out_data,
(SMB_OFF_T)in_offset,
(size_t)in_length);
@@ -363,6 +364,13 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
+ /* Ok, read into memory. Allocate the out buffer. */
+ state->out_data = data_blob_talloc(state, NULL, in_length);
+ if (in_length > 0 && tevent_req_nomem(state->out_data.data, req)) {
+ SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
+ return tevent_req_post(req, ev);
+ }
+
nread = read_file(fsp,
(char *)state->out_data.data,
in_offset,