From: Volker Lendecke Date: Sun, 11 Feb 2007 14:39:21 +0000 (+0000) Subject: r21279: Get rid of 'aio write behind', this is broken. X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=d9a29aade0f01df1fa00ccdb8691b02b39bc1d14;p=metze%2Fsamba%2Fwip.git r21279: Get rid of 'aio write behind', this is broken. It should probably better be integrated with our write cache. Volker (This used to be commit 58bfd168b046a97a895aaa3384fd7af8d077a1d5) --- diff --git a/source3/include/smb.h b/source3/include/smb.h index f9efa899583f..cc03722c2b73 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -512,7 +512,6 @@ typedef struct files_struct { BOOL modified; BOOL is_directory; BOOL is_stat; - BOOL aio_write_behind; BOOL lockdb_clean; BOOL initial_delete_on_close; /* Only set at NTCreateX if file was created. */ BOOL posix_open; @@ -661,7 +660,6 @@ typedef struct connection_struct { name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */ name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */ name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */ - name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */ struct dfree_cached_info *dfree_info; struct trans_state *pending_trans; struct notify_context *notify_ctx; diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index d7b23f615fbf..7abbd0ca4e04 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -368,7 +368,6 @@ typedef struct { char *fstype; char **szVfsObjects; char *szMSDfsProxy; - char *szAioWriteBehind; char *szDfree; int iMinPrintSpace; int iMaxPrintJobs; @@ -508,7 +507,6 @@ static service sDefault = { NULL, /* fstype */ NULL, /* vfs objects */ NULL, /* szMSDfsProxy */ - NULL, /* szAioWriteBehind */ NULL, /* szDfree */ 0, /* iMinPrintSpace */ 1000, /* iMaxPrintJobs */ @@ -962,7 +960,6 @@ static struct parm_struct parm_table[] = { {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, {"aio read size", P_INTEGER, P_LOCAL, &sDefault.iAioReadSize, NULL, NULL, FLAG_ADVANCED}, {"aio write size", P_INTEGER, P_LOCAL, &sDefault.iAioWriteSize, NULL, NULL, FLAG_ADVANCED}, - {"aio write behind", P_STRING, P_LOCAL, &sDefault.szAioWriteBehind, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL }, {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, @@ -2017,7 +2014,6 @@ FN_LOCAL_STRING(lp_veto_files, szVetoFiles) FN_LOCAL_STRING(lp_hide_files, szHideFiles) FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles) FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot) -FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind) FN_LOCAL_STRING(lp_dfree_command, szDfree) FN_LOCAL_BOOL(lp_autoloaded, autoloaded) FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose) diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index 8a9fabf22860..a85cf901ae2e 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -284,7 +284,6 @@ BOOL schedule_aio_write_and_X(connection_struct *conn, struct aio_extra *aio_ex; SMB_STRUCT_AIOCB *a; size_t inbufsize, outbufsize; - BOOL write_through = BITSETW(inbuf+smb_vwv7,0); size_t min_aio_write_size = lp_aio_write_size(SNUM(conn)); if (!min_aio_write_size || (numtowrite < min_aio_write_size)) { @@ -350,22 +349,7 @@ BOOL schedule_aio_write_and_X(connection_struct *conn, return False; } - if (!write_through && !lp_syncalways(SNUM(fsp->conn)) - && fsp->aio_write_behind) { - /* Lie to the client and immediately claim we finished the - * write. */ - SSVAL(aio_ex->outbuf,smb_vwv2,numtowrite); - SSVAL(aio_ex->outbuf,smb_vwv4,(numtowrite>>16)&1); - show_msg(aio_ex->outbuf); - if (!send_smb(smbd_server_fd(),aio_ex->outbuf)) { - exit_server_cleanly("handle_aio_write: send_smb " - "failed."); - } - DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write " - "behind for file %s\n", fsp->fsp_name )); - } else { - srv_defer_sign_response(aio_ex->mid); - } + srv_defer_sign_response(aio_ex->mid); outstanding_aio_calls++; DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write for file " @@ -452,31 +436,6 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex) ssize_t numtowrite = aio_ex->acb.aio_nbytes; ssize_t nwritten = SMB_VFS_AIO_RETURN(fsp,&aio_ex->acb); - if (fsp->aio_write_behind) { - if (nwritten != numtowrite) { - if (nwritten == -1) { - DEBUG(5,("handle_aio_write_complete: " - "aio_write_behind failed ! File %s " - "is corrupt ! Error %s\n", - fsp->fsp_name, strerror(errno) )); - ret = errno; - } else { - DEBUG(0,("handle_aio_write_complete: " - "aio_write_behind failed ! File %s " - "is corrupt ! Wanted %u bytes but " - "only wrote %d\n", fsp->fsp_name, - (unsigned int)numtowrite, - (int)nwritten )); - ret = EIO; - } - } else { - DEBUG(10,("handle_aio_write_complete: " - "aio_write_behind completed for file %s\n", - fsp->fsp_name )); - } - return 0; - } - /* We don't need outsize or set_message here as we've already set the fixed size length when we set up the aio call. */ @@ -611,115 +570,6 @@ int process_aio_queue(void) return ret; } -/**************************************************************************** - We're doing write behind and the client closed the file. Wait up to 30 - seconds (my arbitrary choice) for the aio to complete. Return 0 if all writes - completed, errno to return if not. -*****************************************************************************/ - -#define SMB_TIME_FOR_AIO_COMPLETE_WAIT 29 - -int wait_for_aio_completion(files_struct *fsp) -{ - struct aio_extra *aio_ex; - const SMB_STRUCT_AIOCB **aiocb_list; - int aio_completion_count = 0; - time_t start_time = time(NULL); - int seconds_left; - - for (seconds_left = SMB_TIME_FOR_AIO_COMPLETE_WAIT; - seconds_left >= 0;) { - int err = 0; - int i; - struct timespec ts; - - aio_completion_count = 0; - for( aio_ex = aio_list_head; aio_ex; aio_ex = aio_ex->next) { - if (aio_ex->fsp == fsp) { - aio_completion_count++; - } - } - - if (!aio_completion_count) { - return 0; - } - - DEBUG(3,("wait_for_aio_completion: waiting for %d aio events " - "to complete.\n", aio_completion_count )); - - aiocb_list = SMB_MALLOC_ARRAY(const SMB_STRUCT_AIOCB *, - aio_completion_count); - if (!aiocb_list) { - return ENOMEM; - } - - for( i = 0, aio_ex = aio_list_head; - aio_ex; - aio_ex = aio_ex->next) { - if (aio_ex->fsp == fsp) { - aiocb_list[i++] = &aio_ex->acb; - } - } - - /* Now wait up to seconds_left for completion. */ - ts.tv_sec = seconds_left; - ts.tv_nsec = 0; - - DEBUG(10,("wait_for_aio_completion: %d events, doing a wait " - "of %d seconds.\n", - aio_completion_count, seconds_left )); - - err = SMB_VFS_AIO_SUSPEND(fsp, aiocb_list, - aio_completion_count, &ts); - - DEBUG(10,("wait_for_aio_completion: returned err = %d, " - "errno = %s\n", err, strerror(errno) )); - - if (err == -1 && errno == EAGAIN) { - DEBUG(0,("wait_for_aio_completion: aio_suspend timed " - "out waiting for %d events after a wait of " - "%d seconds\n", aio_completion_count, - seconds_left)); - /* Timeout. */ - cancel_aio_by_fsp(fsp); - SAFE_FREE(aiocb_list); - return EIO; - } - - /* One or more events might have completed - process them if - * so. */ - for( i = 0; i < aio_completion_count; i++) { - uint16 mid = aiocb_list[i]->aio_sigevent.sigev_value.sival_int; - - aio_ex = find_aio_ex(mid); - - if (!aio_ex) { - DEBUG(0, ("wait_for_aio_completion: mid %u " - "doesn't match an aio record\n", - (unsigned int)mid )); - continue; - } - - if (!handle_aio_completed(aio_ex, &err)) { - continue; - } - delete_aio_ex(aio_ex); - } - - SAFE_FREE(aiocb_list); - seconds_left = SMB_TIME_FOR_AIO_COMPLETE_WAIT - - (time(NULL) - start_time); - } - - /* We timed out - we don't know why. Return ret if already an error, - * else EIO. */ - DEBUG(10,("wait_for_aio_completion: aio_suspend timed out waiting " - "for %d events\n", - aio_completion_count)); - - return EIO; -} - /**************************************************************************** Cancel any outstanding aio requests. The client doesn't care about the reply. *****************************************************************************/ @@ -778,8 +628,4 @@ void cancel_aio_by_fsp(files_struct *fsp) { } -BOOL wait_for_aio_completion(files_struct *fsp) -{ - return True; -} #endif diff --git a/source3/smbd/close.c b/source3/smbd/close.c index eea8fa01d50b..52cd90f54adf 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -321,18 +321,7 @@ static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_ NTSTATUS saved_status3 = NT_STATUS_OK; connection_struct *conn = fsp->conn; - if (fsp->aio_write_behind) { - /* - * If we're finishing write behind on a close we can get a write - * error here, we must remember this. - */ - int ret = wait_for_aio_completion(fsp); - if (ret) { - saved_status1 = map_nt_error_from_unix(ret); - } - } else { - cancel_aio_by_fsp(fsp); - } + cancel_aio_by_fsp(fsp); /* * If we're flushing on a close we can get a write diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index 44888b777f2e..6c8267ceed2f 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -279,7 +279,6 @@ void conn_free_internal(connection_struct *conn) free_namearray(conn->veto_list); free_namearray(conn->hide_list); free_namearray(conn->veto_oplock_list); - free_namearray(conn->aio_write_behind_list); string_free(&conn->user); string_free(&conn->dirpath); diff --git a/source3/smbd/files.c b/source3/smbd/files.c index fc1700de1188..fa162711ae92 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -610,7 +610,6 @@ NTSTATUS dup_file_fsp(files_struct *fsp, dup_fsp->modified = fsp->modified; dup_fsp->is_directory = fsp->is_directory; dup_fsp->is_stat = fsp->is_stat; - dup_fsp->aio_write_behind = fsp->aio_write_behind; string_set(&dup_fsp->fsp_name,fsp->fsp_name); *result = dup_fsp; diff --git a/source3/smbd/open.c b/source3/smbd/open.c index c9e29cf0e5a6..32f70eb0af65 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -368,11 +368,6 @@ static NTSTATUS open_file(files_struct *fsp, fsp->sent_oplock_break = NO_BREAK_SENT; fsp->is_directory = False; fsp->is_stat = False; - if (conn->aio_write_behind_list - && is_in_path(path, conn->aio_write_behind_list, - conn->case_sensitive)) { - fsp->aio_write_behind = True; - } string_set(&fsp->fsp_name, path); fsp->wcp = NULL; /* Write cache pointer. */ diff --git a/source3/smbd/service.c b/source3/smbd/service.c index c3bc89ec0d4d..eb464c29b276 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -772,7 +772,6 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser, conn->veto_list = NULL; conn->hide_list = NULL; conn->veto_oplock_list = NULL; - conn->aio_write_behind_list = NULL; string_set(&conn->dirpath,""); string_set(&conn->user,user);