diff options
author | Xavier Hernandez <xhernandez@datalab.es> | 2017-01-09 13:10:19 +0100 |
---|---|---|
committer | Jeff Darcy <jdarcy@redhat.com> | 2017-01-10 09:08:00 -0800 |
commit | d6bc8da62f1b0d454fa5187687fdbf894403c7ce (patch) | |
tree | 61e88283f778b3476a09e945e62492c63c1d0509 | |
parent | 167f417f73d7877e7b5ea5bf72e66964d463d4b6 (diff) |
libglusterfs: fix statvfs in FreeBSD
FreeBSD interprets statvfs' f_bsize field in a different way than Linux.
This fix modifies the value returned by statvfs() on FreeBSD to match
the expected value by Gluster.
Change-Id: I930dab6e895671157238146d333e95874ea28a08
BUG: 1356076
Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-on: http://review.gluster.org/16361
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
-rw-r--r-- | libglusterfs/src/syscall.c | 35 | ||||
-rw-r--r-- | libglusterfs/src/syscall.h | 3 |
2 files changed, 37 insertions, 1 deletions
diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index 93838e285a4..7336e06891a 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -326,7 +326,40 @@ sys_lseek (int fd, off_t offset, int whence) int sys_statvfs (const char *path, struct statvfs *buf) { - return statvfs (path, buf); + int ret; + + ret = statvfs (path, buf); +#ifdef __FreeBSD__ + /* FreeBSD doesn't return the expected vaule in buf->f_bsize. It + * contains the optimal I/O size instead of the file system block + * size. Gluster expects that this field contains the block size. + */ + if (ret == 0) { + buf->f_bsize = buf->f_frsize; + } +#endif /* __FreeBSD__ */ + + return ret; +} + + +int +sys_fstatvfs (int fd, struct statvfs *buf) +{ + int ret; + + ret = fstatvfs (fd, buf); +#ifdef __FreeBSD__ + /* FreeBSD doesn't return the expected vaule in buf->f_bsize. It + * contains the optimal I/O size instead of the file system block + * size. Gluster expects this field to contain the block size. + */ + if (ret == 0) { + buf->f_bsize = buf->f_frsize; + } +#endif /* __FreeBSD__ */ + + return ret; } diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h index 6fee9bd5c5c..1a2658b94f1 100644 --- a/libglusterfs/src/syscall.h +++ b/libglusterfs/src/syscall.h @@ -147,6 +147,9 @@ int sys_statvfs (const char *path, struct statvfs *buf); int +sys_fstatvfs (int fd, struct statvfs *buf); + +int sys_close (int fd); int |