summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/stripe
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/stripe')
-rw-r--r--xlators/cluster/stripe/src/Makefile.am2
-rw-r--r--xlators/cluster/stripe/src/stripe.c5253
-rw-r--r--xlators/cluster/stripe/src/stripe.h125
3 files changed, 2759 insertions, 2621 deletions
diff --git a/xlators/cluster/stripe/src/Makefile.am b/xlators/cluster/stripe/src/Makefile.am
index 60e0a156876..180d0da1f3c 100644
--- a/xlators/cluster/stripe/src/Makefile.am
+++ b/xlators/cluster/stripe/src/Makefile.am
@@ -7,6 +7,8 @@ stripe_la_LDFLAGS = -module -avoidversion
stripe_la_SOURCES = stripe.c
stripe_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la
+noinst_HEADERS = stripe.h
+
AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\
-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c
index b9df7a80e1c..11d6172f9da 100644
--- a/xlators/cluster/stripe/src/stripe.c
+++ b/xlators/cluster/stripe/src/stripe.c
@@ -33,141 +33,39 @@
* backup copy.
*/
-#ifndef _CONFIG_H
-#define _CONFIG_H
-#include "config.h"
-#endif
-
-#include "xlator.h"
-#include "logging.h"
-#include "defaults.h"
-#include "compat.h"
-#include "compat-errno.h"
-#include <fnmatch.h>
-#include <signal.h>
-
-#define STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR(_loc) do { \
- if (!(_loc && _loc->inode)) { \
- STACK_UNWIND (frame, -1, EINVAL, NULL, NULL, NULL); \
- return 0; \
- } \
-} while(0)
-
-/**
- * struct stripe_options : This keeps the pattern and the block-size
- * information, which is used for striping on a file.
- */
-struct stripe_options {
- struct stripe_options *next;
- char path_pattern[256];
- uint64_t block_size;
-};
-
-/**
- * Private structure for stripe translator
- */
-struct stripe_private {
- struct stripe_options *pattern;
- xlator_t **xl_array;
- uint64_t block_size;
- gf_lock_t lock;
- uint8_t nodes_down;
- int8_t first_child_down;
- int8_t child_count;
- int8_t state[256]; /* Current state of the child node,
- 0 for down, 1 for up */
- gf_boolean_t xattr_supported; /* 0 for no, 1 for yes, default yes */
-};
-
-/**
- * Used to keep info about the replies received from fops->readv calls
- */
-struct readv_replies {
- struct iovec *vector;
- int32_t count; //count of vector
- int32_t op_ret; //op_ret of readv
- int32_t op_errno;
- struct stat stbuf; /* 'stbuf' is also a part of reply */
-};
-
-/**
- * Local structure to be passed with all the frames in case of STACK_WIND
+/* TODO:
+ * 1. Implement basic self-heal ability to manage the basic backend
+ * layout missmatch.
+ *
*/
-struct stripe_local; /* this itself is used inside the structure; */
-
-struct stripe_local {
- struct stripe_local *next;
- call_frame_t *orig_frame;
-
- /* Used by _cbk functions */
- struct stat stbuf;
- struct readv_replies *replies;
- struct statvfs statvfs_buf;
- dir_entry_t *entry;
- struct xlator_stats stats;
-
- int8_t revalidate;
- int8_t failed;
- int8_t unwind;
-
- int32_t node_index;
- int32_t call_count;
- int32_t wind_count; /* used instead of child_cound
- in case of read and write */
- int32_t op_ret;
- int32_t op_errno;
- int32_t count;
- int32_t flags;
- char *name;
- inode_t *inode;
-
- loc_t loc;
- loc_t loc2;
-
- /* For File I/O fops */
- dict_t *dict;
-
- /* General usage */
- off_t offset;
- off_t stripe_size;
-
- int8_t *list;
- struct flock lock;
- fd_t *fd;
- void *value;
- struct iobref *iobref;
-};
-typedef struct stripe_local stripe_local_t;
-typedef struct stripe_private stripe_private_t;
+#include "stripe.h"
/**
* stripe_get_matching_bs - Get the matching block size for the given path.
*/
int32_t
-stripe_get_matching_bs (const char *path,
- struct stripe_options *opts,
- uint64_t default_bs)
+stripe_get_matching_bs (const char *path, struct stripe_options *opts,
+ uint64_t default_bs)
{
- struct stripe_options *trav = NULL;
- char *pathname = NULL;
- uint64_t block_size = 0;
+ struct stripe_options *trav = NULL;
+ char *pathname = NULL;
+ uint64_t block_size = 0;
- block_size = default_bs;
- pathname = strdup (path);
- trav = opts;
+ block_size = default_bs;
+ pathname = strdup (path);
+ trav = opts;
- while (trav) {
- if (fnmatch (trav->path_pattern,
- pathname, FNM_NOESCAPE) == 0) {
- block_size = trav->block_size;
- break;
- }
- trav = trav->next;
- }
- free (pathname);
-
- return block_size;
+ while (trav) {
+ if (!fnmatch (trav->path_pattern, pathname, FNM_NOESCAPE)) {
+ block_size = trav->block_size;
+ break;
+ }
+ trav = trav->next;
+ }
+ free (pathname);
+
+ return block_size;
}
@@ -175,14 +73,11 @@ stripe_get_matching_bs (const char *path,
* stripe_common_cbk -
*/
int32_t
-stripe_common_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
+stripe_common_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno)
{
- STACK_UNWIND (frame, op_ret, op_errno);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno);
+ return 0;
}
/**
@@ -192,57 +87,52 @@ stripe_common_cbk (call_frame_t *frame,
*
*/
int32_t
-stripe_stack_unwind_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_errno = op_errno;
- if (op_errno == ENOTCONN)
- local->failed = 1;
- }
- if (op_ret >= 0)
- local->op_ret = op_ret;
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- if (local->loc.path)
- loc_wipe (&local->loc);
- if (local->loc2.path)
- loc_wipe (&local->loc2);
-
- STACK_UNWIND (frame, local->op_ret, local->op_errno);
- }
- return 0;
+stripe_stack_unwind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ if (op_errno == ENOTCONN)
+ local->failed = 1;
+ }
+ if (op_ret >= 0)
+ local->op_ret = op_ret;
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ if (local->loc.path)
+ loc_wipe (&local->loc);
+ if (local->loc2.path)
+ loc_wipe (&local->loc2);
+
+ STACK_UNWIND (frame, local->op_ret, local->op_errno);
+ }
+ return 0;
}
int32_t
-stripe_common_buf_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct stat *buf)
+stripe_common_buf_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *buf)
{
- STACK_UNWIND (frame, op_ret, op_errno, buf);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, buf);
+ return 0;
}
/**
@@ -254,85 +144,80 @@ stripe_common_buf_cbk (call_frame_t *frame,
* @cookie - this argument should be always 'xlator_t *' of child node
*/
int32_t
-stripe_stack_unwind_buf_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct stat *buf)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_errno = op_errno;
- if (op_errno == ENOTCONN)
- local->failed = 1;
- }
+stripe_stack_unwind_buf_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno,
+ struct stat *buf)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ if (op_errno == ENOTCONN)
+ local->failed = 1;
+ }
- if (op_ret == 0) {
- local->op_ret = 0;
- if (local->stbuf.st_blksize == 0) {
- local->stbuf = *buf;
- /* Because st_blocks gets added again */
- local->stbuf.st_blocks = 0;
- }
-
- if (FIRST_CHILD(this) ==
- ((call_frame_t *)cookie)->this) {
- /* Always, pass the inode number of
- first child to the above layer */
- local->stbuf.st_ino = buf->st_ino;
- local->stbuf.st_mtime = buf->st_mtime;
- }
-
- local->stbuf.st_blocks += buf->st_blocks;
- if (local->stbuf.st_size < buf->st_size)
- local->stbuf.st_size = buf->st_size;
- if (local->stbuf.st_blksize != buf->st_blksize) {
- /* TODO: add to blocks in terms of
- original block size */
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- if (local->loc.path)
- loc_wipe (&local->loc);
- if (local->loc2.path)
- loc_wipe (&local->loc2);
-
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- &local->stbuf);
- }
-
- return 0;
+ if (op_ret == 0) {
+ local->op_ret = 0;
+ if (local->stbuf.st_blksize == 0) {
+ local->stbuf = *buf;
+ /* Because st_blocks gets added again */
+ local->stbuf.st_blocks = 0;
+ }
+
+ if (FIRST_CHILD(this) ==
+ ((call_frame_t *)cookie)->this) {
+ /* Always, pass the inode number of
+ first child to the above layer */
+ local->stbuf.st_ino = buf->st_ino;
+ local->stbuf.st_mtime = buf->st_mtime;
+ }
+
+ local->stbuf.st_blocks += buf->st_blocks;
+ if (local->stbuf.st_size < buf->st_size)
+ local->stbuf.st_size = buf->st_size;
+ if (local->stbuf.st_blksize != buf->st_blksize) {
+ /* TODO: add to blocks in terms of
+ original block size */
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ if (local->loc.path)
+ loc_wipe (&local->loc);
+ if (local->loc2.path)
+ loc_wipe (&local->loc2);
+
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ &local->stbuf);
+ }
+
+ return 0;
}
/* In case of symlink, mknod, the file is created on just first node */
int32_t
-stripe_common_inode_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- inode_t *inode,
- struct stat *buf)
+stripe_common_inode_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct stat *buf)
{
- STACK_UNWIND (frame, op_ret, op_errno, inode, buf);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, inode, buf);
+ return 0;
}
/**
@@ -344,142 +229,152 @@ stripe_common_inode_cbk (call_frame_t *frame,
*
*/
int32_t
-stripe_stack_unwind_inode_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- inode_t *inode,
- struct stat *buf)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_stack_unwind_inode_cbk (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno, inode_t *inode,
+ struct stat *buf)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_errno = op_errno;
- if (op_errno == ENOTCONN)
- local->failed = 1;
- }
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ if (op_errno == ENOTCONN)
+ local->failed = 1;
+ }
- if (op_ret >= 0) {
- local->op_ret = 0;
-
- if (local->stbuf.st_blksize == 0) {
- local->inode = inode;
- local->stbuf = *buf;
- /* Because st_blocks gets added again */
- local->stbuf.st_blocks = 0;
- }
- if (FIRST_CHILD(this) ==
- ((call_frame_t *)cookie)->this) {
- local->stbuf.st_ino = buf->st_ino;
- local->stbuf.st_mtime = buf->st_mtime;
- }
-
- local->stbuf.st_blocks += buf->st_blocks;
- if (local->stbuf.st_size < buf->st_size)
- local->stbuf.st_size = buf->st_size;
- if (local->stbuf.st_blksize != buf->st_blksize) {
- /* TODO: add to blocks in terms of
- original block size */
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->inode, &local->stbuf);
- }
-
- return 0;
+ if (op_ret >= 0) {
+ local->op_ret = 0;
+
+ if (local->stbuf.st_blksize == 0) {
+ local->inode = inode;
+ local->stbuf = *buf;
+ /* Because st_blocks gets added again */
+ local->stbuf.st_blocks = 0;
+ }
+ if (FIRST_CHILD(this) ==
+ ((call_frame_t *)cookie)->this) {
+ local->stbuf.st_ino = buf->st_ino;
+ local->stbuf.st_mtime = buf->st_mtime;
+ }
+
+ local->stbuf.st_blocks += buf->st_blocks;
+ if (local->stbuf.st_size < buf->st_size)
+ local->stbuf.st_size = buf->st_size;
+ if (local->stbuf.st_blksize != buf->st_blksize) {
+ /* TODO: add to blocks in terms of
+ original block size */
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->inode, &local->stbuf);
+ }
+
+ return 0;
}
int32_t
-stripe_stack_unwind_inode_lookup_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- inode_t *inode,
- struct stat *buf,
- dict_t *dict)
-{
- int32_t callcnt = 0;
- dict_t *tmp_dict = NULL;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct stat *buf, dict_t *dict)
+{
+ int32_t callcnt = 0;
+ dict_t *tmp_dict = NULL;
+ inode_t *tmp_inode = NULL;
+ stripe_local_t *local = NULL;
+ call_frame_t *prev = NULL;
+
+ prev = cookie;
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- if (op_errno != ENOENT)
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
+ if (op_ret == -1) {
+ if (op_errno != ENOENT)
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ prev->this->name,
+ strerror (op_errno));
if (local->op_errno != ESTALE)
local->op_errno = op_errno;
- if ((op_errno == ENOTCONN)
- || (op_errno == ESTALE))
- local->failed = 1;
- }
+ if ((op_errno == ENOTCONN) || (op_errno == ESTALE))
+ local->failed = 1;
+ /* TODO: bring in self-heal ability */
+ /*
+ * if (local->op_ret == 0) {
+ * if (S_ISREG (local->stbuf.st_mode) ||
+ * S_ISDIR (local->stbuf.st_mode))
+ * local->entry_self_heal_needed = 1;
+ * }
+ */
+ }
- if (op_ret >= 0) {
- local->op_ret = 0;
-
- if (local->stbuf.st_blksize == 0) {
- local->inode = inode;
- local->stbuf = *buf;
- /* Because st_blocks gets added again */
- local->stbuf.st_blocks = 0;
- }
- if (FIRST_CHILD(this) ==
- ((call_frame_t *)cookie)->this) {
- local->stbuf.st_ino = buf->st_ino;
- local->stbuf.st_mtime = buf->st_mtime;
- if (local->dict)
- dict_unref (local->dict);
- local->dict = dict_ref (dict);
- } else {
- if (!local->dict)
- local->dict = dict_ref (dict);
- }
- local->stbuf.st_blocks += buf->st_blocks;
- if (local->stbuf.st_size < buf->st_size)
- local->stbuf.st_size = buf->st_size;
- if (local->stbuf.st_blksize != buf->st_blksize) {
- /* TODO: add to blocks in terms of
- original block size */
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- tmp_dict = local->dict;
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->inode, &local->stbuf, local->dict);
- if (tmp_dict)
- dict_unref (tmp_dict);
- }
-
- return 0;
+ if (op_ret >= 0) {
+ local->op_ret = 0;
+
+ if (local->stbuf.st_blksize == 0) {
+ local->inode = inode_ref (inode);
+ local->stbuf = *buf;
+ /* Because st_blocks gets added again */
+ local->stbuf.st_blocks = 0;
+ }
+ if (FIRST_CHILD(this) == prev->this) {
+ local->stbuf.st_ino = buf->st_ino;
+ local->stbuf.st_mtime = buf->st_mtime;
+ if (local->dict)
+ dict_unref (local->dict);
+ local->dict = dict_ref (dict);
+ } else {
+ if (!local->dict)
+ local->dict = dict_ref (dict);
+ }
+ local->stbuf.st_blocks += buf->st_blocks;
+ if (local->stbuf.st_size < buf->st_size)
+ local->stbuf.st_size = buf->st_size;
+ if (local->stbuf.st_blksize != buf->st_blksize) {
+ /* TODO: add to blocks in terms of
+ original block size */
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ tmp_dict = local->dict;
+ tmp_inode = local->inode;
+
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->inode, &local->stbuf, local->dict);
+
+ if (tmp_inode)
+ inode_unref (tmp_inode);
+ if (tmp_dict)
+ dict_unref (tmp_dict);
+ }
+
+ return 0;
}
@@ -487,104 +382,118 @@ stripe_stack_unwind_inode_lookup_cbk (call_frame_t *frame,
* stripe_lookup -
*/
int32_t
-stripe_lookup (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- dict_t *xattr_req)
-{
- stripe_local_t *local = NULL;
- xlator_list_t *trav = NULL;
- stripe_private_t *priv = this->private;
- char send_lookup_to_all = 0;
-
- if (!(loc && loc->inode)) {
- gf_log (this->name, GF_LOG_ERROR,
- "wrong argument, returning EINVAL");
- STACK_UNWIND (frame, -1, EINVAL, NULL, NULL, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
-
- if ((!loc->inode->st_mode) ||
- S_ISDIR (loc->inode->st_mode) ||
- S_ISREG (loc->inode->st_mode))
- send_lookup_to_all = 1;
-
- if (send_lookup_to_all) {
- /* Everytime in stripe lookup, all child nodes
- should be looked up */
- local->call_count = priv->child_count;
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_inode_lookup_cbk,
- trav->xlator,
- trav->xlator->fops->lookup,
- loc, xattr_req);
- trav = trav->next;
- }
- } else {
- local->call_count = 1;
-
- STACK_WIND (frame,
- stripe_stack_unwind_inode_lookup_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->lookup,
- loc, xattr_req);
- }
+stripe_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ dict_t *xattr_req)
+{
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+ char send_lookup_to_all = 0;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+
+ if ((!loc->inode->st_mode) || S_ISDIR (loc->inode->st_mode) ||
+ S_ISREG (loc->inode->st_mode)) {
+ send_lookup_to_all = 1;
+ }
+
+ if (send_lookup_to_all) {
+ /* Everytime in stripe lookup, all child nodes
+ should be looked up */
+ local->call_count = priv->child_count;
+ while (trav) {
+ STACK_WIND (frame, stripe_lookup_cbk, trav->xlator,
+ trav->xlator->fops->lookup,
+ loc, xattr_req);
+ trav = trav->next;
+ }
+ } else {
+ local->call_count = 1;
+
+ STACK_WIND (frame, stripe_lookup_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->lookup,
+ loc, xattr_req);
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL);
+ return 0;
}
/**
* stripe_stat -
*/
int32_t
-stripe_stat (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc)
+stripe_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
- int send_lookup_to_all = 0;
- xlator_list_t *trav = NULL;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_lookup_to_all = 1;
-
- if (!send_lookup_to_all) {
- STACK_WIND (frame,
- stripe_common_buf_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->stat,
- loc);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- local->call_count = priv->child_count;
+ int send_lookup_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_lookup_to_all = 1;
+
+ if (!send_lookup_to_all) {
+ STACK_WIND (frame, stripe_common_buf_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->stat, loc);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ local->call_count = priv->child_count;
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->stat,
- loc);
- trav = trav->next;
- }
- }
- return 0;
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->stat,
+ loc);
+ trav = trav->next;
+ }
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -592,54 +501,57 @@ stripe_stat (call_frame_t *frame,
* stripe_chmod -
*/
int32_t
-stripe_chmod (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- mode_t mode)
-{
- int send_fop_to_all = 0;
- xlator_list_t *trav = NULL;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
-
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
-
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_buf_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->chmod,
- loc, mode);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- local->call_count = priv->child_count;
-
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->chmod,
- loc, mode);
- trav = trav->next;
- }
- }
- return 0;
+stripe_chmod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode)
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_buf_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->chmod, loc, mode);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->chmod,
+ loc, mode);
+ trav = trav->next;
+ }
+ }
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -647,57 +559,59 @@ stripe_chmod (call_frame_t *frame,
* stripe_chown -
*/
int32_t
-stripe_chown (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- uid_t uid,
- gid_t gid)
-{
- int send_fop_to_all = 0;
- xlator_list_t *trav = NULL;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
-
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
-
- trav = this->children;
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_buf_cbk,
- trav->xlator,
- trav->xlator->fops->chown,
- loc, uid, gid);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- local->call_count = priv->child_count;
-
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->chown,
- loc, uid, gid);
- trav = trav->next;
- }
- }
-
- return 0;
+stripe_chown (call_frame_t *frame, xlator_t *this, loc_t *loc, uid_t uid,
+ gid_t gid)
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_buf_cbk, trav->xlator,
+ trav->xlator->fops->chown, loc, uid, gid);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->chown,
+ loc, uid, gid);
+ trav = trav->next;
+ }
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -705,46 +619,45 @@ stripe_chown (call_frame_t *frame,
* stripe_statfs_cbk -
*/
int32_t
-stripe_statfs_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct statvfs *stbuf)
-{
- stripe_local_t *local = (stripe_local_t *)frame->local;
- int32_t callcnt;
- LOCK(&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret != 0 && op_errno != ENOTCONN) {
- local->op_errno = op_errno;
- }
- if (op_ret == 0) {
- struct statvfs *dict_buf = &local->statvfs_buf;
- dict_buf->f_bsize = stbuf->f_bsize;
- dict_buf->f_frsize = stbuf->f_frsize;
- dict_buf->f_blocks += stbuf->f_blocks;
- dict_buf->f_bfree += stbuf->f_bfree;
- dict_buf->f_bavail += stbuf->f_bavail;
- dict_buf->f_files += stbuf->f_files;
- dict_buf->f_ffree += stbuf->f_ffree;
- dict_buf->f_favail += stbuf->f_favail;
- dict_buf->f_fsid = stbuf->f_fsid;
- dict_buf->f_flag = stbuf->f_flag;
- dict_buf->f_namemax = stbuf->f_namemax;
- local->op_ret = 0;
- }
- }
- UNLOCK (&frame->lock);
+stripe_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct statvfs *stbuf)
+{
+ stripe_local_t *local = NULL;
+ int32_t callcnt = 0;
+
+ local = frame->local;
+
+ LOCK(&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret && (op_errno != ENOTCONN)) {
+ local->op_errno = op_errno;
+ }
+ if (op_ret == 0) {
+ struct statvfs *dict_buf = &local->statvfs_buf;
+ dict_buf->f_bsize = stbuf->f_bsize;
+ dict_buf->f_frsize = stbuf->f_frsize;
+ dict_buf->f_blocks += stbuf->f_blocks;
+ dict_buf->f_bfree += stbuf->f_bfree;
+ dict_buf->f_bavail += stbuf->f_bavail;
+ dict_buf->f_files += stbuf->f_files;
+ dict_buf->f_ffree += stbuf->f_ffree;
+ dict_buf->f_favail += stbuf->f_favail;
+ dict_buf->f_fsid = stbuf->f_fsid;
+ dict_buf->f_flag = stbuf->f_flag;
+ dict_buf->f_namemax = stbuf->f_namemax;
+ local->op_ret = 0;
+ }
+ }
+ UNLOCK (&frame->lock);
- if (!callcnt) {
- STACK_UNWIND (frame, local->op_ret,
- local->op_errno, &local->statvfs_buf);
- }
+ if (!callcnt) {
+ STACK_UNWIND (frame, local->op_ret,
+ local->op_errno, &local->statvfs_buf);
+ }
- return 0;
+ return 0;
}
@@ -752,31 +665,37 @@ stripe_statfs_cbk (call_frame_t *frame,
* stripe_statfs -
*/
int32_t
-stripe_statfs (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc)
+stripe_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- local->op_errno = ENOTCONN;
- frame->local = local;
+ trav = this->children;
+ priv = this->private;
- local->call_count = ((stripe_private_t *)this->private)->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_statfs_cbk,
- trav->xlator,
- trav->xlator->fops->statfs,
- loc);
- trav = trav->next;
- }
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ local->op_errno = ENOTCONN;
+ frame->local = local;
+
+ local->call_count = priv->child_count;
+ while (trav) {
+ STACK_WIND (frame, stripe_statfs_cbk, trav->xlator,
+ trav->xlator->fops->statfs, loc);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -784,56 +703,58 @@ stripe_statfs (call_frame_t *frame,
* stripe_truncate -
*/
int32_t
-stripe_truncate (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- off_t offset)
-{
- int send_fop_to_all = 0;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
-
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
-
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_buf_cbk,
- trav->xlator,
- trav->xlator->fops->truncate,
- loc,
- offset);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- local->call_count = priv->child_count;
+stripe_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_buf_cbk, trav->xlator,
+ trav->xlator->fops->truncate, loc, offset);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ local->call_count = priv->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->truncate,
- loc,
- offset);
- trav = trav->next;
- }
- }
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->truncate,
+ loc, offset);
+ trav = trav->next;
+ }
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -841,130 +762,142 @@ stripe_truncate (call_frame_t *frame,
* stripe_utimens -
*/
int32_t
-stripe_utimens (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- struct timespec tv[2])
-{
- int send_fop_to_all = 0;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
-
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
-
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_buf_cbk,
- trav->xlator,
- trav->xlator->fops->utimens,
- loc, tv);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- local->call_count = priv->child_count;
+stripe_utimens (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ struct timespec tv[2])
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_buf_cbk, trav->xlator,
+ trav->xlator->fops->utimens, loc, tv);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ local->call_count = priv->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->utimens,
- loc, tv);
- trav = trav->next;
- }
- }
- return 0;
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->utimens,
+ loc, tv);
+ trav = trav->next;
+ }
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
int32_t
-stripe_first_rename_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct stat *buf)
-{
- stripe_local_t *local = frame->local;
- xlator_list_t *trav = this->children;
-
- if (op_ret == -1)
- {
- STACK_UNWIND (frame, op_ret, op_errno, buf);
- return 0;
- }
-
- local->op_ret = 0;
- local->stbuf = *buf;
- local->call_count--;
- trav = trav->next; /* Skip first child */
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->rename,
- &local->loc, &local->loc2);
- trav = trav->next;
- }
-
- return 0;
+stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *buf)
+{
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+
+ if (op_ret == -1) {
+ goto unwind;
+ }
+
+ local = frame->local;
+ trav = this->children;
+
+ local->op_ret = 0;
+ local->stbuf = *buf;
+ local->call_count--;
+ trav = trav->next; /* Skip first child */
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ trav->xlator, trav->xlator->fops->rename,
+ &local->loc, &local->loc2);
+ trav = trav->next;
+ }
+ return 0;
+
+ unwind:
+ STACK_UNWIND (frame, op_ret, op_errno, buf);
+ return 0;
}
/**
* stripe_rename -
*/
int32_t
-stripe_rename (call_frame_t *frame,
- xlator_t *this,
- loc_t *oldloc,
- loc_t *newloc)
-{
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (oldloc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, EIO, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- local->inode = oldloc->inode;
- loc_copy (&local->loc, oldloc);
- loc_copy (&local->loc2, newloc);
-
- local->call_count = priv->child_count;
+stripe_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc,
+ loc_t *newloc)
+{
+ stripe_private_t *priv = NULL;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (oldloc, err);
+ VALIDATE_OR_GOTO (oldloc->path, err);
+ VALIDATE_OR_GOTO (oldloc->inode, err);
+ VALIDATE_OR_GOTO (newloc, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ local->inode = oldloc->inode;
+ loc_copy (&local->loc, oldloc);
+ loc_copy (&local->loc2, newloc);
+
+ local->call_count = priv->child_count;
- frame->local = local;
+ frame->local = local;
- STACK_WIND (frame,
- stripe_first_rename_cbk,
- trav->xlator,
- trav->xlator->fops->rename,
- oldloc, newloc);
+ STACK_WIND (frame, stripe_first_rename_cbk, trav->xlator,
+ trav->xlator->fops->rename, oldloc, newloc);
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -972,20 +905,23 @@ stripe_rename (call_frame_t *frame,
* stripe_access -
*/
int32_t
-stripe_access (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- int32_t mask)
+stripe_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask)
{
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
- STACK_WIND (frame,
- stripe_common_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->access,
- loc, mask);
+ STACK_WIND (frame, stripe_common_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->access, loc, mask);
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -993,16 +929,11 @@ stripe_access (call_frame_t *frame,
* stripe_readlink_cbk -
*/
int32_t
-stripe_readlink_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- const char *path)
+stripe_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, const char *path)
{
- STACK_UNWIND (frame, op_ret, op_errno, path);
-
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, path);
+ return 0;
}
@@ -1010,29 +941,23 @@ stripe_readlink_cbk (call_frame_t *frame,
* stripe_readlink -
*/
int32_t
-stripe_readlink (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- size_t size)
+stripe_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size)
{
- stripe_private_t *priv = this->private;
+ int32_t op_errno = 1;
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
+ STACK_WIND (frame, stripe_readlink_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->readlink, loc, size);
- STACK_WIND (frame,
- stripe_readlink_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->readlink,
- loc, size);
-
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -1040,123 +965,131 @@ stripe_readlink (call_frame_t *frame,
* stripe_unlink -
*/
int32_t
-stripe_unlink (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc)
-{
- int send_fop_to_all = 0;
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO);
- return 0;
- }
+stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
- if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
-
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_cbk,
- trav->xlator,
- trav->xlator->fops->unlink,
- loc);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
+ if (S_ISDIR (loc->inode->st_mode) || S_ISREG (loc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_cbk, trav->xlator,
+ trav->xlator->fops->unlink, loc);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->unlink,
- loc);
- trav = trav->next;
- }
- }
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk,
+ trav->xlator, trav->xlator->fops->unlink,
+ loc);
+ trav = trav->next;
+ }
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
int32_t
-stripe_first_rmdir_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
+stripe_first_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno)
{
- xlator_list_t *trav = this->children;
- stripe_local_t *local = frame->local;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+
+ if (op_ret == -1) {
+ STACK_UNWIND (frame, op_ret, op_errno);
+ return 0;
+ }
- if (op_ret == -1)
- {
- STACK_UNWIND (frame, op_ret, op_errno);
- return 0;
- }
+ trav = this->children;
+ local = frame->local;
- local->call_count--; /* First child successful */
- trav = trav->next; /* Skip first child */
+ local->call_count--; /* First child successful */
+ trav = trav->next; /* Skip first child */
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->rmdir,
- &local->loc);
- trav = trav->next;
- }
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ trav->xlator->fops->rmdir, &local->loc);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
}
/**
* stripe_rmdir -
*/
int32_t
-stripe_rmdir (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc)
-{
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
- stripe_private_t *priv = this->private;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = loc->inode;
- loc_copy (&local->loc, loc);
- local->call_count = priv->child_count;
+stripe_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)
+{
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = loc->inode;
+ loc_copy (&local->loc, loc);
+ local->call_count = priv->child_count;
- STACK_WIND (frame,
- stripe_first_rmdir_cbk,
- trav->xlator,
- trav->xlator->fops->rmdir,
- loc);
+ STACK_WIND (frame, stripe_first_rmdir_cbk, trav->xlator,
+ trav->xlator->fops->rmdir, loc);
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -1164,218 +1097,217 @@ stripe_rmdir (call_frame_t *frame,
* stripe_setxattr -
*/
int32_t
-stripe_setxattr (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- dict_t *dict,
- int32_t flags)
+stripe_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ dict_t *dict, int32_t flags)
{
- stripe_private_t *priv = this->private;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN);
- return 0;
- }
+ priv = this->private;
- STACK_WIND (frame,
- stripe_common_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->setxattr,
- loc, dict, flags);
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ STACK_WIND (frame, stripe_common_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->setxattr, loc, dict, flags);
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
int32_t
-stripe_mknod_ifreg_fail_unlink_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
+stripe_mknod_ifreg_fail_unlink_cbk (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno)
{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
- }
- UNLOCK (&frame->lock);
+ local = frame->local;
- if (!callcnt) {
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->inode, &local->stbuf);
- }
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+ }
+ UNLOCK (&frame->lock);
- return 0;
+ if (!callcnt) {
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->inode, &local->stbuf);
+ }
+
+ return 0;
}
/**
*/
int32_t
-stripe_mknod_ifreg_setxattr_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_mknod_ifreg_setxattr_cbk (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->op_errno = op_errno;
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->op_ret == -1) {
- local->call_count = priv->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_mknod_ifreg_fail_unlink_cbk,
- trav->xlator,
- trav->xlator->fops->unlink,
- &local->loc);
- trav = trav->next;
- }
- return 0;
- }
-
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->inode, &local->stbuf);
- }
- return 0;
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->op_errno = op_errno;
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->op_ret == -1) {
+ local->call_count = priv->child_count;
+ while (trav) {
+ STACK_WIND (frame,
+ stripe_mknod_ifreg_fail_unlink_cbk,
+ trav->xlator,
+ trav->xlator->fops->unlink,
+ &local->loc);
+ trav = trav->next;
+ }
+ return 0;
+ }
+
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->inode, &local->stbuf);
+ }
+ return 0;
}
/**
*/
int32_t
-stripe_mknod_ifreg_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- inode_t *inode,
- struct stat *buf)
-{
- int ret = 0;
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- stripe_private_t *priv = this->private;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_mknod_ifreg_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct stat *buf)
+{
+ int ret = 0;
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->failed = 1;
- local->op_errno = op_errno;
- }
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->failed = 1;
+ local->op_errno = op_errno;
+ }
- if (op_ret >= 0) {
- local->op_ret = op_ret;
- /* Get the mapping in inode private */
- /* Get the stat buf right */
- if (local->stbuf.st_blksize == 0) {
- local->stbuf = *buf;
- /* Because st_blocks gets added again */
- local->stbuf.st_blocks = 0;
- }
-
- /* Always, pass the inode number of first child
- to the above layer */
- if (FIRST_CHILD(this) ==
- ((call_frame_t *)cookie)->this)
- local->stbuf.st_ino = buf->st_ino;
+ if (op_ret >= 0) {
+ local->op_ret = op_ret;
+ /* Get the mapping in inode private */
+ /* Get the stat buf right */
+ if (local->stbuf.st_blksize == 0) {
+ local->stbuf = *buf;
+ /* Because st_blocks gets added again */
+ local->stbuf.st_blocks = 0;
+ }
+
+ /* Always, pass the inode number of first child
+ to the above layer */
+ if (FIRST_CHILD(this) ==
+ ((call_frame_t *)cookie)->this)
+ local->stbuf.st_ino = buf->st_ino;
- local->stbuf.st_blocks += buf->st_blocks;
- if (local->stbuf.st_size < buf->st_size)
- local->stbuf.st_size = buf->st_size;
- if (local->stbuf.st_blksize != buf->st_blksize) {
- /* TODO: add to blocks in terms of
- original block size */
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- if ((local->op_ret != -1) && priv->xattr_supported) {
- /* Send a setxattr request to nodes where the
- files are created */
- int32_t index = 0;
- char size_key[256] = {0,};
- char index_key[256] = {0,};
- char count_key[256] = {0,};
- xlator_list_t *trav = this->children;
- dict_t *dict = NULL;
-
- sprintf (size_key,
- "trusted.%s.stripe-size", this->name);
- sprintf (count_key,
- "trusted.%s.stripe-count", this->name);
- sprintf (index_key,
- "trusted.%s.stripe-index", this->name);
-
- local->call_count = priv->child_count;
-
- while (trav) {
- dict = get_new_dict ();
- dict_ref (dict);
- /* TODO: check return value */
- ret = dict_set_int64 (dict, size_key,
- local->stripe_size);
- ret = dict_set_int32 (dict, count_key,
- local->call_count);
- ret = dict_set_int32 (dict, index_key, index);
-
- STACK_WIND (frame,
- stripe_mknod_ifreg_setxattr_cbk,
- trav->xlator,
- trav->xlator->fops->setxattr,
- &local->loc, dict, 0);
-
- dict_unref (dict);
- index++;
- trav = trav->next;
- }
- } else {
- /* Create itself has failed.. so return
- without setxattring */
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->inode, &local->stbuf);
- }
- }
+ local->stbuf.st_blocks += buf->st_blocks;
+ if (local->stbuf.st_size < buf->st_size)
+ local->stbuf.st_size = buf->st_size;
+ if (local->stbuf.st_blksize != buf->st_blksize) {
+ /* TODO: add to blocks in terms of
+ original block size */
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ if ((local->op_ret != -1) && priv->xattr_supported) {
+ /* Send a setxattr request to nodes where the
+ files are created */
+ int32_t index = 0;
+ char size_key[256] = {0,};
+ char index_key[256] = {0,};
+ char count_key[256] = {0,};
+ dict_t *dict = NULL;
+
+ trav = this->children;
+ sprintf (size_key,
+ "trusted.%s.stripe-size", this->name);
+ sprintf (count_key,
+ "trusted.%s.stripe-count", this->name);
+ sprintf (index_key,
+ "trusted.%s.stripe-index", this->name);
+
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ dict = get_new_dict ();
+ dict_ref (dict);
+ /* TODO: check return value */
+ ret = dict_set_int64 (dict, size_key,
+ local->stripe_size);
+ ret = dict_set_int32 (dict, count_key,
+ local->call_count);
+ ret = dict_set_int32 (dict, index_key, index);
+
+ STACK_WIND (frame,
+ stripe_mknod_ifreg_setxattr_cbk,
+ trav->xlator,
+ trav->xlator->fops->setxattr,
+ &local->loc, dict, 0);
+
+ dict_unref (dict);
+ index++;
+ trav = trav->next;
+ }
+ } else {
+ /* Create itself has failed.. so return
+ without setxattring */
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->inode, &local->stbuf);
+ }
+ }
- return 0;
+ return 0;
}
@@ -1383,73 +1315,78 @@ stripe_mknod_ifreg_cbk (call_frame_t *frame,
* stripe_mknod -
*/
int32_t
-stripe_mknod (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- mode_t mode,
- dev_t rdev)
-{
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = NULL;
+stripe_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,
+ dev_t rdev)
+{
+ stripe_private_t *priv = NULL;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, NULL, NULL);
- return 0;
- }
-
- if (S_ISREG(mode)) {
- /* NOTE: on older kernels (older than 2.6.9),
- creat() fops is sent as mknod() + open(). Hence handling
- S_IFREG files is necessary */
- if (priv->nodes_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "Some node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, loc->inode, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- local->op_errno = ENOTCONN;
- local->stripe_size = stripe_get_matching_bs (loc->path,
- priv->pattern,
- priv->block_size);
- frame->local = local;
- local->inode = loc->inode;
- loc_copy (&local->loc, loc);
-
- /* Everytime in stripe lookup, all child nodes should
- be looked up */
- local->call_count =
- ((stripe_private_t *)this->private)->child_count;
-
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_mknod_ifreg_cbk,
- trav->xlator,
- trav->xlator->fops->mknod,
- loc, mode, rdev);
- trav = trav->next;
- }
-
- /* This case is handled, no need to continue further. */
- return 0;
- }
-
-
- STACK_WIND (frame,
- stripe_common_inode_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->mknod,
- loc, mode, rdev);
-
- return 0;
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ if (S_ISREG(mode)) {
+ /* NOTE: on older kernels (older than 2.6.9),
+ creat() fops is sent as mknod() + open(). Hence handling
+ S_IFREG files is necessary */
+ if (priv->nodes_down) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "Some node down, returning EIO");
+ op_errno = EIO;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ local->op_errno = ENOTCONN;
+ local->stripe_size = stripe_get_matching_bs (loc->path,
+ priv->pattern,
+ priv->block_size);
+ frame->local = local;
+ local->inode = loc->inode;
+ loc_copy (&local->loc, loc);
+
+ /* Everytime in stripe lookup, all child nodes should
+ be looked up */
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_mknod_ifreg_cbk,
+ trav->xlator, trav->xlator->fops->mknod,
+ loc, mode, rdev);
+ trav = trav->next;
+ }
+
+ /* This case is handled, no need to continue further. */
+ return 0;
+ }
+
+
+ STACK_WIND (frame, stripe_common_inode_cbk,
+ FIRST_CHILD(this), FIRST_CHILD(this)->fops->mknod,
+ loc, mode, rdev);
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL);
+ return 0;
}
@@ -1457,41 +1394,49 @@ stripe_mknod (call_frame_t *frame,
* stripe_mkdir -
*/
int32_t
-stripe_mkdir (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- mode_t mode)
-{
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = NULL;
+stripe_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode)
+{
+ stripe_private_t *priv = NULL;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, NULL, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- local->call_count = priv->child_count;
- frame->local = local;
-
- /* Everytime in stripe lookup, all child nodes should be looked up */
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_inode_cbk,
- trav->xlator,
- trav->xlator->fops->mkdir,
- loc, mode);
- trav = trav->next;
- }
-
- return 0;
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ local->call_count = priv->child_count;
+ frame->local = local;
+
+ /* Everytime in stripe lookup, all child nodes should be looked up */
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_inode_cbk,
+ trav->xlator, trav->xlator->fops->mkdir,
+ loc, mode);
+ trav = trav->next;
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL);
+ return 0;
}
@@ -1499,111 +1444,116 @@ stripe_mkdir (call_frame_t *frame,
* stripe_symlink -
*/
int32_t
-stripe_symlink (call_frame_t *frame,
- xlator_t *this,
- const char *linkpath,
- loc_t *loc)
+stripe_symlink (call_frame_t *frame, xlator_t *this, const char *linkpath,
+ loc_t *loc)
{
- stripe_private_t *priv = this->private;
+ int32_t op_errno = 1;
+ stripe_private_t *priv = NULL;
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, NULL, NULL);
- return 0;
- }
+ priv = this->private;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ /* send symlink to only first node */
+ STACK_WIND (frame, stripe_common_inode_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->symlink, linkpath, loc);
- /* send symlink to only first node */
- STACK_WIND (frame,
- stripe_common_inode_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->symlink,
- linkpath, loc);
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL);
- return 0;
+ return 0;
}
/**
* stripe_link -
*/
int32_t
-stripe_link (call_frame_t *frame,
- xlator_t *this,
- loc_t *oldloc,
- loc_t *newloc)
-{
- int send_fop_to_all = 0;
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (oldloc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, NULL, NULL);
- return 0;
- }
-
-
- if (S_ISREG (oldloc->inode->st_mode))
- send_fop_to_all = 1;
-
- if (!send_fop_to_all) {
- STACK_WIND (frame,
- stripe_common_inode_cbk,
- trav->xlator,
- trav->xlator->fops->link,
- oldloc, newloc);
- } else {
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- /* Everytime in stripe lookup, all child
- nodes should be looked up */
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_inode_cbk,
- trav->xlator,
- trav->xlator->fops->link,
- oldloc, newloc);
- trav = trav->next;
- }
- }
-
- return 0;
+stripe_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)
+{
+ int send_fop_to_all = 0;
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (oldloc, err);
+ VALIDATE_OR_GOTO (oldloc->path, err);
+ VALIDATE_OR_GOTO (oldloc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+
+ if (S_ISREG (oldloc->inode->st_mode))
+ send_fop_to_all = 1;
+
+ if (!send_fop_to_all) {
+ STACK_WIND (frame, stripe_common_inode_cbk,
+ trav->xlator, trav->xlator->fops->link,
+ oldloc, newloc);
+ } else {
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
+
+ /* Everytime in stripe lookup, all child
+ nodes should be looked up */
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_inode_cbk,
+ trav->xlator, trav->xlator->fops->link,
+ oldloc, newloc);
+ trav = trav->next;
+ }
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL);
+ return 0;
}
int32_t
-stripe_create_fail_unlink_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
+stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno)
{
- int32_t callcnt = 0;
- fd_t *lfd = NULL;
- stripe_local_t *local = frame->local;
+ int32_t callcnt = 0;
+ fd_t *lfd = NULL;
+ stripe_local_t *local = NULL;
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
- }
- UNLOCK (&frame->lock);
+ local = frame->local;
- if (!callcnt) {
- lfd = local->fd;
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->fd, local->inode, &local->stbuf);
- fd_unref (lfd);
- }
- return 0;
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ lfd = local->fd;
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->fd, local->inode, &local->stbuf);
+ fd_unref (lfd);
+ }
+ return 0;
}
@@ -1611,181 +1561,175 @@ stripe_create_fail_unlink_cbk (call_frame_t *frame,
* stripe_create_setxattr_cbk -
*/
int32_t
-stripe_create_setxattr_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno)
-{
- fd_t *lfd = NULL;
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_create_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno)
+{
+ fd_t *lfd = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t callcnt = 0;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->op_errno = op_errno;
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->op_ret == -1) {
- local->call_count = priv->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_create_fail_unlink_cbk,
- trav->xlator,
- trav->xlator->fops->unlink,
- &local->loc);
- trav = trav->next;
- }
-
- return 0;
- }
-
- lfd = local->fd;
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->fd, local->inode, &local->stbuf);
- fd_unref (lfd);
- }
-
- return 0;
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->op_errno = op_errno;
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->op_ret == -1) {
+ local->call_count = priv->child_count;
+ trav = this->children;
+ while (trav) {
+ STACK_WIND (frame,
+ stripe_create_fail_unlink_cbk,
+ trav->xlator,
+ trav->xlator->fops->unlink,
+ &local->loc);
+ trav = trav->next;
+ }
+
+ return 0;
+ }
+
+ lfd = local->fd;
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->fd, local->inode, &local->stbuf);
+ fd_unref (lfd);
+ }
+
+ return 0;
}
/**
* stripe_create_cbk -
*/
int32_t
-stripe_create_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- fd_t *fd,
- inode_t *inode,
- struct stat *buf)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- stripe_private_t *priv = this->private;
- fd_t *lfd = NULL;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, fd_t *fd,
+ inode_t *inode, struct stat *buf)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ fd_t *lfd = NULL;
+
+ priv = this->private;
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->failed = 1;
- local->op_errno = op_errno;
- }
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->failed = 1;
+ local->op_errno = op_errno;
+ }
- if (op_ret >= 0) {
- local->op_ret = op_ret;
- /* Get the mapping in inode private */
- /* Get the stat buf right */
- if (local->stbuf.st_blksize == 0) {
- local->stbuf = *buf;
- /* Because st_blocks gets added again */
- local->stbuf.st_blocks = 0;
- }
+ if (op_ret >= 0) {
+ local->op_ret = op_ret;
+ /* Get the mapping in inode private */
+ /* Get the stat buf right */
+ if (local->stbuf.st_blksize == 0) {
+ local->stbuf = *buf;
+ /* Because st_blocks gets added again */
+ local->stbuf.st_blocks = 0;
+ }
- /* Always, pass the inode number of first
- child to the above layer */
- if (FIRST_CHILD(this) ==
- ((call_frame_t *)cookie)->this)
- local->stbuf.st_ino = buf->st_ino;
+ /* Always, pass the inode number of first
+ child to the above layer */
+ if (FIRST_CHILD(this) ==
+ ((call_frame_t *)cookie)->this)
+ local->stbuf.st_ino = buf->st_ino;
- local->stbuf.st_blocks += buf->st_blocks;
- if (local->stbuf.st_size < buf->st_size)
- local->stbuf.st_size = buf->st_size;
- if (local->stbuf.st_blksize != buf->st_blksize) {
- /* TODO: add to blocks in terms of
- original block size */
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
-
- if (local->op_ret >= 0) {
- fd_ctx_set (local->fd, this, local->stripe_size);
- }
-
- if ((local->op_ret != -1) &&
- local->stripe_size && priv->xattr_supported) {
- /* Send a setxattr request to nodes where
- the files are created */
- int ret = 0;
- int32_t index = 0;
- char size_key[256] = {0,};
- char index_key[256] = {0,};
- char count_key[256] = {0,};
- xlator_list_t *trav = this->children;
- dict_t *dict = NULL;
-
- sprintf (size_key,
- "trusted.%s.stripe-size", this->name);
- sprintf (count_key,
- "trusted.%s.stripe-count", this->name);
- sprintf (index_key,
- "trusted.%s.stripe-index", this->name);
-
- local->call_count = priv->child_count;
-
- while (trav) {
- dict = get_new_dict ();
- dict_ref (dict);
-
- /* TODO: check return values */
- ret = dict_set_int64 (dict, size_key,
- local->stripe_size);
- ret = dict_set_int32 (dict, count_key,
- local->call_count);
- ret = dict_set_int32 (dict, index_key, index);
-
- STACK_WIND (frame,
- stripe_create_setxattr_cbk,
- trav->xlator,
- trav->xlator->fops->setxattr,
- &local->loc,
- dict,
- 0);
-
- dict_unref (dict);
- index++;
- trav = trav->next;
- }
- } else {
- /* Create itself has failed.. so return
- without setxattring */
- lfd = local->fd;
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- local->fd, local->inode, &local->stbuf);
+ local->stbuf.st_blocks += buf->st_blocks;
+ if (local->stbuf.st_size < buf->st_size)
+ local->stbuf.st_size = buf->st_size;
+ if (local->stbuf.st_blksize != buf->st_blksize) {
+ /* TODO: add to blocks in terms of
+ original block size */
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+
+ if (local->op_ret >= 0)
+ fd_ctx_set (local->fd, this, local->stripe_size);
+
+ if ((local->op_ret != -1) &&
+ local->stripe_size && priv->xattr_supported) {
+ /* Send a setxattr request to nodes where
+ the files are created */
+ int ret = 0;
+ int32_t index = 0;
+ char size_key[256] = {0,};
+ char index_key[256] = {0,};
+ char count_key[256] = {0,};
+ xlator_list_t *trav = this->children;
+ dict_t *dict = NULL;
+
+ sprintf (size_key,
+ "trusted.%s.stripe-size", this->name);
+ sprintf (count_key,
+ "trusted.%s.stripe-count", this->name);
+ sprintf (index_key,
+ "trusted.%s.stripe-index", this->name);
+
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ dict = get_new_dict ();
+ dict_ref (dict);
+
+ /* TODO: check return values */
+ ret = dict_set_int64 (dict, size_key,
+ local->stripe_size);
+ ret = dict_set_int32 (dict, count_key,
+ local->call_count);
+ ret = dict_set_int32 (dict, index_key, index);
+
+ STACK_WIND (frame, stripe_create_setxattr_cbk,
+ trav->xlator,
+ trav->xlator->fops->setxattr,
+ &local->loc, dict, 0);
+
+ dict_unref (dict);
+ index++;
+ trav = trav->next;
+ }
+ } else {
+ /* Create itself has failed.. so return
+ without setxattring */
+ lfd = local->fd;
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->fd, local->inode, &local->stbuf);
- fd_unref (lfd);
- }
- }
+ fd_unref (lfd);
+ }
+ }
- return 0;
+ return 0;
}
@@ -1796,100 +1740,100 @@ stripe_create_cbk (call_frame_t *frame,
* @name- complete path of the file to be created.
*/
int32_t
-stripe_create (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- int32_t flags,
- mode_t mode,
- fd_t *fd)
-{
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = NULL;
-
- /* files created in O_APPEND mode does not allow lseek() on fd */
- flags &= ~O_APPEND;
-
- if (priv->first_child_down || priv->nodes_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, fd, loc->inode, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- local->op_errno = ENOTCONN;
- local->stripe_size = stripe_get_matching_bs (loc->path,
- priv->pattern,
- priv->block_size);
- frame->local = local;
- local->inode = loc->inode;
- loc_copy (&local->loc, loc);
- local->fd = fd_ref (fd);
-
- local->call_count = ((stripe_private_t *)this->private)->child_count;
-
- trav = this->children;
- while (trav) {
- STACK_WIND (frame,
- stripe_create_cbk,
- trav->xlator,
- trav->xlator->fops->create,
- loc, flags, mode, fd);
- trav = trav->next;
- }
+stripe_create (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ int32_t flags, mode_t mode, fd_t *fd)
+{
+ stripe_private_t *priv = NULL;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ priv = this->private;
+
+ /* files created in O_APPEND mode does not allow lseek() on fd */
+ flags &= ~O_APPEND;
+
+ if (priv->first_child_down || priv->nodes_down) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "First node down, returning EIO");
+ op_errno = EIO;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ local->op_errno = ENOTCONN;
+ local->stripe_size = stripe_get_matching_bs (loc->path,
+ priv->pattern,
+ priv->block_size);
+ frame->local = local;
+ local->inode = loc->inode;
+ loc_copy (&local->loc, loc);
+ local->fd = fd_ref (fd);
+
+ local->call_count = priv->child_count;
+
+ trav = this->children;
+ while (trav) {
+ STACK_WIND (frame, stripe_create_cbk, trav->xlator,
+ trav->xlator->fops->create, loc, flags, mode, fd);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL);
+ return 0;
}
/**
* stripe_open_cbk -
*/
int32_t
-stripe_open_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- fd_t *fd)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret == -1) {
- local->failed = 1;
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->op_errno = op_errno;
- }
+stripe_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, fd_t *fd)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ local->failed = 1;
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->op_errno = op_errno;
+ }
- if (op_ret >= 0)
- local->op_ret = op_ret;
- }
- UNLOCK (&frame->lock);
+ if (op_ret >= 0)
+ local->op_ret = op_ret;
+ }
+ UNLOCK (&frame->lock);
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
- if (local->op_ret >= 0) {
- fd_ctx_set (local->fd, this, local->stripe_size);
- }
- loc_wipe (&local->loc);
- STACK_UNWIND (frame, local->op_ret, local->op_errno, fd);
- }
+ if (local->op_ret >= 0)
+ fd_ctx_set (local->fd, this, local->stripe_size);
- return 0;
+ loc_wipe (&local->loc);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno, fd);
+ }
+
+ return 0;
}
@@ -1897,183 +1841,183 @@ stripe_open_cbk (call_frame_t *frame,
* stripe_getxattr_cbk -
*/
int32_t
-stripe_open_getxattr_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- dict_t *dict)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- xlator_list_t *trav = this->children;
- stripe_private_t *priv = this->private;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->op_errno = op_errno;
- if (op_errno == ENOTCONN)
- local->failed = 1;
- }
- }
- UNLOCK (&frame->lock);
+stripe_open_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, dict_t *dict)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+
+ priv = this->private;
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->op_errno = op_errno;
+ if (op_errno == ENOTCONN)
+ local->failed = 1;
+ }
+ }
+ UNLOCK (&frame->lock);
- if (!callcnt) {
- if (!local->failed && (local->op_ret != -1)) {
- /* If getxattr doesn't fails, call open */
- char size_key[256] = {0,};
- data_t *stripe_size_data = NULL;
-
- sprintf (size_key,
- "trusted.%s.stripe-size", this->name);
- stripe_size_data = dict_get (dict, size_key);
-
- if (stripe_size_data) {
- local->stripe_size =
- data_to_int64 (stripe_size_data);
- /*
- if (local->stripe_size != priv->block_size) {
- gf_log (this->name, GF_LOG_WARNING,
- "file(%s) is having different "
- "block-size", local->loc.path);
- }
- */
- } else {
- /* if the file was created using earlier
- versions of stripe */
- gf_log (this->name, GF_LOG_CRITICAL,
- "[CRITICAL] Seems like file(%s) "
- "created using earlier version",
- local->loc.path);
- }
- }
+ if (!callcnt) {
+ if (!local->failed && (local->op_ret != -1)) {
+ /* If getxattr doesn't fails, call open */
+ char size_key[256] = {0,};
+ data_t *stripe_size_data = NULL;
+
+ sprintf (size_key,
+ "trusted.%s.stripe-size", this->name);
+ stripe_size_data = dict_get (dict, size_key);
+
+ if (stripe_size_data) {
+ local->stripe_size =
+ data_to_int64 (stripe_size_data);
+ /*
+ if (local->stripe_size != priv->block_size) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "file(%s) is having different "
+ "block-size", local->loc.path);
+ }
+ */
+ } else {
+ /* if the file was created using earlier
+ versions of stripe */
+ gf_log (this->name, GF_LOG_DEBUG,
+ "[CRITICAL] Seems like file(%s) "
+ "created using earlier version",
+ local->loc.path);
+ }
+ }
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_open_cbk,
- trav->xlator,
- trav->xlator->fops->open,
- &local->loc, local->flags, local->fd);
- trav = trav->next;
- }
- }
+ local->call_count = priv->child_count;
+
+ trav = this->children;
+ while (trav) {
+ STACK_WIND (frame, stripe_open_cbk, trav->xlator,
+ trav->xlator->fops->open, &local->loc,
+ local->flags, local->fd);
+ trav = trav->next;
+ }
+ }
- return 0;
+ return 0;
}
/**
* stripe_open -
*/
int32_t
-stripe_open (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- int32_t flags,
- fd_t *fd)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
+stripe_open (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ int32_t flags, fd_t *fd)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- /* files opened in O_APPEND mode does not allow lseek() on fd */
- flags &= ~O_APPEND;
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->fd = fd;
- frame->local = local;
- local->inode = loc->inode;
- loc_copy (&local->loc, loc);
-
- /* Striped files */
- local->flags = flags;
- local->call_count = priv->child_count;
- local->stripe_size = stripe_get_matching_bs (loc->path,
- priv->pattern,
- priv->block_size);
-
- if (priv->xattr_supported) {
- while (trav) {
- STACK_WIND (frame,
- stripe_open_getxattr_cbk,
- trav->xlator,
- trav->xlator->fops->getxattr,
- loc, NULL);
- trav = trav->next;
- }
- } else {
- while (trav) {
- STACK_WIND (frame,
- stripe_open_cbk,
- trav->xlator,
- trav->xlator->fops->open,
- &local->loc, local->flags, local->fd);
- trav = trav->next;
- }
- }
-
- return 0;
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+
+ /* files opened in O_APPEND mode does not allow lseek() on fd */
+ flags &= ~O_APPEND;
+
+ local->fd = fd;
+ frame->local = local;
+ local->inode = loc->inode;
+ loc_copy (&local->loc, loc);
+
+ /* Striped files */
+ local->flags = flags;
+ local->call_count = priv->child_count;
+ local->stripe_size = stripe_get_matching_bs (loc->path,
+ priv->pattern,
+ priv->block_size);
+
+ if (priv->xattr_supported) {
+ while (trav) {
+ STACK_WIND (frame, stripe_open_getxattr_cbk,
+ trav->xlator, trav->xlator->fops->getxattr,
+ loc, NULL);
+ trav = trav->next;
+ }
+ } else {
+ while (trav) {
+ STACK_WIND (frame, stripe_open_cbk, trav->xlator,
+ trav->xlator->fops->open,
+ &local->loc, local->flags, local->fd);
+ trav = trav->next;
+ }
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
/**
* stripe_opendir_cbk -
*/
int32_t
-stripe_opendir_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- fd_t *fd)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
-
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->failed = 1;
- local->op_errno = op_errno;
- }
+stripe_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, fd_t *fd)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->failed = 1;
+ local->op_errno = op_errno;
+ }
- if (op_ret >= 0)
- local->op_ret = op_ret;
- }
- UNLOCK (&frame->lock);
+ if (op_ret >= 0)
+ local->op_ret = op_ret;
+ }
+ UNLOCK (&frame->lock);
- if (!callcnt) {
- STACK_UNWIND (frame, local->op_ret,
- local->op_errno, local->fd);
- }
+ if (!callcnt) {
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ local->fd);
+ }
- return 0;
+ return 0;
}
@@ -2081,42 +2025,48 @@ stripe_opendir_cbk (call_frame_t *frame,
* stripe_opendir -
*/
int32_t
-stripe_opendir (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- fd_t *fd)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
-
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning EIO");
- STACK_UNWIND (frame, -1, EIO, NULL);
- return 0;
- }
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- frame->local = local;
- local->inode = loc->inode;
- local->fd = fd;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_opendir_cbk,
- trav->xlator,
- trav->xlator->fops->opendir,
- loc, fd);
- trav = trav->next;
- }
+stripe_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)
+{
+ xlator_list_t *trav = NULL;
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ frame->local = local;
+ local->inode = loc->inode;
+ local->fd = fd;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_opendir_cbk, trav->xlator,
+ trav->xlator->fops->opendir, loc, fd);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2124,15 +2074,11 @@ stripe_opendir (call_frame_t *frame,
* stripe_getxattr_cbk -
*/
int32_t
-stripe_getxattr_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- dict_t *value)
+stripe_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, dict_t *value)
{
- STACK_UNWIND (frame, op_ret, op_errno, value);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, value);
+ return 0;
}
@@ -2140,49 +2086,48 @@ stripe_getxattr_cbk (call_frame_t *frame,
* stripe_getxattr -
*/
int32_t
-stripe_getxattr (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- const char *name)
+stripe_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ const char *name)
{
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
- STACK_WIND (frame,
- stripe_getxattr_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->getxattr,
- loc, name);
+ STACK_WIND (frame, stripe_getxattr_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->getxattr, loc, name);
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
/**
* stripe_removexattr -
*/
int32_t
-stripe_removexattr (call_frame_t *frame,
- xlator_t *this,
- loc_t *loc,
- const char *name)
+stripe_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
+ const char *name)
{
- stripe_private_t *priv = this->private;
+ int32_t op_errno = 1;
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (loc, err);
+ VALIDATE_OR_GOTO (loc->path, err);
+ VALIDATE_OR_GOTO (loc->inode, err);
- if (priv->first_child_down) {
- gf_log (this->name, GF_LOG_WARNING,
- "First node down, returning ENOTCONN");
- STACK_UNWIND (frame, -1, ENOTCONN, NULL);
- return 0;
- }
+ STACK_WIND (frame, stripe_common_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->removexattr, loc, name);
- STACK_WIND (frame,
- stripe_common_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->removexattr,
- loc, name);
-
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -2190,43 +2135,41 @@ stripe_removexattr (call_frame_t *frame,
* stripe_lk_cbk -
*/
int32_t
-stripe_lk_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct flock *lock)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK (&frame->lock);
- {
- callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_errno = op_errno;
- if (op_errno == ENOTCONN)
- local->failed = 1;
- }
- if (op_ret == 0 && local->op_ret == -1) {
- /* First successful call, copy the *lock */
- local->op_ret = 0;
- local->lock = *lock;
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- if (local->failed)
- local->op_ret = -1;
- STACK_UNWIND (frame, local->op_ret,
- local->op_errno, &local->lock);
- }
- return 0;
+stripe_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct flock *lock)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ if (op_errno == ENOTCONN)
+ local->failed = 1;
+ }
+ if (op_ret == 0 && local->op_ret == -1) {
+ /* First successful call, copy the *lock */
+ local->op_ret = 0;
+ local->lock = *lock;
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->failed)
+ local->op_ret = -1;
+ STACK_UNWIND (frame, local->op_ret,
+ local->op_errno, &local->lock);
+ }
+ return 0;
}
@@ -2234,71 +2177,86 @@ stripe_lk_cbk (call_frame_t *frame,
* stripe_lk -
*/
int32_t
-stripe_lk (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- int32_t cmd,
- struct flock *lock)
-{
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
- stripe_private_t *priv = this->private;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
+stripe_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,
+ struct flock *lock)
+{
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ trav = this->children;
+ priv = this->private;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_lk_cbk,
- trav->xlator,
- trav->xlator->fops->lk,
- fd, cmd, lock);
- trav = trav->next;
- }
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_lk_cbk, trav->xlator,
+ trav->xlator->fops->lk, fd, cmd, lock);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
/**
* stripe_writedir -
*/
int32_t
-stripe_setdents (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- int32_t flags,
- dir_entry_t *entries,
- int32_t count)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->setdents,
- fd, flags, entries, count);
- trav = trav->next;
- }
+stripe_setdents (call_frame_t *frame, xlator_t *this, fd_t *fd,
+ int32_t flags, dir_entry_t *entries, int32_t count)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ trav->xlator->fops->setdents, fd, flags, entries,
+ count);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -2306,44 +2264,45 @@ stripe_setdents (call_frame_t *frame,
* stripe_flush -
*/
int32_t
-stripe_flush (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd)
+stripe_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->flush,
- fd);
- trav = trav->next;
- }
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
- return 0;
-}
+ priv = this->private;
+ trav = this->children;
+ if (priv->first_child_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ trav->xlator->fops->flush, fd);
+ trav = trav->next;
+ }
-/**
- * stripe_close -
- */
-int32_t
-stripe_release (xlator_t *this,
- fd_t *fd)
-{
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -2351,34 +2310,41 @@ stripe_release (xlator_t *this,
* stripe_fsync -
*/
int32_t
-stripe_fsync (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- int32_t flags)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->fsync,
- fd, flags);
- trav = trav->next;
- }
+stripe_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ trav->xlator->fops->fsync, fd, flags);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno);
+ return 0;
}
@@ -2387,33 +2353,43 @@ stripe_fsync (call_frame_t *frame,
*/
int32_t
stripe_fstat (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = fd->inode;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->fstat,
- fd);
- trav = trav->next;
- }
+ xlator_t *this,
+ fd_t *fd)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = fd->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk, trav->xlator,
+ trav->xlator->fops->fstat, fd);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2421,35 +2397,42 @@ stripe_fstat (call_frame_t *frame,
* stripe_fchmod -
*/
int32_t
-stripe_fchmod (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- mode_t mode)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = fd->inode;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->fchmod,
- fd, mode);
- trav = trav->next;
- }
-
- return 0;
+stripe_fchmod (call_frame_t *frame, xlator_t *this, fd_t *fd, mode_t mode)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = fd->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk, trav->xlator,
+ trav->xlator->fops->fchmod, fd, mode);
+ trav = trav->next;
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2457,36 +2440,43 @@ stripe_fchmod (call_frame_t *frame,
* stripe_fchown -
*/
int32_t
-stripe_fchown (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- uid_t uid,
- gid_t gid)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = fd->inode;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->fchown,
- fd, uid, gid);
- trav = trav->next;
- }
-
- return 0;
+stripe_fchown (call_frame_t *frame, xlator_t *this, fd_t *fd, uid_t uid,
+ gid_t gid)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = fd->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk, trav->xlator,
+ trav->xlator->fops->fchown, fd, uid, gid);
+ trav = trav->next;
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2494,46 +2484,42 @@ stripe_fchown (call_frame_t *frame,
* stripe_ftruncate -
*/
int32_t
-stripe_ftruncate (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- off_t offset)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->inode = fd->inode;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_buf_cbk,
- trav->xlator,
- trav->xlator->fops->ftruncate,
- fd, offset);
- trav = trav->next;
- }
-
- return 0;
-}
-
+stripe_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->inode = fd->inode;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_buf_cbk, trav->xlator,
+ trav->xlator->fops->ftruncate, fd, offset);
+ trav = trav->next;
+ }
-/**
- * stripe_releasedir -
- */
-int32_t
-stripe_releasedir (xlator_t *this,
- fd_t *fd)
-{
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2541,35 +2527,41 @@ stripe_releasedir (xlator_t *this,
* stripe_fsyncdir -
*/
int32_t
-stripe_fsyncdir (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- int32_t flags)
-{
- stripe_local_t *local = NULL;
- stripe_private_t *priv = this->private;
- xlator_list_t *trav = this->children;
-
- STRIPE_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (fd);
-
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame,
- stripe_stack_unwind_cbk,
- trav->xlator,
- trav->xlator->fops->fsyncdir,
- fd,
- flags);
- trav = trav->next;
- }
+stripe_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)
+{
+ stripe_local_t *local = NULL;
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+
+ VALIDATE_OR_GOTO (frame, err);
+ VALIDATE_OR_GOTO (this, err);
+ VALIDATE_OR_GOTO (fd, err);
+ VALIDATE_OR_GOTO (fd->inode, err);
+
+ priv = this->private;
+ trav = this->children;
+
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ trav->xlator->fops->fsyncdir, fd, flags);
+ trav = trav->next;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2578,18 +2570,13 @@ stripe_fsyncdir (call_frame_t *frame,
* file name doesn't match the pattern specified for striping.
*/
int32_t
-stripe_single_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 stat *stbuf,
- struct iobref *iobref)
+stripe_single_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 stat *stbuf, struct iobref *iobref)
{
- STACK_UNWIND (frame, op_ret, op_errno, vector, count, stbuf, iobref);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, vector, count, stbuf, iobref);
+ return 0;
}
/**
@@ -2597,184 +2584,195 @@ stripe_single_readv_cbk (call_frame_t *frame,
* to above layer after putting it in a single vector.
*/
int32_t
-stripe_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 stat *stbuf,
- struct iobref *iobref)
-{
- int32_t index = 0;
- int32_t callcnt = 0;
- call_frame_t *main_frame = NULL;
- stripe_local_t *main_local = NULL;
- stripe_local_t *local = frame->local;
-
- index = local->node_index;
- main_frame = local->orig_frame;
- main_local = main_frame->local;
-
- LOCK (&main_frame->lock);
- {
- main_local->replies[index].op_ret = op_ret;
- main_local->replies[index].op_errno = op_errno;
- if (op_ret >= 0) {
- main_local->replies[index].stbuf = *stbuf;
- main_local->replies[index].count = count;
- main_local->replies[index].vector =
- iov_dup (vector, count);
+stripe_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 stat *stbuf, struct iobref *iobref)
+{
+ int32_t index = 0;
+ int32_t callcnt = 0;
+ call_frame_t *main_frame = NULL;
+ stripe_local_t *main_local = NULL;
+ stripe_local_t *local = frame->local;
+
+ index = local->node_index;
+ main_frame = local->orig_frame;
+ main_local = main_frame->local;
+
+ LOCK (&main_frame->lock);
+ {
+ main_local->replies[index].op_ret = op_ret;
+ main_local->replies[index].op_errno = op_errno;
+ if (op_ret >= 0) {
+ main_local->replies[index].stbuf = *stbuf;
+ main_local->replies[index].count = count;
+ main_local->replies[index].vector =
+ iov_dup (vector, count);
if (!main_local->iobref)
main_local->iobref = iobref_new ();
iobref_merge (main_local->iobref, iobref);
- }
- callcnt = ++main_local->call_count;
- }
- UNLOCK(&main_frame->lock);
-
- if (callcnt == main_local->wind_count) {
- int32_t final_count = 0;
- struct iovec *final_vec = NULL;
- struct stat tmp_stbuf = {0,};
- struct iobref *iobref = NULL;
-
- op_ret = 0;
- memcpy (&tmp_stbuf, &main_local->replies[0].stbuf,
- sizeof (struct stat));
- for (index=0; index < main_local->wind_count; index++) {
- /* TODO: check whether each stripe returned 'expected'
- * number of bytes
- */
- if (main_local->replies[index].op_ret == -1) {
- op_ret = -1;
- op_errno = main_local->replies[index].op_errno;
- break;
- }
- op_ret += main_local->replies[index].op_ret;
- final_count += main_local->replies[index].count;
- /* TODO: Do I need to send anything more in stbuf? */
- if (tmp_stbuf.st_size <
- main_local->replies[index].stbuf.st_size) {
- tmp_stbuf.st_size =
- main_local->replies[index].stbuf.st_size;
- }
- }
- if (op_ret != -1) {
- final_vec = CALLOC (final_count,
- sizeof (struct iovec));
- ERR_ABORT (final_vec);
- final_count = 0;
-
- for (index=0;
- index < main_local->wind_count; index++) {
- memcpy (final_vec + final_count,
- main_local->replies[index].vector,
- (main_local->replies[index].count *
- sizeof (struct iovec)));
- final_count +=
- main_local->replies[index].count;
-
- free (main_local->replies[index].vector);
- }
- } else {
- final_vec = NULL;
- final_count = 0;
- }
- /* */
- FREE (main_local->replies);
+ }
+ callcnt = ++main_local->call_count;
+ }
+ UNLOCK(&main_frame->lock);
+
+ if (callcnt == main_local->wind_count) {
+ int32_t final_count = 0;
+ struct iovec *final_vec = NULL;
+ struct stat tmp_stbuf = {0,};
+ struct iobref *iobref = NULL;
+
+ op_ret = 0;
+ memcpy (&tmp_stbuf, &main_local->replies[0].stbuf,
+ sizeof (struct stat));
+ for (index=0; index < main_local->wind_count; index++) {
+ /* TODO: check whether each stripe returned 'expected'
+ * number of bytes
+ */
+ if (main_local->replies[index].op_ret == -1) {
+ op_ret = -1;
+ op_errno = main_local->replies[index].op_errno;
+ break;
+ }
+ op_ret += main_local->replies[index].op_ret;
+ final_count += main_local->replies[index].count;
+ /* TODO: Do I need to send anything more in stbuf? */
+ if (tmp_stbuf.st_size <
+ main_local->replies[index].stbuf.st_size) {
+ tmp_stbuf.st_size =
+ main_local->replies[index].stbuf.st_size;
+ }
+ }
+ if (op_ret != -1) {
+ final_vec = CALLOC (final_count,
+ sizeof (struct iovec));
+ if (!final_vec) {
+ op_ret = -1;
+ final_count = 0;
+ goto done;
+ }
+
+ final_count = 0;
+
+ for (index=0;
+ index < main_local->wind_count; index++) {
+ memcpy (final_vec + final_count,
+ main_local->replies[index].vector,
+ (main_local->replies[index].count *
+ sizeof (struct iovec)));
+ final_count +=
+ main_local->replies[index].count;
+
+ free (main_local->replies[index].vector);
+ }
+ } else {
+ final_vec = NULL;
+ final_count = 0;
+ }
+
+ done:
+ /* */
+ FREE (main_local->replies);
iobref = main_local->iobref;
- STACK_UNWIND (main_frame, op_ret, op_errno,
- final_vec, final_count, &tmp_stbuf, iobref);
+ STACK_UNWIND (main_frame, op_ret, op_errno,
+ final_vec, final_count, &tmp_stbuf, iobref);
- iobref_unref (iobref);
- if (final_vec)
- free (final_vec);
- }
+ iobref_unref (iobref);
+ if (final_vec)
+ FREE (final_vec);
+ }
- STACK_DESTROY (frame->root);
- return 0;
+ STACK_DESTROY (frame->root);
+ return 0;
}
/**
* stripe_readv -
*/
int32_t
-stripe_readv (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- size_t size,
- off_t offset)
-{
- int32_t index = 0;
- int32_t num_stripe = 0;
- size_t frame_size = 0;
- off_t rounded_end = 0;
- uint64_t stripe_size = 0;
- off_t rounded_start = 0;
- off_t frame_offset = offset;
- stripe_local_t *local = NULL;
- call_frame_t *rframe = NULL;
- stripe_local_t *rlocal = NULL;
- xlator_list_t *trav = this->children;
- stripe_private_t *priv = this->private;
-
- fd_ctx_get (fd, this, &stripe_size);
- if (!stripe_size) {
- STACK_UNWIND (frame, -1, EINVAL, NULL, 0, NULL);
- return 0;
- }
-
- /* The file is stripe across the child nodes. Send the read request
- * to the child nodes appropriately after checking which region of
- * the file is in which child node. Always '0-<stripe_size>' part of
- * the file resides in the first child.
- */
- rounded_start = floor (offset, stripe_size);
- rounded_end = roof (offset+size, stripe_size);
- num_stripe = (rounded_end - rounded_start) / stripe_size;
-
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- local->wind_count = num_stripe;
- frame->local = local;
-
- /* This is where all the vectors should be copied. */
- local->replies = CALLOC (1, num_stripe *
- sizeof (struct readv_replies));
- ERR_ABORT (local->replies);
-
- for (index = 0;
- index < ((offset / stripe_size) % priv->child_count);
- index++) {
- trav = trav->next;
- }
+stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd,
+ size_t size, off_t offset)
+{
+ int32_t op_errno = 1;
+ int32_t index = 0;
+ int32_t num_stripe = 0;
+ size_t frame_size = 0;
+ off_t rounded_end = 0;
+ uint64_t stripe_size = 0;
+ off_t rounded_start = 0;
+ off_t frame_offset = offset;
+ stripe_local_t *local = NULL;
+ call_frame_t *rframe = NULL;
+ stripe_local_t *rlocal = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+
+ trav = this->children;
+ priv = this->private;
+
+ fd_ctx_get (fd, this, &stripe_size);
+ if (!stripe_size) {
+ op_errno = EBADFD;
+ goto err;
+ }
+
+ /* The file is stripe across the child nodes. Send the read request
+ * to the child nodes appropriately after checking which region of
+ * the file is in which child node. Always '0-<stripe_size>' part of
+ * the file resides in the first child.
+ */
+ rounded_start = floor (offset, stripe_size);
+ rounded_end = roof (offset+size, stripe_size);
+ num_stripe = (rounded_end - rounded_start) / stripe_size;
+
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->wind_count = num_stripe;
+ frame->local = local;
+
+ /* This is where all the vectors should be copied. */
+ local->replies = CALLOC (num_stripe, sizeof (struct readv_replies));
+ if (!local->replies) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+
+ for (index = 0;
+ index < ((offset / stripe_size) % priv->child_count);
+ index++) {
+ trav = trav->next;
+ }
- for (index = 0; index < num_stripe; index++) {
- rframe = copy_frame (frame);
- rlocal = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (rlocal);
-
- frame_size = min (roof (frame_offset+1, stripe_size),
- (offset + size)) - frame_offset;
-
- rlocal->node_index = index;
- rlocal->orig_frame = frame;
- rframe->local = rlocal;
- STACK_WIND (rframe,
- stripe_readv_cbk,
- trav->xlator,
- trav->xlator->fops->readv,
- fd, frame_size, frame_offset);
+ for (index = 0; index < num_stripe; index++) {
+ rframe = copy_frame (frame);
+ rlocal = CALLOC (1, sizeof (stripe_local_t));
+ if (!rlocal) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+
+ frame_size = min (roof (frame_offset+1, stripe_size),
+ (offset + size)) - frame_offset;
+
+ rlocal->node_index = index;
+ rlocal->orig_frame = frame;
+ rframe->local = rlocal;
+ STACK_WIND (rframe, stripe_readv_cbk, trav->xlator,
+ trav->xlator->fops->readv,
+ fd, frame_size, frame_offset);
- frame_offset += frame_size;
+ frame_offset += frame_size;
- trav = trav->next ? trav->next : this->children;
- }
+ trav = trav->next ? trav->next : this->children;
+ }
- return 0;
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2782,39 +2780,38 @@ stripe_readv (call_frame_t *frame,
* stripe_writev_cbk -
*/
int32_t
-stripe_writev_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct stat *stbuf)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
- LOCK(&frame->lock);
- {
- callcnt = ++local->call_count;
+stripe_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *stbuf)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK(&frame->lock);
+ {
+ callcnt = ++local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_errno = op_errno;
- local->op_ret = -1;
- }
- if (op_ret >= 0) {
- local->op_ret += op_ret;
- local->stbuf = *stbuf;
- }
- }
- UNLOCK (&frame->lock);
-
- if ((callcnt == local->wind_count) && local->unwind) {
- STACK_UNWIND (frame, local->op_ret,
- local->op_errno, &local->stbuf);
- }
- return 0;
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ local->op_ret = -1;
+ }
+ if (op_ret >= 0) {
+ local->op_ret += op_ret;
+ local->stbuf = *stbuf;
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if ((callcnt == local->wind_count) && local->unwind) {
+ STACK_UNWIND (frame, local->op_ret,
+ local->op_errno, &local->stbuf);
+ }
+ return 0;
}
@@ -2822,99 +2819,100 @@ stripe_writev_cbk (call_frame_t *frame,
* stripe_single_writev_cbk -
*/
int32_t
-stripe_single_writev_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct stat *stbuf)
+stripe_single_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *stbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno, stbuf);
- return 0;
+ STACK_UNWIND (frame, op_ret, op_errno, stbuf);
+ return 0;
}
/**
* stripe_writev -
*/
int32_t
-stripe_writev (call_frame_t *frame,
- xlator_t *this,
- fd_t *fd,
- struct iovec *vector,
- int32_t count,
- off_t offset,
+stripe_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
+ struct iovec *vector, int32_t count, off_t offset,
struct iobref *iobref)
{
- int32_t idx = 0;
- int32_t total_size = 0;
- int32_t offset_offset = 0;
- int32_t remaining_size = 0;
- int32_t tmp_count = count;
- off_t fill_size = 0;
- uint64_t stripe_size = 0;
- struct iovec *tmp_vec = vector;
- stripe_private_t *priv = this->private;
- stripe_local_t *local = NULL;
- xlator_list_t *trav = NULL;
-
- fd_ctx_get (fd, this, &stripe_size);
- if (!stripe_size) {
- STACK_UNWIND (frame, -1, EINVAL, NULL);
- return 0;
- }
-
- /* File has to be stripped across the child nodes */
- for (idx = 0; idx< count; idx ++) {
- total_size += tmp_vec[idx].iov_len;
- }
- remaining_size = total_size;
-
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- frame->local = local;
- local->stripe_size = stripe_size;
-
- while (1) {
- /* Send striped chunk of the vector to child
- nodes appropriately. */
- trav = this->children;
-
- idx = (((offset + offset_offset) /
- local->stripe_size) % priv->child_count);
- while (idx) {
- trav = trav->next;
- idx--;
- }
- fill_size = (local->stripe_size -
- ((offset + offset_offset) % local->stripe_size));
- if (fill_size > remaining_size)
- fill_size = remaining_size;
-
- remaining_size -= fill_size;
-
- tmp_count = iov_subset (vector, count, offset_offset,
- offset_offset + fill_size, NULL);
- tmp_vec = CALLOC (tmp_count, sizeof (struct iovec));
- ERR_ABORT (tmp_vec);
- tmp_count = iov_subset (vector, count, offset_offset,
- offset_offset + fill_size, tmp_vec);
-
- local->wind_count++;
- if (remaining_size == 0)
- local->unwind = 1;
-
- STACK_WIND(frame,
- stripe_writev_cbk,
- trav->xlator,
- trav->xlator->fops->writev,
- fd, tmp_vec, tmp_count, offset + offset_offset,
- iobref);
- FREE (tmp_vec);
- offset_offset += fill_size;
- if (remaining_size == 0)
- break;
- }
-
- return 0;
+ struct iovec *tmp_vec = vector;
+ stripe_private_t *priv = NULL;
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ int32_t op_errno = 1;
+ int32_t idx = 0;
+ int32_t total_size = 0;
+ int32_t offset_offset = 0;
+ int32_t remaining_size = 0;
+ int32_t tmp_count = count;
+ off_t fill_size = 0;
+ uint64_t stripe_size = 0;
+
+ priv = this->private;
+
+ fd_ctx_get (fd, this, &stripe_size);
+ if (!stripe_size) {
+ op_errno = EINVAL;
+ goto err;
+ }
+
+ /* File has to be stripped across the child nodes */
+ for (idx = 0; idx< count; idx ++) {
+ total_size += tmp_vec[idx].iov_len;
+ }
+ remaining_size = total_size;
+
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ frame->local = local;
+ local->stripe_size = stripe_size;
+
+ while (1) {
+ /* Send striped chunk of the vector to child
+ nodes appropriately. */
+ trav = this->children;
+
+ idx = (((offset + offset_offset) /
+ local->stripe_size) % priv->child_count);
+ while (idx) {
+ trav = trav->next;
+ idx--;
+ }
+ fill_size = (local->stripe_size -
+ ((offset + offset_offset) % local->stripe_size));
+ if (fill_size > remaining_size)
+ fill_size = remaining_size;
+
+ remaining_size -= fill_size;
+
+ tmp_count = iov_subset (vector, count, offset_offset,
+ offset_offset + fill_size, NULL);
+ tmp_vec = CALLOC (tmp_count, sizeof (struct iovec));
+ if (!tmp_vec) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ tmp_count = iov_subset (vector, count, offset_offset,
+ offset_offset + fill_size, tmp_vec);
+
+ local->wind_count++;
+ if (remaining_size == 0)
+ local->unwind = 1;
+
+ STACK_WIND(frame, stripe_writev_cbk, trav->xlator,
+ trav->xlator->fops->writev, fd, tmp_vec,
+ tmp_count, offset + offset_offset, iobref);
+ FREE (tmp_vec);
+ offset_offset += fill_size;
+ if (remaining_size == 0)
+ break;
+ }
+
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
@@ -2927,157 +2925,160 @@ stripe_writev (call_frame_t *frame,
*
*/
int32_t
-stripe_stats_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- struct xlator_stats *stats)
-{
- int32_t callcnt = 0;
- stripe_local_t *local = frame->local;
-
- LOCK(&frame->lock);
- {
- callcnt = --local->call_count;
+stripe_stats_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct xlator_stats *stats)
+{
+ int32_t callcnt = 0;
+ stripe_local_t *local = NULL;
+
+ local = frame->local;
+
+ LOCK(&frame->lock);
+ {
+ callcnt = --local->call_count;
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_WARNING,
- "%s returned error %s",
- ((call_frame_t *)cookie)->this->name,
- strerror (op_errno));
- local->op_ret = -1;
- local->op_errno = op_errno;
- }
- if (op_ret == 0) {
- if (local->op_ret == -2) {
- /* This is to make sure this is the
- first time */
- local->stats = *stats;
- local->op_ret = 0;
- } else {
- local->stats.nr_files += stats->nr_files;
- local->stats.free_disk += stats->free_disk;
- local->stats.disk_usage += stats->disk_usage;
- local->stats.nr_clients += stats->nr_clients;
- }
- }
- }
- UNLOCK (&frame->lock);
-
- if (!callcnt) {
- STACK_UNWIND (frame, local->op_ret, local->op_errno,
- &local->stats);
- }
-
- return 0;
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "%s returned error %s",
+ ((call_frame_t *)cookie)->this->name,
+ strerror (op_errno));
+ local->op_ret = -1;
+ local->op_errno = op_errno;
+ }
+ if (op_ret == 0) {
+ if (local->op_ret == -2) {
+ /* This is to make sure this is the
+ first time */
+ local->stats = *stats;
+ local->op_ret = 0;
+ } else {
+ local->stats.nr_files += stats->nr_files;
+ local->stats.free_disk += stats->free_disk;
+ local->stats.disk_usage += stats->disk_usage;
+ local->stats.nr_clients += stats->nr_clients;
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ &local->stats);
+ }
+
+ return 0;
}
/**
* stripe_stats -
*/
int32_t
-stripe_stats (call_frame_t *frame,
- xlator_t *this,
- int32_t flags)
-{
- stripe_local_t *local = NULL;
- xlator_list_t *trav = this->children;
-
- local = CALLOC (1, sizeof (stripe_local_t));
- ERR_ABORT (local);
- frame->local = local;
- local->op_ret = -2; /* to be used as a flag in _cbk */
- local->call_count = ((stripe_private_t*)this->private)->child_count;
- while (trav) {
- STACK_WIND (frame,
- stripe_stats_cbk,
- trav->xlator,
- trav->xlator->mops->stats,
- flags);
- trav = trav->next;
- }
- return 0;
+stripe_stats (call_frame_t *frame, xlator_t *this, int32_t flags)
+{
+ stripe_local_t *local = NULL;
+ xlator_list_t *trav = NULL;
+ stripe_private_t *priv = NULL;
+ int32_t op_errno = 1;
+
+ priv = this->private;
+ trav = this->children;
+
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ frame->local = local;
+ local->op_ret = -2; /* to be used as a flag in _cbk */
+ local->call_count = priv->child_count;
+
+ while (trav) {
+ STACK_WIND (frame, stripe_stats_cbk, trav->xlator,
+ trav->xlator->mops->stats, flags);
+ trav = trav->next;
+ }
+ return 0;
+ err:
+ STACK_UNWIND (frame, -1, op_errno, NULL);
+ return 0;
}
/**
* notify
*/
int32_t
-notify (xlator_t *this,
- int32_t event,
- void *data,
- ...)
-{
- stripe_private_t *priv = this->private;
- int down_client = 0;
- int i = 0;
-
- if (!priv)
- return 0;
-
- switch (event)
- {
- case GF_EVENT_CHILD_UP:
- {
- /* get an index number to set */
- for (i = 0; i < priv->child_count; i++) {
- if (data == priv->xl_array[i])
- break;
- }
- priv->state[i] = 1;
- for (i = 0; i < priv->child_count; i++) {
- if (!priv->state[i])
- down_client++;
- }
-
- LOCK (&priv->lock);
- {
- priv->nodes_down = down_client;
-
- if (data == FIRST_CHILD (this)) {
- priv->first_child_down = 0;
- default_notify (this, event, data);
- }
- }
- UNLOCK (&priv->lock);
- }
- break;
- case GF_EVENT_CHILD_DOWN:
- {
- /* get an index number to set */
- for (i = 0; i < priv->child_count; i++) {
- if (data == priv->xl_array[i])
- break;
- }
- priv->state[i] = 0;
- for (i = 0; i < priv->child_count; i++) {
- if (!priv->state[i])
- down_client++;
- }
-
- LOCK (&priv->lock);
- {
- priv->nodes_down = down_client;
-
- if (data == FIRST_CHILD (this)) {
- priv->first_child_down = 1;
- default_notify (this, event, data);
- }
- }
- UNLOCK (&priv->lock);
- }
- break;
-
- default:
- {
- /* */
- default_notify (this, event, data);
- }
- break;
- }
-
- return 0;
+notify (xlator_t *this, int32_t event, void *data, ...)
+{
+ stripe_private_t *priv = NULL;
+ int down_client = 0;
+ int i = 0;
+
+ priv = this->private;
+ if (!priv)
+ return 0;
+
+ switch (event)
+ {
+ case GF_EVENT_CHILD_UP:
+ {
+ /* get an index number to set */
+ for (i = 0; i < priv->child_count; i++) {
+ if (data == priv->xl_array[i])
+ break;
+ }
+ priv->state[i] = 1;
+ for (i = 0; i < priv->child_count; i++) {
+ if (!priv->state[i])
+ down_client++;
+ }
+
+ LOCK (&priv->lock);
+ {
+ priv->nodes_down = down_client;
+
+ if (data == FIRST_CHILD (this)) {
+ priv->first_child_down = 0;
+ default_notify (this, event, data);
+ }
+ }
+ UNLOCK (&priv->lock);
+ }
+ break;
+ case GF_EVENT_CHILD_DOWN:
+ {
+ /* get an index number to set */
+ for (i = 0; i < priv->child_count; i++) {
+ if (data == priv->xl_array[i])
+ break;
+ }
+ priv->state[i] = 0;
+ for (i = 0; i < priv->child_count; i++) {
+ if (!priv->state[i])
+ down_client++;
+ }
+
+ LOCK (&priv->lock);
+ {
+ priv->nodes_down = down_client;
+
+ if (data == FIRST_CHILD (this)) {
+ priv->first_child_down = 1;
+ default_notify (this, event, data);
+ }
+ }
+ UNLOCK (&priv->lock);
+ }
+ break;
+
+ default:
+ {
+ /* */
+ default_notify (this, event, data);
+ }
+ break;
+ }
+
+ return 0;
}
int
@@ -3143,82 +3144,86 @@ set_stripe_block_size (xlator_t *this, stripe_private_t *priv, char *data)
int32_t
init (xlator_t *this)
{
- stripe_private_t *priv = NULL;
- xlator_list_t *trav = NULL;
- data_t *data = NULL;
- int32_t count = 0;
- int ret = -1;
-
- trav = this->children;
- while (trav) {
- count++;
- trav = trav->next;
- }
-
- if (!count) {
- gf_log (this->name, GF_LOG_ERROR,
- "stripe configured without \"subvolumes\" option. "
- "exiting");
+ stripe_private_t *priv = NULL;
+ xlator_list_t *trav = NULL;
+ data_t *data = NULL;
+ int32_t count = 0;
+ int ret = -1;
+
+ trav = this->children;
+ while (trav) {
+ count++;
+ trav = trav->next;
+ }
+
+ if (!count) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "stripe configured without \"subvolumes\" option. "
+ "exiting");
goto out;
- }
+ }
- if (!this->parents) {
- gf_log (this->name, GF_LOG_WARNING,
- "dangling volume. check volfile ");
- }
+ if (!this->parents) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "dangling volume. check volfile ");
+ }
- priv = CALLOC (1, sizeof (stripe_private_t));
+ priv = CALLOC (1, sizeof (stripe_private_t));
if (!priv)
goto out;
- priv->xl_array = CALLOC (1, count * sizeof (xlator_t *));
+ priv->xl_array = CALLOC (count, sizeof (xlator_t *));
if (!priv->xl_array)
goto out;
- priv->child_count = count;
- LOCK_INIT (&priv->lock);
-
- trav = this->children;
- count = 0;
- while (trav) {
- priv->xl_array[count++] = trav->xlator;
- trav = trav->next;
- }
-
- if (count > 256) {
- gf_log (this->name, GF_LOG_ERROR,
- "maximum number of stripe subvolumes supported "
- "is 256");
- goto out;
- }
-
- priv->block_size = (128 * GF_UNIT_KB);
- /* option stripe-pattern *avi:1GB,*pdf:4096 */
- data = dict_get (this->options, "block-size");
- if (!data) {
- gf_log (this->name, GF_LOG_DEBUG,
- "No \"option block-size <x>\" given, defaulting "
- "to 128KB");
- } else {
+ priv->state = CALLOC (count, sizeof (int8_t));
+ if (!priv->xl_array)
+ goto out;
+
+ priv->child_count = count;
+ LOCK_INIT (&priv->lock);
+
+ trav = this->children;
+ count = 0;
+ while (trav) {
+ priv->xl_array[count++] = trav->xlator;
+ trav = trav->next;
+ }
+
+ if (count > 256) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "maximum number of stripe subvolumes supported "
+ "is 256");
+ goto out;
+ }
+
+ priv->block_size = (128 * GF_UNIT_KB);
+ /* option stripe-pattern *avi:1GB,*pdf:4096 */
+ data = dict_get (this->options, "block-size");
+ if (!data) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "No \"option block-size <x>\" given, defaulting "
+ "to 128KB");
+ } else {
ret = set_stripe_block_size (this, priv, data->data);
if (ret)
goto out;
- }
+ }
- priv->xattr_supported = 1;
- data = dict_get (this->options, "use-xattr");
- if (data) {
- if (gf_string2boolean (data->data,
- &priv->xattr_supported) == -1) {
- gf_log (this->name, GF_LOG_ERROR,
- "error setting hard check for extended "
- "attribute");
- //return -1;
- }
- }
-
- /* notify related */
- priv->nodes_down = priv->child_count;
- this->private = priv;
+ priv->xattr_supported = 1;
+ data = dict_get (this->options, "use-xattr");
+ if (data) {
+ if (gf_string2boolean (data->data,
+ &priv->xattr_supported) == -1) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "error setting hard check for extended "
+ "attribute");
+ //return -1;
+ }
+ }
+
+ /* notify related */
+ priv->nodes_down = priv->child_count;
+ this->private = priv;
ret = 0;
out:
@@ -3229,7 +3234,7 @@ init (xlator_t *this)
FREE (priv);
}
}
- return ret;
+ return ret;
}
/**
@@ -3239,73 +3244,79 @@ init (xlator_t *this)
void
fini (xlator_t *this)
{
- stripe_private_t *priv = this->private;
- struct stripe_options *prev = NULL;
- struct stripe_options *trav = priv->pattern;
- while (trav) {
- prev = trav;
- trav = trav->next;
- FREE (prev);
- }
- FREE (priv->xl_array);
- LOCK_DESTROY (&priv->lock);
- FREE (priv);
- return;
+ stripe_private_t *priv = NULL;
+ struct stripe_options *prev = NULL;
+ struct stripe_options *trav = NULL;
+
+ priv = this->private;
+ if (priv) {
+ if (priv->xl_array)
+ FREE (priv->xl_array);
+
+ trav = priv->pattern;
+ while (trav) {
+ prev = trav;
+ trav = trav->next;
+ FREE (prev);
+ }
+ LOCK_DESTROY (&priv->lock);
+ FREE (priv);
+ }
+
+ return;
}
struct xlator_fops fops = {
- .stat = stripe_stat,
- .unlink = stripe_unlink,
- .symlink = stripe_symlink,
- .rename = stripe_rename,
- .link = stripe_link,
- .chmod = stripe_chmod,
- .chown = stripe_chown,
- .truncate = stripe_truncate,
- .utimens = stripe_utimens,
- .create = stripe_create,
- .open = stripe_open,
- .readv = stripe_readv,
- .writev = stripe_writev,
- .statfs = stripe_statfs,
- .flush = stripe_flush,
- .fsync = stripe_fsync,
- .setxattr = stripe_setxattr,
- .getxattr = stripe_getxattr,
- .removexattr = stripe_removexattr,
- .access = stripe_access,
- .ftruncate = stripe_ftruncate,
- .fstat = stripe_fstat,
- .readlink = stripe_readlink,
- .mkdir = stripe_mkdir,
- .rmdir = stripe_rmdir,
- .lk = stripe_lk,
- .opendir = stripe_opendir,
- .fsyncdir = stripe_fsyncdir,
- .fchmod = stripe_fchmod,
- .fchown = stripe_fchown,
- .lookup = stripe_lookup,
- .setdents = stripe_setdents,
- .mknod = stripe_mknod,
+ .stat = stripe_stat,
+ .unlink = stripe_unlink,
+ .symlink = stripe_symlink,
+ .rename = stripe_rename,
+ .link = stripe_link,
+ .chmod = stripe_chmod,
+ .chown = stripe_chown,
+ .truncate = stripe_truncate,
+ .utimens = stripe_utimens,
+ .create = stripe_create,
+ .open = stripe_open,
+ .readv = stripe_readv,
+ .writev = stripe_writev,
+ .statfs = stripe_statfs,
+ .flush = stripe_flush,
+ .fsync = stripe_fsync,
+ .setxattr = stripe_setxattr,
+ .getxattr = stripe_getxattr,
+ .removexattr = stripe_removexattr,
+ .access = stripe_access,
+ .ftruncate = stripe_ftruncate,
+ .fstat = stripe_fstat,
+ .readlink = stripe_readlink,
+ .mkdir = stripe_mkdir,
+ .rmdir = stripe_rmdir,
+ .lk = stripe_lk,
+ .opendir = stripe_opendir,
+ .fsyncdir = stripe_fsyncdir,
+ .fchmod = stripe_fchmod,
+ .fchown = stripe_fchown,
+ .lookup = stripe_lookup,
+ .setdents = stripe_setdents,
+ .mknod = stripe_mknod,
};
struct xlator_mops mops = {
- .stats = stripe_stats,
+ .stats = stripe_stats,
};
struct xlator_cbks cbks = {
- .release = stripe_release,
- .releasedir = stripe_releasedir
};
struct volume_options options[] = {
- { .key = {"block-size"},
- .type = GF_OPTION_TYPE_ANY
- },
- { .key = {"use-xattr"},
- .type = GF_OPTION_TYPE_BOOL
- },
- { .key = {NULL} },
+ { .key = {"block-size"},
+ .type = GF_OPTION_TYPE_ANY
+ },
+ { .key = {"use-xattr"},
+ .type = GF_OPTION_TYPE_BOOL
+ },
+ { .key = {NULL} },
};
diff --git a/xlators/cluster/stripe/src/stripe.h b/xlators/cluster/stripe/src/stripe.h
new file mode 100644
index 00000000000..fbaf8fad6af
--- /dev/null
+++ b/xlators/cluster/stripe/src/stripe.h
@@ -0,0 +1,125 @@
+/*
+ Copyright (c) 2009 Z RESEARCH, Inc. <http://www.zresearch.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 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef _STRIPE_H_
+#define _STRIPE_H_
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+#include "config.h"
+#endif
+
+#include "xlator.h"
+#include "logging.h"
+#include "defaults.h"
+#include "compat.h"
+#include "compat-errno.h"
+#include <fnmatch.h>
+#include <signal.h>
+
+
+/**
+ * struct stripe_options : This keeps the pattern and the block-size
+ * information, which is used for striping on a file.
+ */
+struct stripe_options {
+ struct stripe_options *next;
+ char path_pattern[256];
+ uint64_t block_size;
+};
+
+/**
+ * Private structure for stripe translator
+ */
+struct stripe_private {
+ struct stripe_options *pattern;
+ xlator_t **xl_array;
+ uint64_t block_size;
+ gf_lock_t lock;
+ uint8_t nodes_down;
+ int8_t first_child_down;
+ int8_t child_count;
+ int8_t *state; /* Current state of child node */
+ gf_boolean_t xattr_supported; /* default yes */
+};
+
+/**
+ * Used to keep info about the replies received from fops->readv calls
+ */
+struct readv_replies {
+ struct iovec *vector;
+ int32_t count; //count of vector
+ int32_t op_ret; //op_ret of readv
+ int32_t op_errno;
+ struct stat stbuf; /* 'stbuf' is also a part of reply */
+};
+
+/**
+ * Local structure to be passed with all the frames in case of STACK_WIND
+ */
+struct stripe_local; /* this itself is used inside the structure; */
+
+struct stripe_local {
+ struct stripe_local *next;
+ call_frame_t *orig_frame;
+
+ /* Used by _cbk functions */
+ struct stat stbuf;
+ struct readv_replies *replies;
+ struct statvfs statvfs_buf;
+ dir_entry_t *entry;
+ struct xlator_stats stats;
+
+ int8_t revalidate;
+ int8_t failed;
+ int8_t unwind;
+
+ int32_t node_index;
+ int32_t call_count;
+ int32_t wind_count; /* used instead of child_cound
+ in case of read and write */
+ int32_t op_ret;
+ int32_t op_errno;
+ int32_t count;
+ int32_t flags;
+ char *name;
+ inode_t *inode;
+
+ loc_t loc;
+ loc_t loc2;
+
+ /* For File I/O fops */
+ dict_t *dict;
+
+ /* General usage */
+ off_t offset;
+ off_t stripe_size;
+
+ int8_t *list;
+ struct flock lock;
+ fd_t *fd;
+ void *value;
+ struct iobref *iobref;
+};
+
+typedef struct stripe_local stripe_local_t;
+typedef struct stripe_private stripe_private_t;
+
+#endif /* _STRIPE_H_ */