diff options
Diffstat (limited to 'src/bin/pg_basebackup/walmethods.c')
-rw-r--r-- | src/bin/pg_basebackup/walmethods.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 267a40debbf..331d0e72757 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -128,7 +128,11 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ pg_free(zerobuf); close(fd); - errno = save_errno; + + /* + * If write didn't set errno, assume problem is no disk space. + */ + errno = save_errno ? save_errno : ENOSPC; return NULL; } } @@ -442,7 +446,14 @@ tar_write_compressed_data(void *buf, size_t count, bool flush) size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out; if (write(tar_data->fd, tar_data->zlibOut, len) != len) + { + /* + * If write didn't set errno, assume problem is no disk space. + */ + if (errno == 0) + errno = ENOSPC; return false; + } tar_data->zp->next_out = tar_data->zlibOut; tar_data->zp->avail_out = ZLIB_OUT_SIZE; @@ -623,7 +634,8 @@ tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_ save_errno = errno; pg_free(tar_data->currentfile); tar_data->currentfile = NULL; - errno = save_errno; + /* if write didn't set errno, assume problem is no disk space */ + errno = save_errno ? save_errno : ENOSPC; return NULL; } } @@ -818,7 +830,12 @@ tar_close(Walfile f, WalCloseMethod method) if (!tar_data->compression) { if (write(tar_data->fd, tf->header, 512) != 512) + { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; return -1; + } } #ifdef HAVE_LIBZ else @@ -884,7 +901,12 @@ tar_finish(void) if (!tar_data->compression) { if (write(tar_data->fd, zerobuf, sizeof(zerobuf)) != sizeof(zerobuf)) + { + /* if write didn't set errno, assume problem is no disk space */ + if (errno == 0) + errno = ENOSPC; return false; + } } #ifdef HAVE_LIBZ else @@ -911,7 +933,15 @@ tar_finish(void) size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out; if (write(tar_data->fd, tar_data->zlibOut, len) != len) + { + /* + * If write didn't set errno, assume problem is no disk + * space. + */ + if (errno == 0) + errno = ENOSPC; return false; + } } if (r == Z_STREAM_END) break; |