git.samba.org
/
samba.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
94d5417
)
correctly handle aio_error() and errno
author
Olaf Flebbe
<o.flebbe@science-computing.de>
Tue, 13 Oct 2009 13:48:19 +0000
(15:48 +0200)
committer
Jeremy Allison
<jra@samba.org>
Tue, 13 Oct 2009 19:59:23 +0000
(12:59 -0700)
source3/smbd/aio.c
patch
|
blob
|
history
diff --git
a/source3/smbd/aio.c
b/source3/smbd/aio.c
index 491dd794646bdd89fa4310b5c2468e4193d85873..82e7b3ce15f90fc4a97a462ffcb673ad6982de27 100644
(file)
--- a/
source3/smbd/aio.c
+++ b/
source3/smbd/aio.c
@@
-45,11
+45,11
@@
struct aio_extra {
files_struct *fsp;
struct smb_request *req;
char *outbuf;
files_struct *fsp;
struct smb_request *req;
char *outbuf;
- int (*handle_completion)(struct aio_extra *ex);
+ int (*handle_completion)(struct aio_extra *ex
, int errcode
);
};
};
-static int handle_aio_read_complete(struct aio_extra *aio_ex);
-static int handle_aio_write_complete(struct aio_extra *aio_ex);
+static int handle_aio_read_complete(struct aio_extra *aio_ex
, int errcode
);
+static int handle_aio_write_complete(struct aio_extra *aio_ex
, int errcode
);
static int aio_extra_destructor(struct aio_extra *aio_ex)
{
static int aio_extra_destructor(struct aio_extra *aio_ex)
{
@@
-319,7
+319,7
@@
bool schedule_aio_write_and_X(connection_struct *conn,
Returns errno or zero if all ok.
*****************************************************************************/
Returns errno or zero if all ok.
*****************************************************************************/
-static int handle_aio_read_complete(struct aio_extra *aio_ex)
+static int handle_aio_read_complete(struct aio_extra *aio_ex
, int errcode
)
{
int ret = 0;
int outsize;
{
int ret = 0;
int outsize;
@@
-333,17
+333,11
@@
static int handle_aio_read_complete(struct aio_extra *aio_ex)
will return an error. Hopefully this is
true.... JRA. */
will return an error. Hopefully this is
true.... JRA. */
- /* If errno is ECANCELED then don't return anything to the
- * client. */
- if (errno == ECANCELED) {
- return 0;
- }
-
- DEBUG( 3,( "handle_aio_read_complete: file %s nread == -1. "
+ DEBUG( 3,( "handle_aio_read_complete: file %s nread == %d. "
"Error = %s\n",
"Error = %s\n",
- fsp_str_dbg(aio_ex->fsp),
strerror(errno
)));
+ fsp_str_dbg(aio_ex->fsp),
nread, strerror(errcode
)));
- ret = err
no
;
+ ret = err
code
;
ERROR_NT(map_nt_error_from_unix(ret));
outsize = srv_set_message(outbuf,0,0,true);
} else {
ERROR_NT(map_nt_error_from_unix(ret));
outsize = srv_set_message(outbuf,0,0,true);
} else {
@@
-382,10
+376,10
@@
static int handle_aio_read_complete(struct aio_extra *aio_ex)
/****************************************************************************
Complete the write and return the data or error back to the client.
/****************************************************************************
Complete the write and return the data or error back to the client.
- Returns err
no
or zero if all ok.
+ Returns err
or code
or zero if all ok.
*****************************************************************************/
*****************************************************************************/
-static int handle_aio_write_complete(struct aio_extra *aio_ex)
+static int handle_aio_write_complete(struct aio_extra *aio_ex
, int errcode
)
{
int ret = 0;
files_struct *fsp = aio_ex->fsp;
{
int ret = 0;
files_struct *fsp = aio_ex->fsp;
@@
-399,8
+393,8
@@
static int handle_aio_write_complete(struct aio_extra *aio_ex)
DEBUG(5,("handle_aio_write_complete: "
"aio_write_behind failed ! File %s "
"is corrupt ! Error %s\n",
DEBUG(5,("handle_aio_write_complete: "
"aio_write_behind failed ! File %s "
"is corrupt ! Error %s\n",
- fsp_str_dbg(fsp), strerror(err
no
)));
- ret = err
no
;
+ fsp_str_dbg(fsp), strerror(err
code
)));
+ ret = err
code
;
} else {
DEBUG(0,("handle_aio_write_complete: "
"aio_write_behind failed ! File %s "
} else {
DEBUG(0,("handle_aio_write_complete: "
"aio_write_behind failed ! File %s "
@@
-415,6
+409,7
@@
static int handle_aio_write_complete(struct aio_extra *aio_ex)
"aio_write_behind completed for file %s\n",
fsp_str_dbg(fsp)));
}
"aio_write_behind completed for file %s\n",
fsp_str_dbg(fsp)));
}
+ /* TODO: should no return 0 in case of an error !!! */
return 0;
}
return 0;
}
@@
-427,14
+422,8
@@
static int handle_aio_write_complete(struct aio_extra *aio_ex)
fsp_str_dbg(fsp), (unsigned int)numtowrite,
(int)nwritten, strerror(errno) ));
fsp_str_dbg(fsp), (unsigned int)numtowrite,
(int)nwritten, strerror(errno) ));
- /* If errno is ECANCELED then don't return anything to the
- * client. */
- if (errno == ECANCELED) {
- return 0;
- }
-
- ret = errno;
- ERROR_BOTH(map_nt_error_from_unix(ret), ERRHRD, ERRdiskfull);
+ ret = errcode;
+ ERROR_NT(map_nt_error_from_unix(ret));
srv_set_message(outbuf,0,0,true);
} else {
bool write_through = BITSETW(aio_ex->req->vwv+7,0);
srv_set_message(outbuf,0,0,true);
} else {
bool write_through = BITSETW(aio_ex->req->vwv+7,0);
@@
-493,14
+482,21
@@
static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
}
/* Ensure the operation has really completed. */
}
/* Ensure the operation has really completed. */
- if (SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb) == EINPROGRESS) {
+ err = SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb);
+ if (err == EINPROGRESS) {
DEBUG(10,( "handle_aio_completed: operation mid %u still in "
"process for file %s\n",
aio_ex->req->mid, fsp_str_dbg(aio_ex->fsp)));
return False;
DEBUG(10,( "handle_aio_completed: operation mid %u still in "
"process for file %s\n",
aio_ex->req->mid, fsp_str_dbg(aio_ex->fsp)));
return False;
- }
+ } else if (err == ECANCELED) {
+ /* If error is ECANCELED then don't return anything to the
+ * client. */
+ DEBUG(10,( "handle_aio_completed: operation mid %u"
+ " canceled\n", aio_ex->req->mid));
+ return True;
+ }
- err = aio_ex->handle_completion(aio_ex);
+ err = aio_ex->handle_completion(aio_ex
, err
);
if (err) {
*perr = err; /* Only save non-zero errors. */
}
if (err) {
*perr = err; /* Only save non-zero errors. */
}
@@
-510,7
+506,6
@@
static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
/****************************************************************************
Handle any aio completion inline.
/****************************************************************************
Handle any aio completion inline.
- Returns non-zero errno if fail or zero if all ok.
*****************************************************************************/
void smbd_aio_complete_mid(unsigned int mid)
*****************************************************************************/
void smbd_aio_complete_mid(unsigned int mid)