diff options
Diffstat (limited to 'xlators/features/quiesce/src/quiesce.c')
| -rw-r--r-- | xlators/features/quiesce/src/quiesce.c | 2093 |
1 files changed, 1568 insertions, 525 deletions
diff --git a/xlators/features/quiesce/src/quiesce.c b/xlators/features/quiesce/src/quiesce.c index cb52d0ee5..24c7dc6ed 100644 --- a/xlators/features/quiesce/src/quiesce.c +++ b/xlators/features/quiesce/src/quiesce.c @@ -1,22 +1,12 @@ /* - Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. -*/ + Copyright (c) 2010-2012 Red Hat, Inc. <http://www.redhat.com> + This file is part of GlusterFS. + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ #ifndef _CONFIG_H #define _CONFIG_H #include "config.h" @@ -26,13 +16,41 @@ #include "defaults.h" #include "call-stub.h" +/* TODO: */ +/* Think about 'writev/_*_lk/setattr/xattrop/' fops to do re-transmittion */ + + /* Quiesce Specific Functions */ +void +gf_quiesce_local_wipe (xlator_t *this, quiesce_local_t *local) +{ + if (!local || !this || !this->private) + return; + + if (local->loc.inode) + loc_wipe (&local->loc); + if (local->fd) + fd_unref (local->fd); + GF_FREE (local->name); + GF_FREE (local->volname); + if (local->dict) + dict_unref (local->dict); + if (local->iobref) + iobref_unref (local->iobref); + GF_FREE (local->vector); + + mem_put (local); +} + call_stub_t * -gf_quiesce_dequeue (quiesce_priv_t *priv) +gf_quiesce_dequeue (xlator_t *this) { call_stub_t *stub = NULL; + quiesce_priv_t *priv = NULL; + + priv = this->private; - if (list_empty (&priv->req)) + if (!priv || list_empty (&priv->req)) return NULL; LOCK (&priv->lock); @@ -46,21 +64,6 @@ gf_quiesce_dequeue (quiesce_priv_t *priv) return stub; } - -void -gf_quiesce_enqueue (quiesce_priv_t *priv, call_stub_t *stub) -{ - LOCK (&priv->lock); - { - list_add_tail (&stub->list, &priv->req); - priv->queue_size++; - } - UNLOCK (&priv->lock); - - return; -} - - void * gf_quiesce_dequeue_start (void *data) { @@ -73,7 +76,7 @@ gf_quiesce_dequeue_start (void *data) THIS = this; while (!list_empty (&priv->req)) { - stub = gf_quiesce_dequeue (priv); + stub = gf_quiesce_dequeue (this); if (stub) { call_resume (stub); } @@ -88,7 +91,6 @@ gf_quiesce_timeout (void *data) { xlator_t *this = NULL; quiesce_priv_t *priv = NULL; - int need_dequeue = 0; this = data; priv = this->private; @@ -97,7 +99,6 @@ gf_quiesce_timeout (void *data) LOCK (&priv->lock); { priv->pass_through = _gf_true; - need_dequeue = (priv->queue_size)? 1:0; } UNLOCK (&priv->lock); @@ -106,268 +107,924 @@ gf_quiesce_timeout (void *data) return; } -/* FOP */ +void +gf_quiesce_enqueue (xlator_t *this, call_stub_t *stub) +{ + quiesce_priv_t *priv = NULL; + struct timespec timeout = {0,}; + + priv = this->private; + if (!priv) { + gf_log_callingfn (this->name, GF_LOG_ERROR, + "this->private == NULL"); + return; + } + + LOCK (&priv->lock); + { + list_add_tail (&stub->list, &priv->req); + priv->queue_size++; + } + UNLOCK (&priv->lock); + + if (!priv->timer) { + timeout.tv_sec = 20; + timeout.tv_nsec = 0; + + priv->timer = gf_timer_call_after (this->ctx, + timeout, + gf_quiesce_timeout, + (void *) this); + } + + return; +} + + + +/* _CBK function section */ int32_t -quiesce_fgetxattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - const char *name) +quiesce_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, dict_t *dict, struct iatt *postparent) { - quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_lookup_stub (frame, default_lookup_resume, + &local->loc, local->dict); + if (!stub) { + STACK_UNWIND_STRICT (lookup, frame, -1, ENOMEM, + NULL, NULL, NULL, NULL); + goto out; + } - priv = this->private; + gf_quiesce_enqueue (this, stub); + goto out; + } - if (priv->pass_through) { - STACK_WIND (frame, - default_fgetxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fgetxattr, - fd, - name); - return 0; + STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, + dict, postparent); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *buf, + dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_stat_stub (frame, default_stat_resume, + &local->loc, xdata); + if (!stub) { + STACK_UNWIND_STRICT (stat, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_fgetxattr_stub (frame, default_fgetxattr_resume, fd, name); - if (!stub) { - STACK_UNWIND_STRICT (fgetxattr, frame, -1, ENOMEM, NULL); - return 0; + STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, buf, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_access_stub (frame, default_access_resume, + &local->loc, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (access, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (access, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_fsetxattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - dict_t *dict, - int32_t flags) +quiesce_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, const char *path, + struct iatt *buf, dict_t *xdata) { - quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_readlink_stub (frame, default_readlink_resume, + &local->loc, local->size, xdata); + if (!stub) { + STACK_UNWIND_STRICT (readlink, frame, -1, ENOMEM, + NULL, NULL, NULL); + goto out; + } - priv = this->private; + gf_quiesce_enqueue (this, stub); + goto out; + } - if (priv->pass_through) { - STACK_WIND (frame, - default_fsetxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsetxattr, - fd, - dict, - flags); - return 0; + STACK_UNWIND_STRICT (readlink, frame, op_ret, op_errno, path, buf, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_open_stub (frame, default_open_resume, + &local->loc, local->flag, local->fd, + xdata); + if (!stub) { + STACK_UNWIND_STRICT (open, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_fsetxattr_stub (frame, default_fsetxattr_resume, - fd, dict, flags); - if (!stub) { - STACK_UNWIND_STRICT (fsetxattr, frame, -1, ENOMEM); - return 0; + STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iovec *vector, + int32_t count, struct iatt *stbuf, struct iobref *iobref, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_readv_stub (frame, default_readv_resume, + local->fd, local->size, local->offset, + local->io_flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, + NULL, 0, NULL, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count, + stbuf, iobref, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_setxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *dict, - int32_t flags) +quiesce_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) { - quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_flush_stub (frame, default_flush_resume, + local->fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM, NULL); + goto out; + } - priv = this->private; + gf_quiesce_enqueue (this, stub); + goto out; + } - if (priv->pass_through) { - STACK_WIND (frame, - default_setxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setxattr, - loc, - dict, - flags); - return 0; + STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + + +int32_t +quiesce_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *prebuf, + struct iatt *postbuf, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fsync_stub (frame, default_fsync_resume, + local->fd, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, + NULL, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_setxattr_stub (frame, default_setxattr_resume, - loc, dict, flags); - if (!stub) { - STACK_UNWIND_STRICT (setxattr, frame, -1, ENOMEM); - return 0; + STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *buf, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fstat_stub (frame, default_fstat_resume, + local->fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fstat, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (fstat, frame, op_ret, op_errno, buf, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_statfs (call_frame_t *frame, - xlator_t *this, - loc_t *loc) +quiesce_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_opendir_stub (frame, default_opendir_resume, + &local->loc, local->fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (opendir, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (opendir, frame, op_ret, op_errno, fd, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fsyncdir_stub (frame, default_fsyncdir_resume, + local->fd, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fsyncdir, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (fsyncdir, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct statvfs *buf, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_statfs_stub (frame, default_statfs_resume, + &local->loc, xdata); + if (!stub) { + STACK_UNWIND_STRICT (statfs, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (statfs, frame, op_ret, op_errno, buf, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_fgetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fgetxattr_stub (frame, default_fgetxattr_resume, + local->fd, local->name, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fgetxattr, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (fgetxattr, frame, op_ret, op_errno, dict, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +int32_t +quiesce_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_getxattr_stub (frame, default_getxattr_resume, + &local->loc, local->name, xdata); + if (!stub) { + STACK_UNWIND_STRICT (getxattr, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +int32_t +quiesce_rchecksum_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, uint32_t weak_checksum, + uint8_t *strong_checksum, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_rchecksum_stub (frame, default_rchecksum_resume, + local->fd, local->offset, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (rchecksum, frame, -1, ENOMEM, + 0, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (rchecksum, frame, op_ret, op_errno, weak_checksum, + strong_checksum, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +int32_t +quiesce_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, gf_dirent_t *entries, dict_t *xdata) { - quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_readdir_stub (frame, default_readdir_resume, + local->fd, local->size, local->offset, xdata); + if (!stub) { + STACK_UNWIND_STRICT (readdir, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (readdir, frame, op_ret, op_errno, entries, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +int32_t +quiesce_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, gf_dirent_t *entries, dict_t *xdata) +{ + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_readdirp_stub (frame, default_readdirp_resume, + local->fd, local->size, local->offset, + local->dict); + if (!stub) { + STACK_UNWIND_STRICT (readdirp, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; + } + + STACK_UNWIND_STRICT (readdirp, frame, op_ret, op_errno, entries, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +#if 0 + +int32_t +quiesce_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *prebuf, + struct iatt *postbuf, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { - STACK_WIND (frame, - default_statfs_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->statfs, - loc); - return 0; + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_writev_stub (frame, default_writev_resume, + local->fd, local->vector, local->flag, + local->offset, local->io_flags, + local->iobref, xdata); + if (!stub) { + STACK_UNWIND_STRICT (writev, frame, -1, ENOMEM, + NULL, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_statfs_stub (frame, default_statfs_resume, loc); - if (!stub) { - STACK_UNWIND_STRICT (statfs, frame, -1, ENOMEM, NULL); - return 0; + STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_xattrop_stub (frame, default_xattrop_resume, + &local->loc, local->xattrop_flags, + local->dict, xdata); + if (!stub) { + STACK_UNWIND_STRICT (xattrop, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, dict, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_fsyncdir (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) +quiesce_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata) { - quiesce_priv_t *priv = NULL; + quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { - STACK_WIND (frame, - default_fsyncdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsyncdir, - fd, - flags); - return 0; + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fxattrop_stub (frame, default_fxattrop_resume, + local->fd, local->xattrop_flags, + local->dict, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fxattrop, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_fsyncdir_stub (frame, default_fsyncdir_resume, fd, flags); - if (!stub) { - STACK_UNWIND_STRICT (fsyncdir, frame, -1, ENOMEM); - return 0; + STACK_UNWIND_STRICT (fxattrop, frame, op_ret, op_errno, dict, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct gf_flock *lock, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_lk_stub (frame, default_lk_resume, + local->fd, local->flag, &local->flock, xdata); + if (!stub) { + STACK_UNWIND_STRICT (lk, frame, -1, ENOMEM, + NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (lk, frame, op_ret, op_errno, lock, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, fd_t *fd) +quiesce_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) { - quiesce_priv_t *priv = NULL; + quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { - STACK_WIND (frame, - default_opendir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->opendir, - loc, fd); - return 0; + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_inodelk_stub (frame, default_inodelk_resume, + local->volname, &local->loc, + local->flag, &local->flock, xdata); + if (!stub) { + STACK_UNWIND_STRICT (inodelk, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_opendir_stub (frame, default_opendir_resume, loc, fd); - if (!stub) { - STACK_UNWIND_STRICT (opendir, frame, -1, ENOMEM, NULL); - return 0; + STACK_UNWIND_STRICT (inodelk, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + + +int32_t +quiesce_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_finodelk_stub (frame, default_finodelk_resume, + local->volname, local->fd, + local->flag, &local->flock, xdata); + if (!stub) { + STACK_UNWIND_STRICT (finodelk, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (finodelk, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_fstat (call_frame_t *frame, - xlator_t *this, - fd_t *fd) +quiesce_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) { - quiesce_priv_t *priv = NULL; + quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { - STACK_WIND (frame, - default_fstat_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fstat, - fd); - return 0; + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_entrylk_stub (frame, default_entrylk_resume, + local->volname, &local->loc, + local->name, local->cmd, local->type, xdata); + if (!stub) { + STACK_UNWIND_STRICT (entrylk, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_fstat_stub (frame, default_fstat_resume, fd); - if (!stub) { - STACK_UNWIND_STRICT (fstat, frame, -1, ENOMEM, NULL); - return 0; + STACK_UNWIND_STRICT (entrylk, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_fentrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fentrylk_stub (frame, default_fentrylk_resume, + local->volname, local->fd, + local->name, local->cmd, local->type, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fentrylk, frame, -1, ENOMEM, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (fentrylk, frame, op_ret, op_errno, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } int32_t -quiesce_fsync (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) +quiesce_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *statpre, + struct iatt *statpost, dict_t *xdata) { - quiesce_priv_t *priv = NULL; + quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { - STACK_WIND (frame, - default_fsync_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsync, - fd, - flags); - return 0; + local = frame->local; + frame->local = NULL; + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_setattr_stub (frame, default_setattr_resume, + &local->loc, &local->stbuf, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (setattr, frame, -1, ENOMEM, + NULL, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - stub = fop_fsync_stub (frame, default_fsync_resume, fd, flags); - if (!stub) { - STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL, NULL); - return 0; + STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, statpre, + statpost, xdata); +out: + gf_quiesce_local_wipe (this, local); + + return 0; +} + +int32_t +quiesce_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct iatt *statpre, + struct iatt *statpost, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + local = frame->local; + frame->local = NULL; + + if ((op_ret == -1) && (op_errno == ENOTCONN)) { + /* Re-transmit (by putting in the queue) */ + stub = fop_fsetattr_stub (frame, default_fsetattr_resume, + local->fd, &local->stbuf, local->flag, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fsetattr, frame, -1, ENOMEM, + NULL, NULL, NULL); + goto out; + } + + gf_quiesce_enqueue (this, stub); + goto out; } - gf_quiesce_enqueue (priv, stub); + STACK_UNWIND_STRICT (fsetattr, frame, op_ret, op_errno, statpre, + statpost, xdata); +out: + gf_quiesce_local_wipe (this, local); return 0; } +#endif /* if 0 */ + + +/* FOP */ + +/* No retransmittion */ + int32_t -quiesce_flush (call_frame_t *frame, - xlator_t *this, - fd_t *fd) +quiesce_removexattr (call_frame_t *frame, + xlator_t *this, + loc_t *loc, + const char *name, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -376,32 +1033,31 @@ quiesce_flush (call_frame_t *frame, if (priv->pass_through) { STACK_WIND (frame, - default_flush_cbk, + default_removexattr_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->flush, - fd); - return 0; + FIRST_CHILD(this)->fops->removexattr, + loc, + name, xdata); + return 0; } - stub = fop_flush_stub (frame, default_flush_resume, fd); + stub = fop_removexattr_stub (frame, default_removexattr_resume, + loc, name, xdata); if (!stub) { - STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (removexattr, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int32_t -quiesce_writev (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iovec *vector, - int32_t count, - off_t off, - struct iobref *iobref) +quiesce_truncate (call_frame_t *frame, + xlator_t *this, + loc_t *loc, + off_t offset, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -410,35 +1066,31 @@ quiesce_writev (call_frame_t *frame, if (priv->pass_through) { STACK_WIND (frame, - default_writev_cbk, + default_truncate_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->writev, - fd, - vector, - count, - off, - iobref); - return 0; + FIRST_CHILD(this)->fops->truncate, + loc, + offset, xdata); + return 0; } - stub = fop_writev_stub (frame, default_writev_resume, - fd, vector, count, off, iobref); + stub = fop_truncate_stub (frame, default_truncate_resume, loc, offset, xdata); if (!stub) { - STACK_UNWIND_STRICT (writev, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (truncate, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int32_t -quiesce_readv (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset) +quiesce_fsetxattr (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + dict_t *dict, + int32_t flags, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -447,34 +1099,33 @@ quiesce_readv (call_frame_t *frame, if (priv->pass_through) { STACK_WIND (frame, - default_readv_cbk, + default_fsetxattr_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readv, + FIRST_CHILD(this)->fops->fsetxattr, fd, - size, - offset); - return 0; + dict, + flags, xdata); + return 0; } - stub = fop_readv_stub (frame, default_readv_resume, fd, size, offset); + stub = fop_fsetxattr_stub (frame, default_fsetxattr_resume, + fd, dict, flags, xdata); if (!stub) { - STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, - NULL, 0, NULL, NULL); + STACK_UNWIND_STRICT (fsetxattr, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } - int32_t -quiesce_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, fd_t *fd, - int32_t wbflags) +quiesce_setxattr (call_frame_t *frame, + xlator_t *this, + loc_t *loc, + dict_t *dict, + int32_t flags, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -483,21 +1134,23 @@ quiesce_open (call_frame_t *frame, if (priv->pass_through) { STACK_WIND (frame, - default_open_cbk, + default_setxattr_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->open, - loc, flags, fd, wbflags); - return 0; + FIRST_CHILD(this)->fops->setxattr, + loc, + dict, + flags, xdata); + return 0; } - stub = fop_open_stub (frame, default_open_resume, loc, - flags, fd, wbflags); + stub = fop_setxattr_stub (frame, default_setxattr_resume, + loc, dict, flags, xdata); if (!stub) { - STACK_UNWIND_STRICT (open, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (setxattr, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -505,7 +1158,7 @@ quiesce_open (call_frame_t *frame, int32_t quiesce_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, mode_t mode, - fd_t *fd, dict_t *params) + mode_t umask, fd_t *fd, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -513,22 +1166,24 @@ quiesce_create (call_frame_t *frame, xlator_t *this, priv = this->private; if (priv->pass_through) { + /* Don't send O_APPEND below, as write() re-transmittions can + fail with O_APPEND */ STACK_WIND (frame, default_create_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->create, - loc, flags, mode, fd, params); - return 0; + loc, (flags & ~O_APPEND), mode, umask, fd, xdata); + return 0; } stub = fop_create_stub (frame, default_create_resume, - loc, flags, mode, fd, params); + loc, (flags & ~O_APPEND), mode, umask, fd, xdata); if (!stub) { STACK_UNWIND_STRICT (create, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -537,7 +1192,7 @@ int32_t quiesce_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, - loc_t *newloc) + loc_t *newloc, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -549,18 +1204,18 @@ quiesce_link (call_frame_t *frame, default_link_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->link, - oldloc, newloc); - return 0; + oldloc, newloc, xdata); + return 0; } - stub = fop_link_stub (frame, default_link_resume, oldloc, newloc); + stub = fop_link_stub (frame, default_link_resume, oldloc, newloc, xdata); if (!stub) { STACK_UNWIND_STRICT (link, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -569,7 +1224,7 @@ int32_t quiesce_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, - loc_t *newloc) + loc_t *newloc, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -581,18 +1236,18 @@ quiesce_rename (call_frame_t *frame, default_rename_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->rename, - oldloc, newloc); - return 0; + oldloc, newloc, xdata); + return 0; } - stub = fop_rename_stub (frame, default_rename_resume, oldloc, newloc); + stub = fop_rename_stub (frame, default_rename_resume, oldloc, newloc, xdata); if (!stub) { STACK_UNWIND_STRICT (rename, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -600,7 +1255,7 @@ quiesce_rename (call_frame_t *frame, int quiesce_symlink (call_frame_t *frame, xlator_t *this, - const char *linkpath, loc_t *loc, dict_t *params) + const char *linkpath, loc_t *loc, mode_t umask, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -611,26 +1266,26 @@ quiesce_symlink (call_frame_t *frame, xlator_t *this, STACK_WIND (frame, default_symlink_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->symlink, - linkpath, loc, params); - return 0; + linkpath, loc, umask, xdata); + return 0; } stub = fop_symlink_stub (frame, default_symlink_resume, - linkpath, loc, params); + linkpath, loc, umask, xdata); if (!stub) { STACK_UNWIND_STRICT (symlink, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int -quiesce_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags) +quiesce_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -641,17 +1296,17 @@ quiesce_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags) STACK_WIND (frame, default_rmdir_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->rmdir, - loc, flags); - return 0; + loc, flags, xdata); + return 0; } - stub = fop_rmdir_stub (frame, default_rmdir_resume, loc, flags); + stub = fop_rmdir_stub (frame, default_rmdir_resume, loc, flags, xdata); if (!stub) { - STACK_UNWIND_STRICT (rmdir, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (rmdir, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -659,7 +1314,7 @@ quiesce_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags) int32_t quiesce_unlink (call_frame_t *frame, xlator_t *this, - loc_t *loc) + loc_t *loc, int xflag, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -671,24 +1326,24 @@ quiesce_unlink (call_frame_t *frame, default_unlink_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->unlink, - loc); - return 0; + loc, xflag, xdata); + return 0; } - stub = fop_unlink_stub (frame, default_unlink_resume, loc); + stub = fop_unlink_stub (frame, default_unlink_resume, loc, xflag, xdata); if (!stub) { - STACK_UNWIND_STRICT (unlink, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (unlink, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int quiesce_mkdir (call_frame_t *frame, xlator_t *this, - loc_t *loc, mode_t mode, dict_t *params) + loc_t *loc, mode_t mode, mode_t umask, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -699,19 +1354,19 @@ quiesce_mkdir (call_frame_t *frame, xlator_t *this, STACK_WIND (frame, default_mkdir_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->mkdir, - loc, mode, params); - return 0; + loc, mode, umask, xdata); + return 0; } stub = fop_mkdir_stub (frame, default_mkdir_resume, - loc, mode, params); + loc, mode, umask, xdata); if (!stub) { STACK_UNWIND_STRICT (mkdir, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -719,7 +1374,7 @@ quiesce_mkdir (call_frame_t *frame, xlator_t *this, int quiesce_mknod (call_frame_t *frame, xlator_t *this, - loc_t *loc, mode_t mode, dev_t rdev, dict_t *parms) + loc_t *loc, mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; @@ -730,51 +1385,91 @@ quiesce_mknod (call_frame_t *frame, xlator_t *this, STACK_WIND (frame, default_mknod_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->mknod, - loc, mode, rdev, parms); - return 0; + loc, mode, rdev, umask, xdata); + return 0; } stub = fop_mknod_stub (frame, default_mknod_resume, - loc, mode, rdev, parms); + loc, mode, rdev, umask, xdata); if (!stub) { STACK_UNWIND_STRICT (mknod, frame, -1, ENOMEM, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int32_t +quiesce_ftruncate (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + off_t offset, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + + priv = this->private; + + if (priv->pass_through) { + STACK_WIND (frame, + default_ftruncate_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->ftruncate, + fd, + offset, xdata); + return 0; + } + + stub = fop_ftruncate_stub (frame, default_ftruncate_resume, fd, offset, xdata); + if (!stub) { + STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM, NULL, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +/* Re-transmittion */ + +int32_t quiesce_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, - size_t size) + size_t size, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + local->size = size; + frame->local = local; + STACK_WIND (frame, - default_readlink_cbk, + quiesce_readlink_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->readlink, loc, - size); - return 0; + size, xdata); + return 0; } - stub = fop_readlink_stub (frame, default_readlink_resume, loc, size); + stub = fop_readlink_stub (frame, default_readlink_resume, loc, size, xdata); if (!stub) { - STACK_UNWIND_STRICT (readlink, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (readlink, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -784,62 +1479,420 @@ int32_t quiesce_access (call_frame_t *frame, xlator_t *this, loc_t *loc, - int32_t mask) + int32_t mask, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + local->flag = mask; + frame->local = local; + STACK_WIND (frame, - default_access_cbk, + quiesce_access_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->access, loc, - mask); - return 0; + mask, xdata); + return 0; } - stub = fop_access_stub (frame, default_access_resume, loc, mask); + stub = fop_access_stub (frame, default_access_resume, loc, mask, xdata); if (!stub) { - STACK_UNWIND_STRICT (access, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (access, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int32_t -quiesce_ftruncate (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - off_t offset) +quiesce_fgetxattr (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + const char *name, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + if (name) + local->name = gf_strdup (name); + + frame->local = local; + + STACK_WIND (frame, + quiesce_fgetxattr_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fgetxattr, + fd, + name, xdata); + return 0; + } + + stub = fop_fgetxattr_stub (frame, default_fgetxattr_resume, fd, name, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fgetxattr, frame, -1, ENOMEM, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_statfs (call_frame_t *frame, + xlator_t *this, + loc_t *loc, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + frame->local = local; + STACK_WIND (frame, - default_ftruncate_cbk, + quiesce_statfs_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->ftruncate, + FIRST_CHILD(this)->fops->statfs, + loc, xdata); + return 0; + } + + stub = fop_statfs_stub (frame, default_statfs_resume, loc, xdata); + if (!stub) { + STACK_UNWIND_STRICT (statfs, frame, -1, ENOMEM, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_fsyncdir (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + int32_t flags, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->flag = flags; + frame->local = local; + + STACK_WIND (frame, + quiesce_fsyncdir_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fsyncdir, fd, - offset); - return 0; + flags, xdata); + return 0; } - stub = fop_ftruncate_stub (frame, default_ftruncate_resume, fd, offset); + stub = fop_fsyncdir_stub (frame, default_fsyncdir_resume, fd, flags, xdata); if (!stub) { - STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (fsyncdir, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_opendir (call_frame_t *frame, + xlator_t *this, + loc_t *loc, fd_t *fd, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + local->fd = fd_ref (fd); + frame->local = local; + + STACK_WIND (frame, + quiesce_opendir_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->opendir, + loc, fd, xdata); + return 0; + } + + stub = fop_opendir_stub (frame, default_opendir_resume, loc, fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (opendir, frame, -1, ENOMEM, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_fstat (call_frame_t *frame, + xlator_t *this, + fd_t *fd, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + frame->local = local; + + STACK_WIND (frame, + quiesce_fstat_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fstat, + fd, xdata); + return 0; + } + + stub = fop_fstat_stub (frame, default_fstat_resume, fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fstat, frame, -1, ENOMEM, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_fsync (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + int32_t flags, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->flag = flags; + frame->local = local; + + STACK_WIND (frame, + quiesce_fsync_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fsync, + fd, + flags, xdata); + return 0; + } + + stub = fop_fsync_stub (frame, default_fsync_resume, fd, flags, xdata); + if (!stub) { + STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_flush (call_frame_t *frame, + xlator_t *this, + fd_t *fd, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + frame->local = local; + + STACK_WIND (frame, + quiesce_flush_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->flush, + fd, xdata); + return 0; + } + + stub = fop_flush_stub (frame, default_flush_resume, fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (flush, frame, -1, ENOMEM, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_writev (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + struct iovec *vector, + int32_t count, + off_t off, uint32_t flags, + struct iobref *iobref, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + STACK_WIND (frame, + default_writev_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->writev, + fd, + vector, + count, + off, flags, + iobref, xdata); + return 0; + } + + stub = fop_writev_stub (frame, default_writev_resume, + fd, vector, count, off, flags, iobref, xdata); + if (!stub) { + STACK_UNWIND_STRICT (writev, frame, -1, ENOMEM, NULL, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + +int32_t +quiesce_readv (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + size_t size, + off_t offset, uint32_t flags, dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->size = size; + local->offset = offset; + local->io_flag = flags; + frame->local = local; + + STACK_WIND (frame, + quiesce_readv_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->readv, + fd, + size, + offset, flags, xdata); + return 0; + } + + stub = fop_readv_stub (frame, default_readv_resume, fd, size, offset, + flags, xdata); + if (!stub) { + STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, + NULL, 0, NULL, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); + + return 0; +} + + +int32_t +quiesce_open (call_frame_t *frame, + xlator_t *this, + loc_t *loc, + int32_t flags, fd_t *fd, + dict_t *xdata) +{ + quiesce_priv_t *priv = NULL; + call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; + + priv = this->private; + + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + local->fd = fd_ref (fd); + + /* Don't send O_APPEND below, as write() re-transmittions can + fail with O_APPEND */ + local->flag = (flags & ~O_APPEND); + frame->local = local; + + STACK_WIND (frame, + quiesce_open_cbk, + FIRST_CHILD(this), + FIRST_CHILD(this)->fops->open, + loc, (flags & ~O_APPEND), fd, xdata); + return 0; + } + + stub = fop_open_stub (frame, default_open_resume, loc, + (flags & ~O_APPEND), fd, xdata); + if (!stub) { + STACK_UNWIND_STRICT (open, frame, -1, ENOMEM, NULL, NULL); + return 0; + } + + gf_quiesce_enqueue (this, stub); return 0; } @@ -848,30 +1901,38 @@ int32_t quiesce_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name) + const char *name, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + if (name) + local->name = gf_strdup (name); + + frame->local = local; + STACK_WIND (frame, - default_getxattr_cbk, + quiesce_getxattr_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->getxattr, loc, - name); - return 0; + name, xdata); + return 0; } - stub = fop_getxattr_stub (frame, default_getxattr_resume, loc, name); + stub = fop_getxattr_stub (frame, default_getxattr_resume, loc, name, xdata); if (!stub) { - STACK_UNWIND_STRICT (getxattr, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (getxattr, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -882,32 +1943,32 @@ quiesce_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, gf_xattrop_flags_t flags, - dict_t *dict) + dict_t *dict, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_xattrop_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->xattrop, loc, flags, - dict); - return 0; + dict, xdata); + return 0; } stub = fop_xattrop_stub (frame, default_xattrop_resume, - loc, flags, dict); + loc, flags, dict, xdata); if (!stub) { - STACK_UNWIND_STRICT (xattrop, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (xattrop, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -917,65 +1978,32 @@ quiesce_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd, gf_xattrop_flags_t flags, - dict_t *dict) + dict_t *dict, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_fxattrop_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->fxattrop, fd, flags, - dict); - return 0; - } - - stub = fop_fxattrop_stub (frame, default_fxattrop_resume, - fd, flags, dict); - if (!stub) { - STACK_UNWIND_STRICT (fxattrop, frame, -1, ENOMEM, NULL); + dict, xdata); return 0; } - gf_quiesce_enqueue (priv, stub); - - return 0; -} - -int32_t -quiesce_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - quiesce_priv_t *priv = NULL; - call_stub_t *stub = NULL; - - priv = this->private; - - if (priv->pass_through) { - STACK_WIND (frame, - default_removexattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->removexattr, - loc, - name); - return 0; - } - - stub = fop_removexattr_stub (frame, default_removexattr_resume, - loc, name); + stub = fop_fxattrop_stub (frame, default_fxattrop_resume, + fd, flags, dict, xdata); if (!stub) { - STACK_UNWIND_STRICT (removexattr, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (fxattrop, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -985,31 +2013,31 @@ quiesce_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, - struct gf_flock *lock) + struct gf_flock *lock, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_lk_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->lk, fd, cmd, - lock); - return 0; + lock, xdata); + return 0; } - stub = fop_lk_stub (frame, default_lk_resume, fd, cmd, lock); + stub = fop_lk_stub (frame, default_lk_resume, fd, cmd, lock, xdata); if (!stub) { - STACK_UNWIND_STRICT (lk, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (lk, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1018,60 +2046,60 @@ quiesce_lk (call_frame_t *frame, int32_t quiesce_inodelk (call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc, int32_t cmd, - struct gf_flock *lock) + struct gf_flock *lock, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_inodelk_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->inodelk, - volume, loc, cmd, lock); - return 0; + volume, loc, cmd, lock, xdata); + return 0; } stub = fop_inodelk_stub (frame, default_inodelk_resume, - volume, loc, cmd, lock); + volume, loc, cmd, lock, xdata); if (!stub) { - STACK_UNWIND_STRICT (inodelk, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (inodelk, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } int32_t quiesce_finodelk (call_frame_t *frame, xlator_t *this, - const char *volume, fd_t *fd, int32_t cmd, struct gf_flock *lock) + const char *volume, fd_t *fd, int32_t cmd, struct gf_flock *lock, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_finodelk_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->finodelk, - volume, fd, cmd, lock); - return 0; + volume, fd, cmd, lock, xdata); + return 0; } stub = fop_finodelk_stub (frame, default_finodelk_resume, - volume, fd, cmd, lock); + volume, fd, cmd, lock, xdata); if (!stub) { - STACK_UNWIND_STRICT (finodelk, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (finodelk, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1079,29 +2107,29 @@ quiesce_finodelk (call_frame_t *frame, xlator_t *this, int32_t quiesce_entrylk (call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc, const char *basename, - entrylk_cmd cmd, entrylk_type type) + entrylk_cmd cmd, entrylk_type type, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_entrylk_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->entrylk, - volume, loc, basename, cmd, type); - return 0; + volume, loc, basename, cmd, type, xdata); + return 0; } stub = fop_entrylk_stub (frame, default_entrylk_resume, - volume, loc, basename, cmd, type); + volume, loc, basename, cmd, type, xdata); if (!stub) { - STACK_UNWIND_STRICT (entrylk, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (entrylk, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1109,29 +2137,29 @@ quiesce_entrylk (call_frame_t *frame, xlator_t *this, int32_t quiesce_fentrylk (call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd, const char *basename, - entrylk_cmd cmd, entrylk_type type) + entrylk_cmd cmd, entrylk_type type, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_fentrylk_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->fentrylk, - volume, fd, basename, cmd, type); - return 0; + volume, fd, basename, cmd, type, xdata); + return 0; } stub = fop_fentrylk_stub (frame, default_fentrylk_resume, - volume, fd, basename, cmd, type); + volume, fd, basename, cmd, type, xdata); if (!stub) { - STACK_UNWIND_STRICT (fentrylk, frame, -1, ENOMEM); + STACK_UNWIND_STRICT (fentrylk, frame, -1, ENOMEM, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1140,30 +2168,37 @@ int32_t quiesce_rchecksum (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - int32_t len) + int32_t len, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->offset = offset; + local->flag = len; + frame->local = local; + STACK_WIND (frame, - default_rchecksum_cbk, + quiesce_rchecksum_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->rchecksum, - fd, offset, len); - return 0; + fd, offset, len, xdata); + return 0; } stub = fop_rchecksum_stub (frame, default_rchecksum_resume, - fd, offset, len); + fd, offset, len, xdata); if (!stub) { - STACK_UNWIND_STRICT (rchecksum, frame, -1, ENOMEM, 0, NULL); + STACK_UNWIND_STRICT (rchecksum, frame, -1, ENOMEM, 0, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1174,29 +2209,36 @@ quiesce_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off) + off_t off, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->size = size; + local->offset = off; + frame->local = local; + STACK_WIND (frame, - default_readdir_cbk, + quiesce_readdir_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->readdir, - fd, size, off); - return 0; + fd, size, off, xdata); + return 0; } - stub = fop_readdir_stub (frame, default_readdir_resume, fd, size, off); + stub = fop_readdir_stub (frame, default_readdir_resume, fd, size, off, xdata); if (!stub) { - STACK_UNWIND_STRICT (readdir, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (readdir, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1207,29 +2249,38 @@ quiesce_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off) + off_t off, dict_t *dict) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + local->fd = fd_ref (fd); + local->size = size; + local->offset = off; + local->dict = dict_ref (dict); + frame->local = local; + STACK_WIND (frame, - default_readdirp_cbk, + quiesce_readdirp_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->readdirp, - fd, size, off); - return 0; + fd, size, off, dict); + return 0; } - stub = fop_readdirp_stub (frame, default_readdirp_resume, fd, size, off); + stub = fop_readdirp_stub (frame, default_readdirp_resume, fd, size, + off, dict); if (!stub) { - STACK_UNWIND_STRICT (readdirp, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (readdirp, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1239,92 +2290,66 @@ quiesce_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf, - int32_t valid) + int32_t valid, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_setattr_cbk, FIRST_CHILD (this), FIRST_CHILD (this)->fops->setattr, - loc, stbuf, valid); - return 0; + loc, stbuf, valid, xdata); + return 0; } stub = fop_setattr_stub (frame, default_setattr_resume, - loc, stbuf, valid); + loc, stbuf, valid, xdata); if (!stub) { - STACK_UNWIND_STRICT (setattr, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (setattr, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } -int32_t -quiesce_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset) -{ - quiesce_priv_t *priv = NULL; - call_stub_t *stub = NULL; - - priv = this->private; - - if (priv->pass_through) { - STACK_WIND (frame, - default_truncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->truncate, - loc, - offset); - return 0; - } - - stub = fop_truncate_stub (frame, default_truncate_resume, loc, offset); - if (!stub) { - STACK_UNWIND_STRICT (truncate, frame, -1, ENOMEM, NULL, NULL); - return 0; - } - - gf_quiesce_enqueue (priv, stub); - - return 0; -} int32_t quiesce_stat (call_frame_t *frame, xlator_t *this, - loc_t *loc) + loc_t *loc, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + frame->local = local; + STACK_WIND (frame, - default_stat_cbk, + quiesce_stat_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->stat, - loc); - return 0; + loc, xdata); + return 0; } - stub = fop_stat_stub (frame, default_stat_resume, loc); + stub = fop_stat_stub (frame, default_stat_resume, loc, xdata); if (!stub) { - STACK_UNWIND_STRICT (stat, frame, -1, ENOMEM, NULL); + STACK_UNWIND_STRICT (stat, frame, -1, ENOMEM, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1337,17 +2362,22 @@ quiesce_lookup (call_frame_t *frame, { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; + quiesce_local_t *local = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { + local = mem_get0 (priv->local_pool); + loc_dup (loc, &local->loc); + local->dict = dict_ref (xattr_req); + frame->local = local; + STACK_WIND (frame, - default_lookup_cbk, + quiesce_lookup_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->lookup, - loc, - xattr_req); - return 0; + loc, xattr_req); + return 0; } stub = fop_lookup_stub (frame, default_lookup_resume, loc, xattr_req); @@ -1357,7 +2387,7 @@ quiesce_lookup (call_frame_t *frame, return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1367,30 +2397,30 @@ quiesce_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, - int32_t valid) + int32_t valid, dict_t *xdata) { quiesce_priv_t *priv = NULL; call_stub_t *stub = NULL; priv = this->private; - if (priv->pass_through) { + if (priv && priv->pass_through) { STACK_WIND (frame, default_fsetattr_cbk, FIRST_CHILD (this), FIRST_CHILD (this)->fops->fsetattr, - fd, stbuf, valid); - return 0; + fd, stbuf, valid, xdata); + return 0; } stub = fop_fsetattr_stub (frame, default_fsetattr_resume, - fd, stbuf, valid); + fd, stbuf, valid, xdata); if (!stub) { - STACK_UNWIND_STRICT (fsetattr, frame, -1, ENOMEM, NULL, NULL); + STACK_UNWIND_STRICT (fsetattr, frame, -1, ENOMEM, NULL, NULL, NULL); return 0; } - gf_quiesce_enqueue (priv, stub); + gf_quiesce_enqueue (this, stub); return 0; } @@ -1426,6 +2456,9 @@ init (xlator_t *this) if (!priv) goto out; + priv->local_pool = mem_pool_new (quiesce_local_t, + GF_FOPS_EXPECTED_IN_PARALLEL); + LOCK_INIT (&priv->lock); priv->pass_through = _gf_false; @@ -1447,6 +2480,7 @@ fini (xlator_t *this) goto out; this->private = NULL; + mem_pool_destroy (priv->local_pool); LOCK_DESTROY (&priv->lock); GF_FREE (priv); out: @@ -1458,7 +2492,7 @@ notify (xlator_t *this, int event, void *data, ...) { int ret = 0; quiesce_priv_t *priv = NULL; - struct timeval timeout = {0,}; + struct timespec timeout = {0,}; priv = this->private; if (!priv) @@ -1488,21 +2522,21 @@ notify (xlator_t *this, int event, void *data, ...) } UNLOCK (&priv->lock); - if (!priv->timer) { - timeout.tv_sec = 20; - timeout.tv_usec = 0; + if (priv->timer) + break; + timeout.tv_sec = 20; + timeout.tv_nsec = 0; - gf_timer_call_cancel (this->ctx, priv->timer); - priv->timer = gf_timer_call_after (this->ctx, - timeout, - gf_quiesce_timeout, - (void *) this); + priv->timer = gf_timer_call_after (this->ctx, + timeout, + gf_quiesce_timeout, + (void *) this); - if (priv->timer == NULL) { - gf_log (this->name, GF_LOG_ERROR, - "Cannot create timer"); - } + if (priv->timer == NULL) { + gf_log (this->name, GF_LOG_ERROR, + "Cannot create timer"); } + break; default: break; @@ -1515,35 +2549,23 @@ out: struct xlator_fops fops = { - .lookup = quiesce_lookup, + /* write/modifying fops */ .mknod = quiesce_mknod, .create = quiesce_create, - .stat = quiesce_stat, - .fstat = quiesce_fstat, .truncate = quiesce_truncate, .ftruncate = quiesce_ftruncate, - .access = quiesce_access, - .readlink = quiesce_readlink, .setxattr = quiesce_setxattr, - .getxattr = quiesce_getxattr, .removexattr = quiesce_removexattr, - .open = quiesce_open, - .readv = quiesce_readv, - .writev = quiesce_writev, - .flush = quiesce_flush, - .fsync = quiesce_fsync, - .statfs = quiesce_statfs, - .lk = quiesce_lk, - .opendir = quiesce_opendir, - .readdir = quiesce_readdir, - .readdirp = quiesce_readdirp, - .fsyncdir = quiesce_fsyncdir, .symlink = quiesce_symlink, .unlink = quiesce_unlink, .link = quiesce_link, .mkdir = quiesce_mkdir, .rmdir = quiesce_rmdir, .rename = quiesce_rename, + + /* The below calls are known to change state, hence + re-transmittion is not advised */ + .lk = quiesce_lk, .inodelk = quiesce_inodelk, .finodelk = quiesce_finodelk, .entrylk = quiesce_entrylk, @@ -1552,15 +2574,36 @@ struct xlator_fops fops = { .fxattrop = quiesce_fxattrop, .setattr = quiesce_setattr, .fsetattr = quiesce_fsetattr, -}; -struct xlator_dumpops dumpops = { -}; + /* Special case, re-transmittion is not harmful * + * as offset is properly sent from above layers */ + /* TODO: not re-transmitted as of now */ + .writev = quiesce_writev, + /* re-transmittable fops */ + .lookup = quiesce_lookup, + .stat = quiesce_stat, + .fstat = quiesce_fstat, + .access = quiesce_access, + .readlink = quiesce_readlink, + .getxattr = quiesce_getxattr, + .open = quiesce_open, + .readv = quiesce_readv, + .flush = quiesce_flush, + .fsync = quiesce_fsync, + .statfs = quiesce_statfs, + .opendir = quiesce_opendir, + .readdir = quiesce_readdir, + .readdirp = quiesce_readdirp, + .fsyncdir = quiesce_fsyncdir, -struct xlator_cbks cbks = { }; +struct xlator_dumpops dumpops; + + +struct xlator_cbks cbks; + struct volume_options options[] = { { .key = {NULL} }, |
