Return ssize_t in fd.c I/O functions.
authorThomas Munro <tmunro@postgresql.org>
Fri, 1 Mar 2024 22:59:34 +0000 (11:59 +1300)
committerThomas Munro <tmunro@postgresql.org>
Fri, 1 Mar 2024 23:09:28 +0000 (12:09 +1300)
In the past, FileRead() and FileWrite() used types based on the Unix
read() and write() functions from before C and POSIX standardization,
though not exactly (we had int for amount instead of unsigned).  In
commit 2d4f1ba6 we changed to the appropriate standard C types, just
like the modern POSIX functions they wrap, but again not exactly: the
return type stayed as int.  In theory, a ssize_t value could be returned
by the underlying call that is too large for an int.

That wasn't really a live bug, because we don't expect PostgreSQL code
to perform reads or writes of gigabytes, and OSes probably apply
internal caps smaller than that anyway.  This change is done on the
principle that the return might as well follow the standard interfaces
consistently.

Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/1672202.1703441340%40sss.pgh.pa.us

src/backend/storage/file/fd.c
src/include/storage/fd.h

index d298e4842cac599d3bfdb5f595a7842c3cea2814..8c8e81f899bf16c171382c5519fc9c0470efd0e7 100644 (file)
@@ -2132,11 +2132,11 @@ FileWriteback(File file, off_t offset, off_t nbytes, uint32 wait_event_info)
        pgstat_report_wait_end();
 }
 
-int
+ssize_t
 FileReadV(File file, const struct iovec *iov, int iovcnt, off_t offset,
                  uint32 wait_event_info)
 {
-       int                     returnCode;
+       ssize_t         returnCode;
        Vfd                *vfdP;
 
        Assert(FileIsValid(file));
@@ -2188,11 +2188,11 @@ retry:
        return returnCode;
 }
 
-int
+ssize_t
 FileWriteV(File file, const struct iovec *iov, int iovcnt, off_t offset,
                   uint32 wait_event_info)
 {
-       int                     returnCode;
+       ssize_t         returnCode;
        Vfd                *vfdP;
 
        Assert(FileIsValid(file));
index 60bba5c97080c938c070646d1393f0d738e5881e..a173174db9710a593ffe54ae6eea30c4126dbcb4 100644 (file)
@@ -107,8 +107,8 @@ extern File PathNameOpenFilePerm(const char *fileName, int fileFlags, mode_t fil
 extern File OpenTemporaryFile(bool interXact);
 extern void FileClose(File file);
 extern int     FilePrefetch(File file, off_t offset, off_t amount, uint32 wait_event_info);
-extern int     FileReadV(File file, const struct iovec *ioc, int iovcnt, off_t offset, uint32 wait_event_info);
-extern int     FileWriteV(File file, const struct iovec *ioc, int iovcnt, off_t offset, uint32 wait_event_info);
+extern ssize_t FileReadV(File file, const struct iovec *ioc, int iovcnt, off_t offset, uint32 wait_event_info);
+extern ssize_t FileWriteV(File file, const struct iovec *ioc, int iovcnt, off_t offset, uint32 wait_event_info);
 extern int     FileSync(File file, uint32 wait_event_info);
 extern int     FileZero(File file, off_t offset, off_t amount, uint32 wait_event_info);
 extern int     FileFallocate(File file, off_t offset, off_t amount, uint32 wait_event_info);
@@ -192,7 +192,7 @@ extern int  durable_unlink(const char *fname, int elevel);
 extern void SyncDataDirectory(void);
 extern int     data_sync_elevel(int elevel);
 
-static inline int
+static inline ssize_t
 FileRead(File file, void *buffer, size_t amount, off_t offset,
                 uint32 wait_event_info)
 {
@@ -204,7 +204,7 @@ FileRead(File file, void *buffer, size_t amount, off_t offset,
        return FileReadV(file, &iov, 1, offset, wait_event_info);
 }
 
-static inline int
+static inline ssize_t
 FileWrite(File file, const void *buffer, size_t amount, off_t offset,
                  uint32 wait_event_info)
 {