summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
-rw-r--r--xlators/cluster/dht/src/dht-common.c184
1 files changed, 157 insertions, 27 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index d5d6f4c3e2f..49af12101b7 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -79,7 +79,8 @@ dht_lookup_selfheal_cbk (call_frame_t *frame, void *cookie,
int
dht_lookup_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf, dict_t *xattr)
+ inode_t *inode, struct stat *stbuf, dict_t *xattr,
+ struct stat *postparent)
{
dht_conf_t *conf = NULL;
dht_local_t *local = NULL;
@@ -190,7 +191,8 @@ selfheal:
int
dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf, dict_t *xattr)
+ inode_t *inode, struct stat *stbuf, dict_t *xattr,
+ struct stat *postparent)
{
dht_local_t *local = NULL;
int this_call_cnt = 0;
@@ -308,7 +310,8 @@ int
dht_lookup_linkfile_create_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
xlator_t *cached_subvol = NULL;
@@ -345,7 +348,8 @@ unwind:
int
dht_lookup_everywhere_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
dht_conf_t *conf = NULL;
dht_local_t *local = NULL;
@@ -521,7 +525,8 @@ dht_lookup_everywhere (call_frame_t *frame, xlator_t *this, loc_t *loc)
int
dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie,
xlator_t *this, int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf, dict_t *xattr)
+ inode_t *inode, struct stat *stbuf, dict_t *xattr,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
dht_local_t *local = NULL;
@@ -622,7 +627,8 @@ dht_lookup_directory (call_frame_t *frame, xlator_t *this, loc_t *loc)
int
dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf, dict_t *xattr)
+ inode_t *inode, struct stat *stbuf, dict_t *xattr,
+ struct stat *postparent)
{
dht_layout_t *layout = NULL;
char is_linkfile = 0;
@@ -853,6 +859,48 @@ err:
int
+dht_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int op_ret, int op_errno, struct stat *prebuf,
+ struct stat *postbuf)
+{
+ dht_local_t *local = NULL;
+ int this_call_cnt = 0;
+ call_frame_t *prev = NULL;
+
+
+ local = frame->local;
+ prev = cookie;
+
+ LOCK (&frame->lock);
+ {
+ if (op_ret == -1) {
+ local->op_errno = op_errno;
+ gf_log (this->name, GF_LOG_DEBUG,
+ "subvolume %s returned -1 (%s)",
+ prev->this->name, strerror (op_errno));
+ goto unlock;
+ }
+
+ dht_stat_merge (this, &local->stbuf, prebuf, prev->this);
+
+ if (local->inode)
+ local->stbuf.st_ino = local->inode->ino;
+ local->op_ret = 0;
+ }
+unlock:
+ UNLOCK (&frame->lock);
+
+ this_call_cnt = dht_frame_return (frame);
+ if (is_last_call (this_call_cnt))
+ DHT_STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ &local->stbuf);
+
+ return 0;
+}
+
+
+
+int
dht_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno, struct stat *stbuf)
{
@@ -1031,7 +1079,7 @@ dht_truncate (call_frame_t *frame, xlator_t *this,
local->inode = inode_ref (loc->inode);
local->call_cnt = 1;
- STACK_WIND (frame, dht_attr_cbk,
+ STACK_WIND (frame, dht_truncate_cbk,
subvol, subvol->fops->truncate,
loc, offset);
@@ -1077,7 +1125,7 @@ dht_ftruncate (call_frame_t *frame, xlator_t *this,
local->inode = inode_ref (fd->inode);
local->call_cnt = 1;
- STACK_WIND (frame, dht_attr_cbk,
+ STACK_WIND (frame, dht_truncate_cbk,
subvol, subvol->fops->ftruncate,
fd, offset);
@@ -1092,6 +1140,78 @@ err:
int
+dht_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int op_ret, int op_errno, struct stat *preparent,
+ struct stat *postparent)
+{
+ dht_local_t *local = NULL;
+ int this_call_cnt = 0;
+ call_frame_t *prev = NULL;
+
+
+ local = frame->local;
+ prev = cookie;
+
+ LOCK (&frame->lock);
+ {
+ if (op_ret == -1) {
+ local->op_errno = op_errno;
+ gf_log (this->name, GF_LOG_DEBUG,
+ "subvolume %s returned -1 (%s)",
+ prev->this->name, strerror (op_errno));
+ goto unlock;
+ }
+
+ local->op_ret = 0;
+ }
+unlock:
+ UNLOCK (&frame->lock);
+
+ this_call_cnt = dht_frame_return (frame);
+ if (is_last_call (this_call_cnt))
+ DHT_STACK_UNWIND (frame, local->op_ret, local->op_errno);
+
+ return 0;
+}
+
+
+int
+dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
+ int op_errno, struct stat *prebuf, struct stat *postbuf)
+{
+ dht_local_t *local = NULL;
+ int this_call_cnt = 0;
+ call_frame_t *prev = NULL;
+
+
+ local = frame->local;
+ prev = cookie;
+
+ LOCK (&frame->lock);
+ {
+ if (op_ret == -1) {
+ local->op_errno = op_errno;
+ gf_log (this->name, GF_LOG_DEBUG,
+ "subvolume %s returned -1 (%s)",
+ prev->this->name, strerror (op_errno));
+ goto unlock;
+ }
+
+ local->op_ret = 0;
+ }
+unlock:
+ UNLOCK (&frame->lock);
+
+ this_call_cnt = dht_frame_return (frame);
+ if (is_last_call (this_call_cnt))
+ DHT_STACK_UNWIND (frame, local->op_ret, local->op_errno);
+
+ return 0;
+}
+
+
+
+int
dht_err_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno)
{
@@ -1175,9 +1295,9 @@ err:
int
dht_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int op_ret, int op_errno, const char *path)
+ int op_ret, int op_errno, const char *path, struct stat *sbuf)
{
- DHT_STACK_UNWIND (frame, op_ret, op_errno, path);
+ DHT_STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);
return 0;
}
@@ -1397,7 +1517,7 @@ unlock:
int
dht_open (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int flags, fd_t *fd)
+ loc_t *loc, int flags, fd_t *fd, int wbflags)
{
xlator_t *subvol = NULL;
int ret = -1;
@@ -1438,7 +1558,7 @@ dht_open (call_frame_t *frame, xlator_t *this,
STACK_WIND (frame, dht_fd_cbk,
subvol, subvol->fops->open,
- loc, flags, fd);
+ loc, flags, fd, wbflags);
return 0;
@@ -1499,9 +1619,10 @@ err:
int
dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int op_ret, int op_errno, struct stat *stbuf)
+ int op_ret, int op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
- DHT_STACK_UNWIND (frame, op_ret, op_errno, stbuf);
+ DHT_STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -1616,7 +1737,7 @@ dht_fsync (call_frame_t *frame, xlator_t *this,
}
local->call_cnt = 1;
- STACK_WIND (frame, dht_err_cbk,
+ STACK_WIND (frame, dht_fsync_cbk,
subvol, subvol->fops->fsync,
fd, datasync);
@@ -2010,7 +2131,8 @@ err:
int
dht_newfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf, struct stat *preparent,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
dht_layout_t *layout = NULL;
@@ -2052,7 +2174,8 @@ int
dht_mknod_linkfile_create_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
xlator_t *cached_subvol = NULL;
@@ -2235,11 +2358,11 @@ dht_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
if (hashed_subvol != cached_subvol)
local->call_cnt++;
- STACK_WIND (frame, dht_err_cbk,
+ STACK_WIND (frame, dht_unlink_cbk,
cached_subvol, cached_subvol->fops->unlink, loc);
if (hashed_subvol != cached_subvol)
- STACK_WIND (frame, dht_err_cbk,
+ STACK_WIND (frame, dht_unlink_cbk,
hashed_subvol, hashed_subvol->fops->unlink, loc);
return 0;
@@ -2255,7 +2378,8 @@ err:
int
dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf, struct stat *preparent,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
dht_layout_t *layout = NULL;
@@ -2289,7 +2413,8 @@ out:
int
dht_link_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
xlator_t *srcvol = NULL;
@@ -2393,7 +2518,8 @@ err:
int
dht_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno,
- fd_t *fd, inode_t *inode, struct stat *stbuf)
+ fd_t *fd, inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
call_frame_t *prev = NULL;
dht_layout_t *layout = NULL;
@@ -2435,7 +2561,8 @@ int
dht_create_linkfile_create_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *stbuf)
+ inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
xlator_t *cached_subvol = NULL;
@@ -2570,7 +2697,8 @@ dht_mkdir_selfheal_cbk (call_frame_t *frame, void *cookie,
int
dht_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int op_ret, int op_errno, inode_t *inode, struct stat *stbuf)
+ int op_ret, int op_errno, inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
int this_call_cnt = 0;
@@ -2618,8 +2746,9 @@ unlock:
int
dht_mkdir_hashed_cbk (call_frame_t *frame, void *cookie,
- xlator_t *this, int op_ret, int op_errno,
- inode_t *inode, struct stat *stbuf)
+ xlator_t *this, int op_ret, int op_errno,
+ inode_t *inode, struct stat *stbuf,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
int ret = -1;
@@ -2764,7 +2893,8 @@ dht_rmdir_selfheal_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int
dht_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int op_ret, int op_errno)
+ int op_ret, int op_errno, struct stat *preparent,
+ struct stat *postparent)
{
uint64_t tmp_layout = 0;
dht_local_t *local = NULL;