diff options
Diffstat (limited to 'xlators/features/qemu-block/src/qemu-block.c')
| -rw-r--r-- | xlators/features/qemu-block/src/qemu-block.c | 1134 | 
1 files changed, 0 insertions, 1134 deletions
diff --git a/xlators/features/qemu-block/src/qemu-block.c b/xlators/features/qemu-block/src/qemu-block.c deleted file mode 100644 index 9aa9f43ab19..00000000000 --- a/xlators/features/qemu-block/src/qemu-block.c +++ /dev/null @@ -1,1134 +0,0 @@ -/* -  Copyright (c) 2013 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. -*/ - - -#include "glusterfs.h" -#include "logging.h" -#include "dict.h" -#include "xlator.h" -#include "inode.h" -#include "call-stub.h" -#include "defaults.h" -#include "qemu-block-memory-types.h" -#include "qemu-block.h" -#include "qb-coroutines.h" - - -qb_inode_t * -__qb_inode_ctx_get (xlator_t *this, inode_t *inode) -{ -        uint64_t    value    = 0; -        qb_inode_t *qb_inode = NULL; - -        __inode_ctx_get (inode, this, &value); -        qb_inode = (qb_inode_t *)(unsigned long) value; - -        return qb_inode; -} - - -qb_inode_t * -qb_inode_ctx_get (xlator_t *this, inode_t *inode) -{ -        qb_inode_t *qb_inode = NULL; - -        LOCK (&inode->lock); -        { -                qb_inode = __qb_inode_ctx_get (this, inode); -        } -        UNLOCK (&inode->lock); - -        return qb_inode; -} - - -qb_inode_t * -qb_inode_ctx_del (xlator_t *this, inode_t *inode) -{ -        uint64_t    value    = 0; -        qb_inode_t *qb_inode = NULL; - -        inode_ctx_del (inode, this, &value); -        qb_inode = (qb_inode_t *)(unsigned long) value; - -        return qb_inode; -} - - -int -qb_inode_cleanup (xlator_t *this, inode_t *inode, int warn) -{ -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_del (this, inode); - -	if (!qb_inode) -		return 0; - -	if (warn) -		gf_log (this->name, GF_LOG_WARNING, -			"inode %s no longer block formatted", -			uuid_utoa (inode->gfid)); - -	/* free (qb_inode->bs); */ - -	GF_FREE (qb_inode); - -	return 0; -} - - -int -qb_iatt_fixup (xlator_t *this, inode_t *inode, struct iatt *iatt) -{ -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, inode); -	if (!qb_inode) -		return 0; - -	iatt->ia_size = qb_inode->size; - -	return 0; -} - - -int -qb_format_extract (xlator_t *this, char *format, inode_t *inode) -{ -	char       *s, *save; -	uint64_t    size = 0; -	char        fmt[QB_XATTR_VAL_MAX+1] = {0, }; -	qb_inode_t *qb_inode = NULL; -	char *formatstr = NULL; -	uuid_t gfid = {0,}; -	char gfid_str[64] = {0,}; -	int ret; - -	strncpy(fmt, format, QB_XATTR_VAL_MAX); - -	s = strtok_r(fmt, ":", &save); -	if (!s) -		goto invalid; -	formatstr = gf_strdup(s); - -	s = strtok_r(NULL, ":", &save); -	if (!s) -		goto invalid; -	if (gf_string2bytesize (s, &size)) -		goto invalid; -	if (!size) -		goto invalid; - -	s = strtok_r(NULL, "\0", &save); -	if (s && !strncmp(s, "<gfid:", strlen("<gfid:"))) { -		/* -		 * Check for valid gfid backing image specifier. -		 */ -		if (strlen(s) + 1 > sizeof(gfid_str)) -			goto invalid; -		ret = sscanf(s, "<gfid:%[^>]s", gfid_str); -		if (ret == 1) { -			ret = gf_uuid_parse(gfid_str, gfid); -			if (ret < 0) -				goto invalid; -		} -	} - -	qb_inode = qb_inode_ctx_get (this, inode); -	if (!qb_inode) -		qb_inode = GF_CALLOC (1, sizeof (*qb_inode), -				      gf_qb_mt_qb_inode_t); -	if (!qb_inode) { -		GF_FREE(formatstr); -		return ENOMEM; -	} - -	strncpy(qb_inode->fmt, formatstr, QB_XATTR_VAL_MAX); -	qb_inode->size = size; - -	/* -	 * If a backing gfid was not specified, interpret any remaining bytes -	 * associated with a backing image as a filename local to the parent -	 * directory. The format processing will validate further. -	 */ -	if (!gf_uuid_is_null(gfid)) -		gf_uuid_copy(qb_inode->backing_gfid, gfid); -	else if (s) -		qb_inode->backing_fname = gf_strdup(s); - -	inode_ctx_set (inode, this, (void *)&qb_inode); - -	GF_FREE(formatstr); - -	return 0; - -invalid: -	GF_FREE(formatstr); - -	gf_log (this->name, GF_LOG_WARNING, -		"invalid format '%s' in inode %s", format, -		uuid_utoa (inode->gfid)); -	return EINVAL; -} - - -void -qb_local_free (xlator_t *this, qb_local_t *local) -{ -	if (local->inode) -		inode_unref (local->inode); -	if (local->fd) -		fd_unref (local->fd); -	GF_FREE (local); -} - - -int -qb_local_init (call_frame_t *frame) -{ -	qb_local_t *qb_local = NULL; - -	qb_local = GF_CALLOC (1, sizeof (*qb_local), gf_qb_mt_qb_local_t); -	if (!qb_local) -		return -1; -	INIT_LIST_HEAD(&qb_local->list); - -	qb_local->frame = frame; -	frame->local = qb_local; - -	return 0; -} - - -int -qb_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -	       int op_ret, int op_errno, inode_t *inode, struct iatt *buf, -	       dict_t *xdata, struct iatt *postparent) -{ -	char *format = NULL; -	qb_conf_t *conf = NULL; - -	conf = this->private; - -	if (op_ret == -1) -		goto out; - -	/* -	 * Cache the root inode for dealing with backing images. The format -	 * coroutine and the gluster qemu backend driver both use the root inode -	 * table to verify and/or redirect I/O to the backing image via -	 * anonymous fd's. -	 */ -	if (!conf->root_inode && __is_root_gfid(inode->gfid)) -		conf->root_inode = inode_ref(inode); - -	if (!xdata) -		goto out; - -	if (dict_get_str (xdata, conf->qb_xattr_key, &format)) -		goto out; - -	if (!format) { -		qb_inode_cleanup (this, inode, 1); -		goto out; -	} - -	op_errno = qb_format_extract (this, format, inode); -	if (op_errno) -		op_ret = -1; - -	qb_iatt_fixup (this, inode, buf); -out: -	QB_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, buf, -			 xdata, postparent); -	return 0; -} - - -int -qb_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) -{ -	qb_conf_t *conf = NULL; - -	conf = this->private; - -	xdata = xdata ? dict_ref (xdata) : dict_new (); - -	if (!xdata) -		goto enomem; - -	if (dict_set_int32 (xdata, conf->qb_xattr_key, 0)) -		goto enomem; - -	STACK_WIND (frame, qb_lookup_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->lookup, loc, xdata); -	dict_unref (xdata); -	return 0; -enomem: -	QB_STACK_UNWIND (lookup, frame, -1, ENOMEM, 0, 0, 0, 0); -	if (xdata) -		dict_unref (xdata); -	return 0; -} - - -int -qb_setxattr_format (call_frame_t *frame, xlator_t *this, call_stub_t *stub, -		    dict_t *xattr, inode_t *inode) -{ -	char *format = NULL; -	int op_errno = 0; -	qb_local_t *qb_local = NULL; -	data_t *data = NULL; -	qb_inode_t *qb_inode; - -	if (!(data = dict_get (xattr, "trusted.glusterfs.block-format"))) { -		QB_STUB_RESUME (stub); -		return 0; -	} - -	format = alloca (data->len + 1); -	memcpy (format, data->data, data->len); -	format[data->len] = 0; - -	op_errno = qb_format_extract (this, format, inode); -	if (op_errno) { -		QB_STUB_UNWIND (stub, -1, op_errno); -		return 0; -	} -	qb_inode = qb_inode_ctx_get(this, inode); - -	qb_local = frame->local; - -	qb_local->stub = stub; -	qb_local->inode = inode_ref (inode); - -	snprintf(qb_local->fmt, QB_XATTR_VAL_MAX, "%s:%" PRId64, qb_inode->fmt, -		 qb_inode->size); - -	qb_coroutine (frame, qb_format_and_resume); - -	return 0; -} - - -int -qb_setxattr_snapshot_create (call_frame_t *frame, xlator_t *this, -			     call_stub_t *stub, dict_t *xattr, inode_t *inode) -{ -	qb_local_t *qb_local = NULL; -	char *name = NULL; -	data_t *data = NULL; - -	if (!(data = dict_get (xattr, "trusted.glusterfs.block-snapshot-create"))) { -		QB_STUB_RESUME (stub); -		return 0; -	} - -	name = alloca (data->len + 1); -	memcpy (name, data->data, data->len); -	name[data->len] = 0; - -	qb_local = frame->local; - -	qb_local->stub = stub; -	qb_local->inode = inode_ref (inode); -	strncpy (qb_local->name, name, 128); - -	qb_coroutine (frame, qb_snapshot_create); - -	return 0; -} - - -int -qb_setxattr_snapshot_delete (call_frame_t *frame, xlator_t *this, -			     call_stub_t *stub, dict_t *xattr, inode_t *inode) -{ -	qb_local_t *qb_local = NULL; -	char *name = NULL; -	data_t *data = NULL; - -	if (!(data = dict_get (xattr, "trusted.glusterfs.block-snapshot-delete"))) { -		QB_STUB_RESUME (stub); -		return 0; -	} - -	name = alloca (data->len + 1); -	memcpy (name, data->data, data->len); -	name[data->len] = 0; - -	qb_local = frame->local; - -	qb_local->stub = stub; -	qb_local->inode = inode_ref (inode); -	strncpy (qb_local->name, name, 128); - -	qb_coroutine (frame, qb_snapshot_delete); - -	return 0; -} - -int -qb_setxattr_snapshot_goto (call_frame_t *frame, xlator_t *this, -			   call_stub_t *stub, dict_t *xattr, inode_t *inode) -{ -	qb_local_t *qb_local = NULL; -	char *name = NULL; -	data_t *data = NULL; - -	if (!(data = dict_get (xattr, "trusted.glusterfs.block-snapshot-goto"))) { -		QB_STUB_RESUME (stub); -		return 0; -	} - -	name = alloca (data->len + 1); -	memcpy (name, data->data, data->len); -	name[data->len] = 0; - -	qb_local = frame->local; - -	qb_local->stub = stub; -	qb_local->inode = inode_ref (inode); -	strncpy (qb_local->name, name, 128); - -	qb_coroutine (frame, qb_snapshot_goto); - -	return 0; -} - - -int -qb_setxattr_common (call_frame_t *frame, xlator_t *this, call_stub_t *stub, -		    dict_t *xattr, inode_t *inode) -{ - -	if (dict_get (xattr, "trusted.glusterfs.block-format")) { -		qb_setxattr_format (frame, this, stub, xattr, inode); -		return 0; -	} - -	if (dict_get (xattr, "trusted.glusterfs.block-snapshot-create")) { -		qb_setxattr_snapshot_create (frame, this, stub, xattr, inode); -		return 0; -	} - -	if (dict_get (xattr, "trusted.glusterfs.block-snapshot-delete")) { -		qb_setxattr_snapshot_delete (frame, this, stub, xattr, inode); -		return 0; -	} - -	if (dict_get (xattr, "trusted.glusterfs.block-snapshot-goto")) { -		qb_setxattr_snapshot_goto (frame, this, stub, xattr, inode); -		return 0; -	} - -	QB_STUB_RESUME (stub); - -	return 0; -} - - -int -qb_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr, -	     int flags, dict_t *xdata) -{ -	call_stub_t *stub = NULL; - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	stub = fop_setxattr_stub (frame, default_setxattr_resume, loc, xattr, -				  flags, xdata); -	if (!stub) -		goto enomem; - -	qb_setxattr_common (frame, this, stub, xattr, loc->inode); - -	return 0; -enomem: -	QB_STACK_UNWIND (setxattr, frame, -1, ENOMEM, 0); -	return 0; -} - - -int -qb_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xattr, -	      int flags, dict_t *xdata) -{ -	call_stub_t *stub = NULL; - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	stub = fop_fsetxattr_stub (frame, default_fsetxattr_resume, fd, xattr, -				   flags, xdata); -	if (!stub) -		goto enomem; - -	qb_setxattr_common (frame, this, stub, xattr, fd->inode); - -	return 0; -enomem: -	QB_STACK_UNWIND (fsetxattr, frame, -1, ENOMEM, 0); -	return 0; -} - - -int -qb_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -	     int op_ret, int op_errno, fd_t *fd, dict_t *xdata) -{ -	call_stub_t *stub = NULL; -	qb_local_t *qb_local = NULL; - -	qb_local = frame->local; - -	if (op_ret < 0) -		goto unwind; - -	if (!qb_inode_ctx_get (this, qb_local->inode)) -		goto unwind; - -	stub = fop_open_cbk_stub (frame, NULL, op_ret, op_errno, fd, xdata); -	if (!stub) { -		op_ret = -1; -		op_errno = ENOMEM; -		goto unwind; -	} - -	qb_local->stub = stub; - -	qb_coroutine (frame, qb_co_open); - -	return 0; -unwind: -	QB_STACK_UNWIND (open, frame, op_ret, op_errno, fd, xdata); -	return 0; -} - - -int -qb_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, -	 fd_t *fd, dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, loc->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_open_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->open, loc, flags, fd, -			    xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (loc->inode); -	qb_local->fd = fd_ref (fd); - -	STACK_WIND (frame, qb_open_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->open, loc, flags, fd, xdata); -	return 0; -enomem: -	QB_STACK_UNWIND (open, frame, -1, ENOMEM, 0, 0); -	return 0; -} - - -int -qb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, -	   int count, off_t offset, uint32_t flags, struct iobref *iobref, -	   dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, fd->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_writev_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->writev, fd, vector, count, -			    offset, flags, iobref, xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (fd->inode); -	qb_local->fd = fd_ref (fd); - -	qb_local->stub = fop_writev_stub (frame, NULL, fd, vector, count, -					  offset, flags, iobref, xdata); -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_writev); - -	return 0; -enomem: -	QB_STACK_UNWIND (writev, frame, -1, ENOMEM, 0, 0, 0); -	return 0; -} - - -int -qb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, -	  off_t offset, uint32_t flags, dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, fd->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_readv_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->readv, fd, size, offset, -			    flags, xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (fd->inode); -	qb_local->fd = fd_ref (fd); - -	qb_local->stub = fop_readv_stub (frame, NULL, fd, size, offset, -					  flags, xdata); -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_readv); - -	return 0; -enomem: -	QB_STACK_UNWIND (readv, frame, -1, ENOMEM, 0, 0, 0, 0, 0); -	return 0; -} - - -int -qb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int dsync, -	  dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, fd->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_fsync_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->fsync, fd, dsync, xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (fd->inode); -	qb_local->fd = fd_ref (fd); - -	qb_local->stub = fop_fsync_stub (frame, NULL, fd, dsync, xdata); - -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_fsync); - -	return 0; -enomem: -	QB_STACK_UNWIND (fsync, frame, -1, ENOMEM, 0, 0, 0); -	return 0; -} - - -int -qb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, fd->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_flush_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->flush, fd, xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (fd->inode); -	qb_local->fd = fd_ref (fd); - -	qb_local->stub = fop_flush_stub (frame, NULL, fd, xdata); - -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_fsync); - -	return 0; -enomem: -	QB_STACK_UNWIND (flush, frame, -1, ENOMEM, 0); -	return 0; -} - -static int32_t -qb_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) -{ -	qb_conf_t *conf = this->private; -	gf_dirent_t *entry; -	char *format; - -	list_for_each_entry(entry, &entries->list, list) { -		if (!entry->inode || !entry->dict) -			continue; - -		format = NULL; -		if (dict_get_str(entry->dict, conf->qb_xattr_key, &format)) -			continue; - -		if (!format) { -			qb_inode_cleanup(this, entry->inode, 1); -			continue; -		} - -		if (qb_format_extract(this, format, entry->inode)) -			continue; - -		qb_iatt_fixup(this, entry->inode, &entry->d_stat); -	} - -	STACK_UNWIND_STRICT(readdirp, frame, op_ret, op_errno, entries, xdata); -	return 0; -} - -static int32_t -qb_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, -	    off_t off, dict_t *xdata) -{ -	qb_conf_t *conf = this->private; - -	xdata = xdata ? dict_ref(xdata) : dict_new(); -	if (!xdata) -		goto enomem; - -	if (dict_set_int32 (xdata, conf->qb_xattr_key, 0)) -		goto enomem; - -	STACK_WIND(frame, qb_readdirp_cbk, FIRST_CHILD(this), -		   FIRST_CHILD(this)->fops->readdirp, fd, size, off, xdata); - -	dict_unref(xdata); -	return 0; - -enomem: -	QB_STACK_UNWIND(readdirp, frame, -1, ENOMEM, NULL, NULL); -	if (xdata) -		dict_unref(xdata); -	return 0; -} - -int -qb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, -	     dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, loc->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_truncate_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->truncate, loc, offset, -			    xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (loc->inode); -	qb_local->fd = fd_anonymous (loc->inode); - -	qb_local->stub = fop_truncate_stub (frame, NULL, loc, offset, xdata); - -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_truncate); - -	return 0; -enomem: -	QB_STACK_UNWIND (truncate, frame, -1, ENOMEM, 0, 0, 0); -	return 0; -} - - -int -qb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, -	     dict_t *xdata) -{ -	qb_local_t *qb_local = NULL; -	qb_inode_t *qb_inode = NULL; - -	qb_inode = qb_inode_ctx_get (this, fd->inode); -	if (!qb_inode) { -		STACK_WIND (frame, default_ftruncate_cbk, FIRST_CHILD(this), -			    FIRST_CHILD(this)->fops->ftruncate, fd, offset, -			    xdata); -		return 0; -	} - -	if (qb_local_init (frame) != 0) -		goto enomem; - -	qb_local = frame->local; - -	qb_local->inode = inode_ref (fd->inode); -	qb_local->fd = fd_ref (fd); - -	qb_local->stub = fop_ftruncate_stub (frame, NULL, fd, offset, xdata); - -	if (!qb_local->stub) -		goto enomem; - -	qb_coroutine (frame, qb_co_truncate); - -	return 0; -enomem: -	QB_STACK_UNWIND (ftruncate, frame, -1, ENOMEM, 0, 0, 0); -	return 0; -} - - -int -qb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -	     int op_ret, int op_errno, struct iatt *iatt, dict_t *xdata) -{ -	inode_t *inode = NULL; - -	inode = frame->local; -	frame->local = NULL; - -	if (inode) { -		qb_iatt_fixup (this, inode, iatt); -		inode_unref (inode); -	} - -	QB_STACK_UNWIND (stat, frame, op_ret, op_errno, iatt, xdata); - -	return 0; -} - -int -qb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) -{ -	if (qb_inode_ctx_get (this, loc->inode)) -		frame->local = inode_ref (loc->inode); - -	STACK_WIND (frame, qb_stat_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->stat, loc, xdata); -	return 0; -} - - -int -qb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -	      int op_ret, int op_errno, struct iatt *iatt, dict_t *xdata) -{ -	inode_t *inode = NULL; - -	inode = frame->local; -	frame->local = NULL; - -	if (inode) { -		qb_iatt_fixup (this, inode, iatt); -		inode_unref (inode); -	} - -	QB_STACK_UNWIND (fstat, frame, op_ret, op_errno, iatt, xdata); - -	return 0; -} - - -int -qb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) -{ -	if (qb_inode_ctx_get (this, fd->inode)) -		frame->local = inode_ref (fd->inode); - -	STACK_WIND (frame, qb_fstat_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->fstat, fd, xdata); -	return 0; -} - - -int -qb_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -		int op_ret, int op_errno, struct iatt *pre, struct iatt *post, -		dict_t *xdata) -{ -	inode_t *inode = NULL; - -	inode = frame->local; -	frame->local = NULL; - -	if (inode) { -		qb_iatt_fixup (this, inode, pre); -		qb_iatt_fixup (this, inode, post); -		inode_unref (inode); -	} - -	QB_STACK_UNWIND (setattr, frame, op_ret, op_errno, pre, post, xdata); - -	return 0; -} - - -int -qb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *buf, -	    int valid, dict_t *xdata) -{ -	if (qb_inode_ctx_get (this, loc->inode)) -		frame->local = inode_ref (loc->inode); - -	STACK_WIND (frame, qb_setattr_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->setattr, loc, buf, valid, xdata); -	return 0; -} - - -int -qb_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -		 int op_ret, int op_errno, struct iatt *pre, struct iatt *post, -		 dict_t *xdata) -{ -	inode_t *inode = NULL; - -	inode = frame->local; -	frame->local = NULL; - -	if (inode) { -		qb_iatt_fixup (this, inode, pre); -		qb_iatt_fixup (this, inode, post); -		inode_unref (inode); -	} - -	QB_STACK_UNWIND (fsetattr, frame, op_ret, op_errno, pre, post, xdata); - -	return 0; -} - - -int -qb_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *buf, -	     int valid, dict_t *xdata) -{ -	if (qb_inode_ctx_get (this, fd->inode)) -		frame->local = inode_ref (fd->inode); - -	STACK_WIND (frame, qb_setattr_cbk, FIRST_CHILD(this), -		    FIRST_CHILD(this)->fops->fsetattr, fd, buf, valid, xdata); -	return 0; -} - - -int -qb_forget (xlator_t *this, inode_t *inode) -{ -	return qb_inode_cleanup (this, inode, 0); -} - - -int -qb_release (xlator_t *this, fd_t *fd) -{ -	call_frame_t *frame = NULL; - -	frame = create_frame (this, this->ctx->pool); -	if (!frame) { -		gf_log (this->name, GF_LOG_ERROR, -			"Could not allocate frame. " -			"Leaking QEMU BlockDriverState"); -		return -1; -	} - -	if (qb_local_init (frame) != 0) { -		gf_log (this->name, GF_LOG_ERROR, -			"Could not allocate local. " -			"Leaking QEMU BlockDriverState"); -		STACK_DESTROY (frame->root); -		return -1; -	} - -	if (qb_coroutine (frame, qb_co_close) != 0) { -		gf_log (this->name, GF_LOG_ERROR, -			"Could not allocate coroutine. " -			"Leaking QEMU BlockDriverState"); -		qb_local_free (this, frame->local); -		frame->local = NULL; -		STACK_DESTROY (frame->root); -	} - -	return 0; -} - -int -mem_acct_init (xlator_t *this) -{ -        int     ret = -1; - -        ret = xlator_mem_acct_init (this, gf_qb_mt_end + 1); - -        if (ret) -                gf_log (this->name, GF_LOG_ERROR, "Memory accounting init " -                        "failed"); -        return ret; -} - - -int -reconfigure (xlator_t *this, dict_t *options) -{ -	return 0; -} - - -int -init (xlator_t *this) -{ -        qb_conf_t *conf    = NULL; -        int32_t    ret     = -1; -	static int bdrv_inited = 0; - -        if (!this->children || this->children->next) { -                gf_log (this->name, GF_LOG_ERROR, -                        "FATAL: qemu-block (%s) not configured with exactly " -                        "one child", this->name); -                goto out; -        } - -        conf = GF_CALLOC (1, sizeof (*conf), gf_qb_mt_qb_conf_t); -        if (!conf) -                goto out; - -        /* configure 'option window-size <size>' */ -        GF_OPTION_INIT ("default-password", conf->default_password, str, out); - -	/* qemu coroutines use "co_mutex" for synchronizing among themselves. -	   However "co_mutex" itself is not threadsafe if the coroutine framework -	   is multithreaded (which usually is not). However synctasks are -	   fundamentally multithreaded, so for now create a syncenv which has -	   scaling limits set to max 1 thread so that the qemu coroutines can -	   execute "safely". - -	   Future work: provide an implementation of "co_mutex" which is -	   threadsafe and use the global multithreaded ctx->env syncenv. -	*/ -	conf->env = syncenv_new (0, 1, 1); - -        this->private = conf; - -        ret = 0; - -	snprintf (conf->qb_xattr_key, QB_XATTR_KEY_MAX, QB_XATTR_KEY_FMT, -		  this->name); - -	cur_mon = (void *) 1; - -	if (!bdrv_inited) { -		bdrv_init (); -		bdrv_inited = 1; -	} - -out: -        if (ret) -                GF_FREE (conf); - -        return ret; -} - - -void -fini (xlator_t *this) -{ -        qb_conf_t *conf = NULL; - -        conf = this->private; - -        this->private = NULL; - -        /* No need to do inode_unref of conf->root_inode as ref/unref doesn't -         * apply for it*/ -        GF_FREE (conf); - -	return; -} - - -struct xlator_fops fops = { -	.lookup      = qb_lookup, -	.fsetxattr   = qb_fsetxattr, -	.setxattr    = qb_setxattr, -	.open        = qb_open, -        .writev      = qb_writev, -        .readv       = qb_readv, -        .fsync       = qb_fsync, -        .truncate    = qb_truncate, -        .ftruncate   = qb_ftruncate, -        .stat        = qb_stat, -        .fstat       = qb_fstat, -	.setattr     = qb_setattr, -	.fsetattr    = qb_fsetattr, -        .flush       = qb_flush, -/* -	.getxattr    = qb_getxattr, -	.fgetxattr   = qb_fgetxattr -*/ -	.readdirp    = qb_readdirp, -}; - - -struct xlator_cbks cbks = { -        .forget   = qb_forget, -	.release  = qb_release, -}; - - -struct xlator_dumpops dumpops = { -}; - - -struct volume_options options[] = { -        { .key  = {"default-password"}, -          .type = GF_OPTION_TYPE_STR, -          .default_value = "", -          .description = "Default password for the AES encrypted block images." -        }, -        { .key = {NULL} }, -};  | 
