Author: obnox Date: 2007-08-28 14:25:46 +0000 (Tue, 28 Aug 2007) New Revision: 24738
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24738 Log: Fix one more use of pwrite in tdb code in the spirit of r23972 and r23977. Michael Modified: branches/SAMBA_3_0_25/source/tdb/common/io.c branches/SAMBA_3_2/source/lib/tdb/common/io.c branches/SAMBA_3_2_0/source/lib/tdb/common/io.c branches/SAMBA_4_0/source/lib/tdb/common/io.c Changeset: Modified: branches/SAMBA_3_0_25/source/tdb/common/io.c =================================================================== --- branches/SAMBA_3_0_25/source/tdb/common/io.c 2007-08-28 14:20:53 UTC (rev 24737) +++ branches/SAMBA_3_0_25/source/tdb/common/io.c 2007-08-28 14:25:46 UTC (rev 24738) @@ -89,12 +89,31 @@ 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; } Modified: branches/SAMBA_3_2/source/lib/tdb/common/io.c =================================================================== --- branches/SAMBA_3_2/source/lib/tdb/common/io.c 2007-08-28 14:20:53 UTC (rev 24737) +++ branches/SAMBA_3_2/source/lib/tdb/common/io.c 2007-08-28 14:25:46 UTC (rev 24738) @@ -88,12 +88,31 @@ 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; } Modified: branches/SAMBA_3_2_0/source/lib/tdb/common/io.c =================================================================== --- branches/SAMBA_3_2_0/source/lib/tdb/common/io.c 2007-08-28 14:20:53 UTC (rev 24737) +++ branches/SAMBA_3_2_0/source/lib/tdb/common/io.c 2007-08-28 14:25:46 UTC (rev 24738) @@ -88,12 +88,31 @@ 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; } Modified: branches/SAMBA_4_0/source/lib/tdb/common/io.c =================================================================== --- branches/SAMBA_4_0/source/lib/tdb/common/io.c 2007-08-28 14:20:53 UTC (rev 24737) +++ branches/SAMBA_4_0/source/lib/tdb/common/io.c 2007-08-28 14:25:46 UTC (rev 24738) @@ -88,12 +88,31 @@ 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; }
