r21279: Get rid of 'aio write behind', this is broken.
authorVolker Lendecke <vlendec@samba.org>
Sun, 11 Feb 2007 14:39:21 +0000 (14:39 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:17:53 +0000 (12:17 -0500)
It should probably better be integrated with our write cache.

Volker

source/include/smb.h
source/param/loadparm.c
source/smbd/aio.c
source/smbd/close.c
source/smbd/conn.c
source/smbd/files.c
source/smbd/open.c
source/smbd/service.c

index f9efa899583f56862b4fc31fcfc557f35296c607..cc03722c2b73d9a9f7179fe1e90d653528abd2bd 100644 (file)
@@ -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;
index d7b23f615fbf7e87f1b07dedd69ba731daf8df97..7abbd0ca4e0400e59745797397afba9a7df8dbf8 100644 (file)
@@ -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)
index 8a9fabf228607582b1106aabc4432312ae453797..a85cf901ae2e3bb2832dc650c05015f654523575 100644 (file)
@@ -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
index eea8fa01d50be5e59baf9a57b4ee31a731708ff9..52cd90f54adf580659ebec1121dd818d9f282c24 100644 (file)
@@ -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
index 44888b777f2e536b6d3014f7434a261f76d7d4df..6c8267ceed2f9cddc127eb556bc333a6fc4838f4 100644 (file)
@@ -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);
index fc1700de118898e4dfe3194fe15131406da465b0..fa162711ae92990a09c07a711ff32d719cd73675 100644 (file)
@@ -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;
index c9e29cf0e5a6dfcc5195aaa2c6dab42c9501da4a..32f70eb0af65ca0f962ad673f838f64f27fc46f6 100644 (file)
@@ -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. */
index c3bc89ec0d4d9cf3e5a857dea9e95f56670cc8f7..eb464c29b27665f77b25d6d569e773dc02b10def 100644 (file)
@@ -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);