diff options
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 67 | 
1 files changed, 67 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 93577cf54fc..36883403790 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -561,6 +561,72 @@ out:          return 0;  } +static int32_t +_posix_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t keep_size, +		off_t offset, size_t len, dict_t *xdata) +{ +	int32_t        op_ret    = -1; +        int32_t        op_errno  = 0; +        struct iatt    statpre     = {0,}; +        struct iatt    statpost    = {0,}; +        struct posix_fd *pfd = NULL; +        int32_t          ret = -1; +	int32_t		flags = 0; + +        DECLARE_OLD_FS_ID_VAR; + +        SET_FS_ID (frame->root->uid, frame->root->gid); + +        VALIDATE_OR_GOTO (frame, out); +        VALIDATE_OR_GOTO (this, out); +        VALIDATE_OR_GOTO (fd, out); + +        ret = posix_fd_ctx_get (fd, this, &pfd); +        if (ret < 0) { +                op_errno = -ret; +                gf_log (this->name, GF_LOG_DEBUG, +                        "pfd is NULL from fd=%p", fd); +                goto out; +        } + +        op_ret = posix_fdstat (this, pfd->fd, &statpre); +        if (op_ret == -1) { +                op_errno = errno; +                gf_log (this->name, GF_LOG_ERROR, +                        "fallocate (fstat) failed on fd=%p: %s", fd, +                        strerror (op_errno)); +                goto out; +        } + +	if (keep_size) +		flags = FALLOC_FL_KEEP_SIZE; + +	op_ret = sys_fallocate(pfd->fd, flags, offset, len); +	if (op_ret == -1) { +		op_errno = errno; +		goto out; +	} + +        op_ret = posix_fdstat (this, pfd->fd, &statpost); +        if (op_ret == -1) { +                op_errno = errno; +                gf_log (this->name, GF_LOG_ERROR, +                        "fallocate (fstat) failed on fd=%p: %s", fd, +                        strerror (op_errno)); +                goto out; +        } + +        op_ret = 0; + +out: +        SET_TO_OLD_FS_ID (); + +        STACK_UNWIND_STRICT (fallocate, frame, op_ret, op_errno, +                             &statpre, &statpost, NULL); + +        return 0; +} +  int32_t  posix_opendir (call_frame_t *frame, xlator_t *this,                 loc_t *loc, fd_t *fd, dict_t *xdata) @@ -4659,6 +4725,7 @@ struct xlator_fops fops = {          .fxattrop    = posix_fxattrop,          .setattr     = posix_setattr,          .fsetattr    = posix_fsetattr, +	.fallocate   = _posix_fallocate,  };  struct xlator_cbks cbks = {  | 
