1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

s3: Make smbd/aio.c not depend on aio.h anymore

Signed-off-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Volker Lendecke
2012-07-06 15:05:02 +02:00
committed by Jeremy Allison
parent 715653a335
commit f9df073a31
5 changed files with 31 additions and 76 deletions

View File

@ -149,10 +149,6 @@
#include <netgroup.h>
#endif
#if defined(HAVE_AIO_H) && defined(HAVE_AIO)
#include <aio.h>
#endif
/* Special macros that are no-ops except when run under Valgrind on
* x86. They've moved a little bit from valgrind 1.0.4 to 1.9.4 */
#if HAVE_VALGRIND_MEMCHECK_H

View File

@ -450,6 +450,12 @@ enum vfs_fallocate_mode {
VFS_FALLOCATE_KEEP_SIZE = 1
};
/*
* forward declaration required here until the posix aio functions
* leave the VFS
*/
struct aiocb;
/*
Available VFS operations. These values must be in sync with vfs_ops struct
(struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).

View File

@ -35,6 +35,10 @@
#include <sys/prctl.h>
#endif
#if defined(HAVE_AIO_H)
#include <aio.h>
#endif
/*
The idea is that this file will eventually have wrappers around all
important system calls in samba. The aims are:

View File

@ -24,6 +24,7 @@
#include "system/shmem.h"
#include "smbd/smbd.h"
#include "smbd/globals.h"
#include <aio.h>
#ifndef MAP_FILE
#define MAP_FILE 0

View File

@ -25,29 +25,17 @@
#if defined(HAVE_AIO)
/* The signal we'll use to signify aio done. */
#ifndef RT_SIGNAL_AIO
#define RT_SIGNAL_AIO (SIGRTMIN+3)
#endif
#ifndef HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR
#ifdef HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR
#define sival_int sigval_int
#define sival_ptr sigval_ptr
#endif
#endif
/****************************************************************************
The buffer we keep around whilst an aio request is in process.
*****************************************************************************/
struct aio_extra {
struct aio_extra *next, *prev;
SMB_STRUCT_AIOCB acb;
files_struct *fsp;
struct smb_request *smbreq;
DATA_BLOB outbuf;
struct lock_struct lock;
size_t nbyte;
off_t offset;
bool write_through;
};
@ -173,7 +161,6 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn,
size_t smb_maxcnt)
{
struct aio_extra *aio_ex;
SMB_STRUCT_AIOCB *a;
size_t bufsize;
size_t min_aio_read_size = lp_aio_read_size(SNUM(conn));
struct tevent_req *req;
@ -231,17 +218,8 @@ NTSTATUS schedule_aio_read_and_X(connection_struct *conn,
return NT_STATUS_FILE_LOCK_CONFLICT;
}
a = &aio_ex->acb;
/* Now set up the aio record for the read call. */
a->aio_fildes = fsp->fh->fd;
a->aio_buf = smb_buf(aio_ex->outbuf.data);
a->aio_nbytes = smb_maxcnt;
a->aio_offset = startpos;
a->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = aio_ex;
aio_ex->nbyte = smb_maxcnt;
aio_ex->offset = startpos;
req = SMB_VFS_PREAD_SEND(aio_ex, fsp->conn->sconn->ev_ctx,
fsp, smb_buf(aio_ex->outbuf.data),
@ -315,12 +293,12 @@ static void aio_pread_smb1_done(struct tevent_req *req)
SSVAL(outbuf,smb_vwv7, ((nread >> 16) & 1));
SSVAL(smb_buf(outbuf), -2, nread);
aio_ex->fsp->fh->pos = aio_ex->acb.aio_offset + nread;
aio_ex->fsp->fh->pos = aio_ex->offset + nread;
aio_ex->fsp->fh->position_information = aio_ex->fsp->fh->pos;
DEBUG( 3, ("handle_aio_read_complete file %s max=%d "
"nread=%d\n", fsp_str_dbg(fsp),
(int)aio_ex->acb.aio_nbytes, (int)nread ) );
(int)aio_ex->nbyte, (int)nread ) );
}
smb_setlen(outbuf, outsize - 4);
@ -334,7 +312,7 @@ static void aio_pread_smb1_done(struct tevent_req *req)
DEBUG(10, ("handle_aio_read_complete: scheduled aio_read completed "
"for file %s, offset %.0f, len = %u\n",
fsp_str_dbg(fsp), (double)aio_ex->acb.aio_offset,
fsp_str_dbg(fsp), (double)aio_ex->offset,
(unsigned int)nread));
TALLOC_FREE(aio_ex);
@ -353,7 +331,6 @@ NTSTATUS schedule_aio_write_and_X(connection_struct *conn,
size_t numtowrite)
{
struct aio_extra *aio_ex;
SMB_STRUCT_AIOCB *a;
size_t bufsize;
size_t min_aio_write_size = lp_aio_write_size(SNUM(conn));
struct tevent_req *req;
@ -415,17 +392,8 @@ NTSTATUS schedule_aio_write_and_X(connection_struct *conn,
return NT_STATUS_FILE_LOCK_CONFLICT;
}
a = &aio_ex->acb;
/* Now set up the aio record for the write call. */
a->aio_fildes = fsp->fh->fd;
a->aio_buf = discard_const_p(char, data);
a->aio_nbytes = numtowrite;
a->aio_offset = startpos;
a->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = aio_ex;
aio_ex->nbyte = numtowrite;
aio_ex->offset = startpos;
req = SMB_VFS_PWRITE_SEND(aio_ex, fsp->conn->sconn->ev_ctx, fsp,
data, numtowrite, startpos);
@ -485,7 +453,7 @@ static void aio_pwrite_smb1_done(struct tevent_req *req)
req, struct aio_extra);
files_struct *fsp = aio_ex->fsp;
char *outbuf = (char *)aio_ex->outbuf.data;
ssize_t numtowrite = aio_ex->acb.aio_nbytes;
ssize_t numtowrite = aio_ex->nbyte;
ssize_t nwritten;
int err;
@ -565,7 +533,7 @@ static void aio_pwrite_smb1_done(struct tevent_req *req)
fsp_str_dbg(fsp), nt_errstr(status)));
}
aio_ex->fsp->fh->pos = aio_ex->acb.aio_offset + nwritten;
aio_ex->fsp->fh->pos = aio_ex->offset + nwritten;
}
show_msg(outbuf);
@ -579,7 +547,7 @@ static void aio_pwrite_smb1_done(struct tevent_req *req)
DEBUG(10, ("handle_aio_write_complete: scheduled aio_write completed "
"for file %s, offset %.0f, requested %u, written = %u\n",
fsp_str_dbg(fsp), (double)aio_ex->acb.aio_offset,
fsp_str_dbg(fsp), (double)aio_ex->offset,
(unsigned int)numtowrite, (unsigned int)nwritten));
TALLOC_FREE(aio_ex);
@ -627,7 +595,6 @@ NTSTATUS schedule_smb2_aio_read(connection_struct *conn,
size_t smb_maxcnt)
{
struct aio_extra *aio_ex;
SMB_STRUCT_AIOCB *a;
size_t min_aio_read_size = lp_aio_read_size(SNUM(conn));
struct tevent_req *req;
@ -679,17 +646,8 @@ NTSTATUS schedule_smb2_aio_read(connection_struct *conn,
return NT_STATUS_FILE_LOCK_CONFLICT;
}
a = &aio_ex->acb;
/* Now set up the aio record for the read call. */
a->aio_fildes = fsp->fh->fd;
a->aio_buf = preadbuf->data;
a->aio_nbytes = smb_maxcnt;
a->aio_offset = startpos;
a->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = aio_ex;
aio_ex->nbyte = smb_maxcnt;
aio_ex->offset = startpos;
req = SMB_VFS_PREAD_SEND(aio_ex, fsp->conn->sconn->ev_ctx, fsp,
preadbuf->data, smb_maxcnt, startpos);
@ -755,7 +713,7 @@ static void aio_pread_smb2_done(struct tevent_req *req)
status = smb2_read_complete(subreq, nread, err);
if (nread > 0) {
fsp->fh->pos = aio_ex->acb.aio_offset + nread;
fsp->fh->pos = aio_ex->offset + nread;
fsp->fh->position_information = fsp->fh->pos;
}
@ -763,7 +721,7 @@ static void aio_pread_smb2_done(struct tevent_req *req)
"for file %s, offset %.0f, len = %u "
"(errcode = %d, NTSTATUS = %s)\n",
fsp_str_dbg(aio_ex->fsp),
(double)aio_ex->acb.aio_offset,
(double)aio_ex->offset,
(unsigned int)nread,
err, nt_errstr(status)));
@ -788,7 +746,6 @@ NTSTATUS schedule_aio_smb2_write(connection_struct *conn,
bool write_through)
{
struct aio_extra *aio_ex = NULL;
SMB_STRUCT_AIOCB *a = NULL;
size_t min_aio_write_size = lp_aio_write_size(SNUM(conn));
struct tevent_req *req;
@ -836,17 +793,8 @@ NTSTATUS schedule_aio_smb2_write(connection_struct *conn,
return NT_STATUS_FILE_LOCK_CONFLICT;
}
a = &aio_ex->acb;
/* Now set up the aio record for the write call. */
a->aio_fildes = fsp->fh->fd;
a->aio_buf = in_data.data;
a->aio_nbytes = in_data.length;
a->aio_offset = in_offset;
a->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a->aio_sigevent.sigev_signo = RT_SIGNAL_AIO;
a->aio_sigevent.sigev_value.sival_ptr = aio_ex;
aio_ex->nbyte = in_data.length;
aio_ex->offset = in_offset;
req = SMB_VFS_PWRITE_SEND(aio_ex, fsp->conn->sconn->ev_ctx, fsp,
in_data.data, in_data.length, in_offset);
@ -897,7 +845,7 @@ static void aio_pwrite_smb2_done(struct tevent_req *req)
{
struct aio_extra *aio_ex = tevent_req_callback_data(
req, struct aio_extra);
ssize_t numtowrite = aio_ex->acb.aio_nbytes;
ssize_t numtowrite = aio_ex->nbyte;
struct tevent_req *subreq = aio_ex->smbreq->smb2req->subreq;
files_struct *fsp = aio_ex->fsp;
NTSTATUS status;
@ -927,7 +875,7 @@ static void aio_pwrite_smb2_done(struct tevent_req *req)
"for file %s, offset %.0f, requested %u, "
"written = %u (errcode = %d, NTSTATUS = %s)\n",
fsp_str_dbg(fsp),
(double)aio_ex->acb.aio_offset,
(double)aio_ex->offset,
(unsigned int)numtowrite,
(unsigned int)nwritten,
err, nt_errstr(status)));