summaryrefslogtreecommitdiff
path: root/source4/lib/tdb/common
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2007-08-28 14:25:46 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 15:03:01 -0500
commit8277256cee6328a130e3a714579a4bc766d66b9b (patch)
treef7f169f136119120c39319c38c4e4f3f54f50e78 /source4/lib/tdb/common
parent9cca9ddc79aa5c8035e090bbf217e667c790dec7 (diff)
downloadsamba-8277256cee6328a130e3a714579a4bc766d66b9b.tar.gz
samba-8277256cee6328a130e3a714579a4bc766d66b9b.tar.bz2
samba-8277256cee6328a130e3a714579a4bc766d66b9b.zip
r24738: Fix one more use of pwrite in tdb code in the spirit of r23972 and r23977.
Michael (This used to be commit 7b2cabea55cebb98e0fcee17066a0871667cd83f)
Diffstat (limited to 'source4/lib/tdb/common')
-rw-r--r--source4/lib/tdb/common/io.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/source4/lib/tdb/common/io.c b/source4/lib/tdb/common/io.c
index 86001dfdae..3b7e712cfe 100644
--- a/source4/lib/tdb/common/io.c
+++ b/source4/lib/tdb/common/io.c
@@ -88,12 +88,31 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off,
if (tdb->map_ptr) {
memcpy(off + (char *)tdb->map_ptr, buf, len);
- } else if (pwrite(tdb->fd, buf, len, off) != (ssize_t)len) {
- /* Ensure ecode is set for log fn. */
- tdb->ecode = TDB_ERR_IO;
- TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_write failed at %d len=%d (%s)\n",
- off, len, strerror(errno)));
- return TDB_ERRCODE(TDB_ERR_IO, -1);
+ } else {
+ ssize_t written = pwrite(tdb->fd, buf, len, off);
+ if ((written != (ssize_t)len) && (written != -1)) {
+ /* try once more */
+ TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: wrote only "
+ "%d of %d bytes at %d, trying once more\n",
+ written, len, off));
+ errno = ENOSPC;
+ written = pwrite(tdb->fd, (void *)((char *)buf+written),
+ len-written,
+ off+written);
+ }
+ if (written == -1) {
+ /* Ensure ecode is set for log fn. */
+ tdb->ecode = TDB_ERR_IO;
+ TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_write failed at %d "
+ "len=%d (%s)\n", off, len, strerror(errno)));
+ return TDB_ERRCODE(TDB_ERR_IO, -1);
+ } else if (written != (ssize_t)len) {
+ TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: failed to "
+ "write %d bytes at %d in two attempts\n",
+ len, off));
+ errno = ENOSPC;
+ return TDB_ERRCODE(TDB_ERR_IO, -1);
+ }
}
return 0;
}