diff options
author | Jeremy Allison <jra@samba.org> | 2001-11-25 08:26:37 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-11-25 08:26:37 +0000 |
commit | 391a72a95fda1a4d1841c29257b5001435c09dc1 (patch) | |
tree | 586d76b7cad1f63d46f237444f178a8da5b005ba /source3/smbd | |
parent | 86dee43f390d7fdfdfb90c67189a38ed8398f8d9 (diff) | |
download | samba-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)
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/fileio.c | 61 |
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 */ |