svn commit: samba r21279 - in branches/SAMBA_3_0/source: include param smbd

vlendec at samba.org vlendec at samba.org
Sun Feb 11 14:39:22 GMT 2007


Author: vlendec
Date: 2007-02-11 14:39:21 +0000 (Sun, 11 Feb 2007)
New Revision: 21279

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21279

Log:
Get rid of 'aio write behind', this is broken.

It should probably better be integrated with our write cache.

Volker

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


Changeset:
Modified: branches/SAMBA_3_0/source/include/smb.h
===================================================================
--- branches/SAMBA_3_0/source/include/smb.h	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/include/smb.h	2007-02-11 14:39:21 UTC (rev 21279)
@@ -512,7 +512,6 @@
 	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 @@
 	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;

Modified: branches/SAMBA_3_0/source/param/loadparm.c
===================================================================
--- branches/SAMBA_3_0/source/param/loadparm.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/param/loadparm.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -368,7 +368,6 @@
 	char *fstype;
 	char **szVfsObjects;
 	char *szMSDfsProxy;
-	char *szAioWriteBehind;
 	char *szDfree;
 	int iMinPrintSpace;
 	int iMaxPrintJobs;
@@ -508,7 +507,6 @@
 	NULL,			/* fstype */
 	NULL,			/* vfs objects */
 	NULL,                   /* szMSDfsProxy */
-	NULL,			/* szAioWriteBehind */
 	NULL,			/* szDfree */
 	0,			/* iMinPrintSpace */
 	1000,			/* iMaxPrintJobs */
@@ -962,7 +960,6 @@
 	{"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_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)

Modified: branches/SAMBA_3_0/source/smbd/aio.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/aio.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/aio.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -284,7 +284,6 @@
 	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 @@
 		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 @@
 	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. */
 
@@ -612,115 +571,6 @@
 }
 
 /****************************************************************************
- 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 @@
 {
 }
 
-BOOL wait_for_aio_completion(files_struct *fsp)
-{
-	return True;
-}
 #endif

Modified: branches/SAMBA_3_0/source/smbd/close.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/close.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/close.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -321,18 +321,7 @@
 	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

Modified: branches/SAMBA_3_0/source/smbd/conn.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/conn.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/conn.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -279,7 +279,6 @@
 	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);

Modified: branches/SAMBA_3_0/source/smbd/files.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/files.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/files.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -610,7 +610,6 @@
 	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;

Modified: branches/SAMBA_3_0/source/smbd/open.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/open.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/open.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -368,11 +368,6 @@
 	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. */

Modified: branches/SAMBA_3_0/source/smbd/service.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/service.c	2007-02-11 14:07:50 UTC (rev 21278)
+++ branches/SAMBA_3_0/source/smbd/service.c	2007-02-11 14:39:21 UTC (rev 21279)
@@ -772,7 +772,6 @@
 	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);
 



More information about the samba-cvs mailing list