diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2018-06-13 12:17:28 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2018-06-14 08:39:42 +0000 |
commit | 67b2233055091fad6ad7d14c65e3bc12871bab82 (patch) | |
tree | 64529a2e4aa5df901a130a8194f449e668178109 /xlators/storage | |
parent | b4f4480094b7c3ebda3319df0c3f96efd08b2176 (diff) |
storage/posix: Handle ENOSPC correctly in zero_fill
Change-Id: Icc521d86cc510f88b67d334b346095713899087a
fixes: bz#1591185
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
(cherry picked from commit 6ef91480f9e75f63100585bfd19694deb0c2457b)
Diffstat (limited to 'xlators/storage')
-rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c index 8727b9045b4..6fe25500312 100644 --- a/xlators/storage/posix/src/posix-inode-fd-ops.c +++ b/xlators/storage/posix/src/posix-inode-fd-ops.c @@ -784,17 +784,32 @@ _posix_do_zerofill(int fd, off_t offset, off_t len, int o_direct) op_ret = sys_writev (fd, vector, num_vect); if (op_ret < 0) goto err; + if (op_ret != (vect_size * num_vect)) { + op_ret = -1; + errno = ENOSPC; + goto err; + } } if (extra) { op_ret = sys_writev (fd, vector, extra); if (op_ret < 0) goto err; + if (op_ret != (vect_size * extra)) { + op_ret = -1; + errno = ENOSPC; + goto err; + } } if (remain) { vector[0].iov_len = remain; op_ret = sys_writev (fd, vector , 1); if (op_ret < 0) goto err; + if (op_ret != remain) { + op_ret = -1; + errno = ENOSPC; + goto err; + } } err: if (o_direct) @@ -866,8 +881,14 @@ posix_do_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, */ flags = FALLOC_FL_ZERO_RANGE; ret = sys_fallocate (pfd->fd, flags, offset, len); - if (ret == 0) + if (ret == 0) { goto fsync; + } else { + ret = -errno; + if ((ret != -ENOSYS) && (ret != -EOPNOTSUPP)) { + goto out; + } + } ret = _posix_do_zerofill (pfd->fd, offset, len, pfd->flags & O_DIRECT); if (ret < 0) { |