svn commit: samba r24347 - in branches/SAMBA_3_2/source/smbd: .

vlendec at samba.org vlendec at samba.org
Sun Aug 12 11:22:28 GMT 2007


Author: vlendec
Date: 2007-08-12 11:22:26 +0000 (Sun, 12 Aug 2007)
New Revision: 24347

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

Log:
fake_sendfile does not need Inbuf/Outbuf

In the future, we might put the new Linux splice(2) syscall here. This
should also work for reply_write, but getting that in is a bit trickier.
We need to decide very early before fetching the whole buffer that we
have a write call.

Modified:
   branches/SAMBA_3_2/source/smbd/reply.c


Changeset:
Modified: branches/SAMBA_3_2/source/smbd/reply.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/reply.c	2007-08-12 09:16:54 UTC (rev 24346)
+++ branches/SAMBA_3_2/source/smbd/reply.c	2007-08-12 11:22:26 UTC (rev 24347)
@@ -2333,10 +2333,23 @@
  Fake (read/write) sendfile. Returns -1 on read or write fail.
 ****************************************************************************/
 
-static ssize_t fake_sendfile(files_struct *fsp, SMB_OFF_T startpos, size_t nread, char *buf, size_t bufsize)
+static ssize_t fake_sendfile(files_struct *fsp, SMB_OFF_T startpos,
+			     size_t nread)
 {
+	size_t bufsize;
 	size_t tosend = nread;
+	char *buf;
 
+	if (nread == 0) {
+		return 0;
+	}
+
+	bufsize = MIN(nread, 65536);
+
+	if (!(buf = SMB_MALLOC_ARRAY(char, bufsize))) {
+		return -1;
+	}
+
 	while (tosend > 0) {
 		ssize_t ret;
 		size_t cur_read;
@@ -2348,6 +2361,7 @@
 		}
 		ret = read_file(fsp,buf,startpos,cur_read);
 		if (ret == -1) {
+			SAFE_FREE(buf);
 			return -1;
 		}
 
@@ -2357,12 +2371,14 @@
 		}
 
 		if (write_data(smbd_server_fd(),buf,cur_read) != cur_read) {
+			SAFE_FREE(buf);
 			return -1;
 		}
 		tosend -= cur_read;
 		startpos += cur_read;
 	}
 
+	SAFE_FREE(buf);
 	return (ssize_t)nread;
 }
 
@@ -2408,7 +2424,7 @@
 				set_use_sendfile(SNUM(conn), False);
 				DEBUG(0,("send_file_readbraw: sendfile not available. Faking..\n"));
 
-				if (fake_sendfile(fsp, startpos, nread, outbuf + 4, out_buffsize - 4) == -1) {
+				if (fake_sendfile(fsp, startpos, nread) == -1) {
 					DEBUG(0,("send_file_readbraw: fake_sendfile failed for file %s (%s).\n",
 						fsp->fsp_name, strerror(errno) ));
 					exit_server_cleanly("send_file_readbraw fake_sendfile failed");
@@ -2806,9 +2822,9 @@
 				/* Ensure we don't do this again. */
 				set_use_sendfile(SNUM(conn), False);
 				DEBUG(0,("send_file_readX: sendfile not available. Faking..\n"));
-
-				if ((nread = fake_sendfile(fsp, startpos, smb_maxcnt, data,
-							len_outbuf - (data-outbuf))) == -1) {
+				nread = fake_sendfile(fsp, startpos,
+						      smb_maxcnt);
+				if (nread == -1) {
 					DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
 						fsp->fsp_name, strerror(errno) ));
 					exit_server_cleanly("send_file_readX: fake_sendfile failed");
@@ -2844,8 +2860,8 @@
 				fsp->fsp_name, strerror(errno) ));
 			exit_server_cleanly("send_file_readX sendfile failed");
 		}
-		if ((nread = fake_sendfile(fsp, startpos, smb_maxcnt, data,
-					len_outbuf - (data-outbuf))) == -1) {
+		nread = fake_sendfile(fsp, startpos, smb_maxcnt);
+		if (nread == -1) {
 			DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
 				fsp->fsp_name, strerror(errno) ));
 			exit_server_cleanly("send_file_readX: fake_sendfile failed");



More information about the samba-cvs mailing list