summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-11-25 08:26:37 +0000
committerJeremy Allison <jra@samba.org>2001-11-25 08:26:37 +0000
commit391a72a95fda1a4d1841c29257b5001435c09dc1 (patch)
tree586d76b7cad1f63d46f237444f178a8da5b005ba
parent86dee43f390d7fdfdfb90c67189a38ed8398f8d9 (diff)
downloadsamba-391a72a95fda1a4d1841c29257b5001435c09dc1.tar.gz
samba-391a72a95fda1a4d1841c29257b5001435c09dc1.tar.bz2
samba-391a72a95fda1a4d1841c29257b5001435c09dc1.zip
#ifdefed DMF fix so not compiled by default. We need to look at this...
Jeremy. (This used to be commit 97dca242a91c68048e510f42be53421b533183be)
-rw-r--r--source3/smbd/fileio.c61
1 files changed, 39 insertions, 22 deletions
diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c
index edf58d4a8e..38da96b741 100644
--- a/source3/smbd/fileio.c
+++ b/source3/smbd/fileio.c
@@ -91,34 +91,51 @@ read from a file
ssize_t read_file(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n)
{
- ssize_t ret=0,readret;
+ ssize_t ret=0,readret;
- /* you can't read from print files */
- if (fsp->print_file) {
- return -1;
- }
+ /* you can't read from print files */
+ if (fsp->print_file)
+ return -1;
- /*
- * Serve from write cache if we can.
- */
- if(read_from_write_cache(fsp, data, pos, n))
- return n;
+ /*
+ * Serve from write cache if we can.
+ */
- flush_write_cache(fsp, READ_FLUSH);
+ if(read_from_write_cache(fsp, data, pos, n))
+ return n;
- if (seek_file(fsp,pos) == -1) {
- DEBUG(3,("read_file: Failed to seek to %.0f\n",(double)pos));
- return(ret);
- }
+ flush_write_cache(fsp, READ_FLUSH);
+
+ if (seek_file(fsp,pos) == -1) {
+ DEBUG(3,("read_file: Failed to seek to %.0f\n",(double)pos));
+ return(ret);
+ }
- if (n > 0) {
- readret = fsp->conn->vfs_ops.read(fsp,fsp->fd,data,n);
- if (readret == -1)
- return -1;
- if (readret > 0) ret += readret;
- }
+ if (n > 0) {
+#ifdef DMF_FIX
+ int numretries = 3;
+tryagain:
+ readret = fsp->conn->vfs_ops.read(fsp,fsp->fd,data,n);
+ if (readret == -1) {
+ if ((errno == EAGAIN) && numretries) {
+ DEBUG(3,("read_file EAGAIN retry in 10 seconds\n"));
+ (void)sleep(10);
+ --numretries;
+ goto tryagain;
+ }
+ return -1;
+ }
+#else /* NO DMF fix. */
+ readret = fsp->conn->vfs_ops.read(fsp,fsp->fd,data,n);
+ if (readret == -1)
+ return -1;
+#endif
+
+ if (readret > 0)
+ ret += readret;
+ }
- return(ret);
+ return(ret);
}
/* how many write cache buffers have been allocated */