summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/afr/src/afr-dir-write.c33
-rw-r--r--xlators/cluster/afr/src/afr-inode-read.c2
-rw-r--r--xlators/cluster/afr/src/afr-inode-write.c21
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-algorithm.c6
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-common.c9
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-data.c10
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-entry.c24
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-metadata.c3
-rw-r--r--xlators/cluster/afr/src/afr.c19
-rw-r--r--xlators/cluster/dht/src/dht-common.c184
-rw-r--r--xlators/cluster/dht/src/dht-linkfile.c14
-rw-r--r--xlators/cluster/dht/src/dht-rename.c14
-rw-r--r--xlators/cluster/dht/src/dht-selfheal.c3
-rw-r--r--xlators/cluster/dht/src/nufa.c12
-rw-r--r--xlators/cluster/ha/src/ha.c80
-rw-r--r--xlators/cluster/map/src/map.c72
-rw-r--r--xlators/cluster/stripe/src/stripe.c310
-rw-r--r--xlators/cluster/unify/src/unify.c197
18 files changed, 809 insertions, 204 deletions
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c
index 51629234f88..5cd05b13864 100644
--- a/xlators/cluster/afr/src/afr-dir-write.c
+++ b/xlators/cluster/afr/src/afr-dir-write.c
@@ -115,7 +115,8 @@ afr_create_unwind (call_frame_t *frame, xlator_t *this)
int
afr_create_wind_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)
+ fd_t *fd, inode_t *inode, struct stat *buf,
+ struct stat *preparent, struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -366,9 +367,10 @@ afr_mknod_unwind (call_frame_t *frame, xlator_t *this)
int
-afr_mknod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf)
+afr_mknod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -601,9 +603,10 @@ afr_mkdir_unwind (call_frame_t *frame, xlator_t *this)
int
-afr_mkdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf)
+afr_mkdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -840,7 +843,8 @@ afr_link_unwind (call_frame_t *frame, xlator_t *this)
int
afr_link_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, inode_t *inode,
- struct stat *buf)
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -1065,7 +1069,8 @@ afr_symlink_unwind (call_frame_t *frame, xlator_t *this)
int
afr_symlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, inode_t *inode,
- struct stat *buf)
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -1297,7 +1302,9 @@ afr_rename_unwind (call_frame_t *frame, xlator_t *this)
int
afr_rename_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *buf,
+ struct stat *preoldparent, struct stat *postoldparent,
+ struct stat *prenewparent, struct stat *postnewparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -1496,7 +1503,8 @@ afr_unlink_unwind (call_frame_t *frame, xlator_t *this)
int
afr_unlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -1683,7 +1691,8 @@ afr_rmdir_unwind (call_frame_t *frame, xlator_t *this)
int
afr_rmdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c
index 2032065119a..8c0431f5a51 100644
--- a/xlators/cluster/afr/src/afr-inode-read.c
+++ b/xlators/cluster/afr/src/afr-inode-read.c
@@ -428,7 +428,7 @@ out:
int32_t
afr_readlink_cbk (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret, int32_t op_errno,
- const char *buf)
+ const char *buf, struct stat *sbuf)
{
afr_private_t * priv = NULL;
afr_local_t * local = NULL;
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c
index 591f7cd49aa..601913a0fca 100644
--- a/xlators/cluster/afr/src/afr-inode-write.c
+++ b/xlators/cluster/afr/src/afr-inode-write.c
@@ -88,7 +88,8 @@ afr_writev_unwind (call_frame_t *frame, xlator_t *this)
int
afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -115,11 +116,11 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret != -1) {
if (local->success_count == 0) {
local->op_ret = op_ret;
- local->cont.writev.buf = *buf;
+ local->cont.writev.buf = *postbuf;
}
if (child_index == read_child) {
- local->cont.writev.read_child_buf = *buf;
+ local->cont.writev.read_child_buf = *postbuf;
}
local->success_count++;
@@ -323,7 +324,8 @@ afr_truncate_unwind (call_frame_t *frame, xlator_t *this)
int
afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -350,11 +352,11 @@ afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret != -1) {
if (local->success_count == 0) {
local->op_ret = op_ret;
- local->cont.truncate.buf = *buf;
+ local->cont.truncate.buf = *postbuf;
}
if (child_index == read_child) {
- local->cont.truncate.read_child_buf = *buf;
+ local->cont.truncate.read_child_buf = *postbuf;
}
local->success_count++;
@@ -543,7 +545,8 @@ afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this)
int
afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -570,11 +573,11 @@ afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (op_ret != -1) {
if (local->success_count == 0) {
local->op_ret = op_ret;
- local->cont.ftruncate.buf = *buf;
+ local->cont.ftruncate.buf = *postbuf;
}
if (child_index == read_child) {
- local->cont.ftruncate.read_child_buf = *buf;
+ local->cont.ftruncate.read_child_buf = *postbuf;
}
local->success_count++;
diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.c b/xlators/cluster/afr/src/afr-self-heal-algorithm.c
index 46d451913b0..5197f6be43f 100644
--- a/xlators/cluster/afr/src/afr-self-heal-algorithm.c
+++ b/xlators/cluster/afr/src/afr-self-heal-algorithm.c
@@ -55,7 +55,8 @@ sh_full_read_write_iter (call_frame_t *frame, xlator_t *this);
static int
sh_full_write_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_private_t * priv = NULL;
afr_local_t * local = NULL;
@@ -281,7 +282,8 @@ sh_diff_iter (call_frame_t *frame, xlator_t *this);
static int
sh_diff_write_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *buf,
+ struct stat *postbuf)
{
afr_private_t * priv = NULL;
afr_local_t * local = NULL;
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c
index 4a260ed903e..ef25204a11a 100644
--- a/xlators/cluster/afr/src/afr-self-heal-common.c
+++ b/xlators/cluster/afr/src/afr-self-heal-common.c
@@ -831,7 +831,9 @@ static int
sh_missing_entries_newentry_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf)
+ inode_t *inode, struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
afr_local_t *local = NULL;
afr_self_heal_t *sh = NULL;
@@ -1044,7 +1046,7 @@ static int
sh_missing_entries_readlink_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- const char *link)
+ const char *link, struct stat *sbuf)
{
if (op_ret > 0)
sh_missing_entries_symlink (frame, this, link);
@@ -1164,7 +1166,8 @@ static int
sh_missing_entries_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
int child_index = 0;
afr_local_t *local = NULL;
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c
index 576a15e06f2..5300f0a7528 100644
--- a/xlators/cluster/afr/src/afr-self-heal-data.c
+++ b/xlators/cluster/afr/src/afr-self-heal-data.c
@@ -395,7 +395,8 @@ afr_sh_data_erase_pending (call_frame_t *frame, xlator_t *this)
int
afr_sh_data_trim_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_private_t * priv = NULL;
afr_local_t * local = NULL;
@@ -600,7 +601,7 @@ afr_sh_data_open (call_frame_t *frame, xlator_t *this)
(void *) (long) source,
priv->children[source],
priv->children[source]->fops->open,
- &local->loc, O_RDWR|O_LARGEFILE, fd);
+ &local->loc, O_RDWR|O_LARGEFILE, fd, 0);
call_count--;
/* open sinks */
@@ -613,7 +614,7 @@ afr_sh_data_open (call_frame_t *frame, xlator_t *this)
priv->children[i],
priv->children[i]->fops->open,
&local->loc,
- O_RDWR|O_LARGEFILE, fd);
+ O_RDWR|O_LARGEFILE, fd, 0);
if (!--call_count)
break;
@@ -758,7 +759,8 @@ afr_sh_data_fix (call_frame_t *frame, xlator_t *this)
int
afr_sh_data_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *local = NULL;
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c
index b3bb6720917..fa938415864 100644
--- a/xlators/cluster/afr/src/afr-self-heal-entry.c
+++ b/xlators/cluster/afr/src/afr-self-heal-entry.c
@@ -426,7 +426,9 @@ afr_sh_entry_expunge_entry_done (call_frame_t *frame, xlator_t *this,
int
afr_sh_entry_expunge_remove_cbk (call_frame_t *expunge_frame, void *cookie,
xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *expunge_local = NULL;
@@ -564,7 +566,8 @@ int
afr_sh_entry_expunge_lookup_cbk (call_frame_t *expunge_frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf, dict_t *x)
+ inode_t *inode, struct stat *buf, dict_t *x,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *expunge_local = NULL;
@@ -626,7 +629,8 @@ int
afr_sh_entry_expunge_entry_cbk (call_frame_t *expunge_frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf, dict_t *x)
+ inode_t *inode, struct stat *buf, dict_t *x,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *expunge_local = NULL;
@@ -1021,7 +1025,9 @@ int
afr_sh_entry_impunge_newfile_cbk (call_frame_t *impunge_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)
{
int call_count = 0;
afr_private_t *priv = NULL;
@@ -1188,7 +1194,7 @@ int
afr_sh_entry_impunge_readlink_cbk (call_frame_t *impunge_frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- const char *linkname)
+ const char *linkname, struct stat *sbuf)
{
afr_private_t *priv = NULL;
afr_local_t *impunge_local = NULL;
@@ -1264,7 +1270,7 @@ afr_sh_entry_impunge_recreate_lookup_cbk (call_frame_t *impunge_frame,
void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
inode_t *inode, struct stat *buf,
- dict_t *xattr)
+ dict_t *xattr,struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *impunge_local = NULL;
@@ -1372,7 +1378,8 @@ int
afr_sh_entry_impunge_entry_cbk (call_frame_t *impunge_frame, void *cookie,
xlator_t *this,
int32_t op_ret, int32_t op_errno,
- inode_t *inode, struct stat *buf, dict_t *x)
+ inode_t *inode, struct stat *buf, dict_t *x,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *impunge_local = NULL;
@@ -1861,7 +1868,8 @@ afr_sh_entry_fix (call_frame_t *frame, xlator_t *this)
int
afr_sh_entry_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
afr_private_t *priv = NULL;
afr_local_t *local = NULL;
diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c
index 686446b5f30..9a02ab6ddb3 100644
--- a/xlators/cluster/afr/src/afr-self-heal-metadata.c
+++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c
@@ -591,7 +591,8 @@ afr_sh_metadata_fix (call_frame_t *frame, xlator_t *this)
int
afr_sh_metadata_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
afr_local_t *local = NULL;
afr_self_heal_t *sh = NULL;
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index ef93e5078a2..b65a4dc466d 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -448,7 +448,8 @@ afr_self_heal_cbk (call_frame_t *frame, xlator_t *this)
int
afr_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 *xattr)
+ inode_t *inode, struct stat *buf, dict_t *xattr,
+ struct stat *postparent)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;
@@ -789,7 +790,8 @@ out:
int
afr_open_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *buf)
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_local_t * local = frame->local;
int ret = 0;
@@ -864,8 +866,8 @@ afr_open_cbk (call_frame_t *frame, void *cookie,
int
-afr_open (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int32_t flags, fd_t *fd)
+afr_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
+ fd_t *fd, int32_t wbflags)
{
afr_private_t * priv = NULL;
afr_local_t * local = NULL;
@@ -910,7 +912,7 @@ afr_open (call_frame_t *frame, xlator_t *this,
STACK_WIND_COOKIE (frame, afr_open_cbk, (void *) (long) i,
priv->children[i],
priv->children[i]->fops->open,
- loc, wind_flags, fd);
+ loc, wind_flags, fd, wbflags);
if (!--call_count)
break;
@@ -1152,8 +1154,9 @@ out:
/* {{{ fsync */
int
-afr_fsync_cbk (call_frame_t *frame, void *cookie,
- xlator_t *this, int32_t op_ret, int32_t op_errno)
+afr_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
afr_local_t *local = NULL;
@@ -1294,7 +1297,7 @@ afr_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd,
for (i = 0; i < priv->child_count; i++) {
if (local->child_up[i]) {
- STACK_WIND (frame, afr_fsync_cbk,
+ STACK_WIND (frame, afr_fsyncdir_cbk,
priv->children[i],
priv->children[i]->fops->fsyncdir,
fd, datasync);
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;
diff --git a/xlators/cluster/dht/src/dht-linkfile.c b/xlators/cluster/dht/src/dht-linkfile.c
index 213d3f2bf72..d28f7beca09 100644
--- a/xlators/cluster/dht/src/dht-linkfile.c
+++ b/xlators/cluster/dht/src/dht-linkfile.c
@@ -40,7 +40,7 @@ dht_linkfile_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local = frame->local;
local->linkfile.linkfile_cbk (frame, cookie, this, op_ret, op_errno,
local->linkfile.inode,
- &local->linkfile.stbuf);
+ &local->linkfile.stbuf, NULL, NULL);
return 0;
}
@@ -48,8 +48,9 @@ dht_linkfile_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int
dht_linkfile_create_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;
call_frame_t *prev = NULL;
@@ -104,8 +105,8 @@ err:
str_data = NULL;
}
- local->linkfile.linkfile_cbk (frame, cookie, this,
- op_ret, op_errno, inode, stbuf);
+ local->linkfile.linkfile_cbk (frame, cookie, this, op_ret, op_errno,
+ inode, stbuf, preparent, postparent);
return 0;
}
@@ -132,7 +133,8 @@ dht_linkfile_create (call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,
int
dht_linkfile_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno,
+ struct stat *preparent, struct stat *postparent)
{
dht_local_t *local = NULL;
call_frame_t *prev = NULL;
diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c
index 6c34dabad1e..f91d1983d69 100644
--- a/xlators/cluster/dht/src/dht-rename.c
+++ b/xlators/cluster/dht/src/dht-rename.c
@@ -33,7 +33,9 @@
int
dht_rename_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *stbuf)
+ int32_t op_ret, int32_t op_errno, struct stat *stbuf,
+ struct stat *preoldparent, struct stat *postoldparent,
+ struct stat *prenewparent, struct stat *postnewparent)
{
dht_local_t *local = NULL;
int this_call_cnt = 0;
@@ -213,7 +215,8 @@ err:
int
dht_rename_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
{
dht_local_t *local = NULL;
call_frame_t *prev = NULL;
@@ -240,7 +243,9 @@ dht_rename_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int
dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct stat *stbuf)
+ int32_t op_ret, int32_t op_errno, struct stat *stbuf,
+ struct stat *preoldparent, struct stat *postoldparent,
+ struct stat *prenewparent, struct stat *postnewparent)
{
dht_local_t *local = NULL;
call_frame_t *prev = NULL;
@@ -369,7 +374,8 @@ dht_do_rename (call_frame_t *frame)
int
dht_rename_links_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;
call_frame_t *prev = NULL;
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
index df8b2047b2b..d3b36363ee3 100644
--- a/xlators/cluster/dht/src/dht-selfheal.c
+++ b/xlators/cluster/dht/src/dht-selfheal.c
@@ -196,7 +196,8 @@ dht_selfheal_dir_xattr (call_frame_t *frame, loc_t *loc, dht_layout_t *layout)
int
dht_selfheal_dir_mkdir_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;
dht_layout_t *layout = NULL;
diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c
index 6be7206bfb5..17516a122c3 100644
--- a/xlators/cluster/dht/src/nufa.c
+++ b/xlators/cluster/dht/src/nufa.c
@@ -30,7 +30,8 @@
int
nufa_local_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;
xlator_t *subvol = NULL;
@@ -268,7 +269,9 @@ err:
int
nufa_create_linkfile_create_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;
call_frame_t *prev = NULL;
@@ -374,8 +377,9 @@ err:
int
nufa_mknod_linkfile_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;
call_frame_t *prev = NULL;
diff --git a/xlators/cluster/ha/src/ha.c b/xlators/cluster/ha/src/ha.c
index b380cb1e9a7..b2ca48b1089 100644
--- a/xlators/cluster/ha/src/ha.c
+++ b/xlators/cluster/ha/src/ha.c
@@ -64,7 +64,8 @@ ha_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -307,7 +308,8 @@ ha_truncate_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
int ret = -1;
@@ -316,7 +318,8 @@ ha_truncate_cbk (call_frame_t *frame,
STACK_UNWIND (frame,
op_ret,
op_errno,
- buf);
+ prebuf,
+ postbuf);
}
return 0;
}
@@ -357,7 +360,8 @@ ha_ftruncate_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
int ret = -1;
@@ -367,7 +371,7 @@ ha_ftruncate_cbk (call_frame_t *frame,
STACK_UNWIND (frame,
op_ret,
op_errno,
- buf);
+ prebuf, postbuf);
}
return 0;
}
@@ -458,7 +462,8 @@ ha_readlink_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- const char *path)
+ const char *path,
+ struct stat *sbuf)
{
int ret = -1;
@@ -468,7 +473,8 @@ ha_readlink_cbk (call_frame_t *frame,
STACK_UNWIND (frame,
op_ret,
op_errno,
- path);
+ path,
+ sbuf);
}
return 0;
}
@@ -511,7 +517,8 @@ ha_mknod_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -573,7 +580,9 @@ ha_mknod_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -708,7 +717,8 @@ ha_mkdir_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -762,7 +772,9 @@ ha_mkdir_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -886,7 +898,9 @@ ha_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int ret = -1;
@@ -931,7 +945,9 @@ ha_rmdir_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int ret = -1;
@@ -982,7 +998,8 @@ ha_symlink_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1036,7 +1053,9 @@ ha_symlink_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1163,7 +1182,11 @@ ha_rename_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preoldparent,
+ struct stat *postoldparent,
+ struct stat *prenewparent,
+ struct stat *postnewparent)
{
int ret = -1;
@@ -1211,7 +1234,8 @@ ha_link_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1265,7 +1289,9 @@ ha_link_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1405,7 +1431,9 @@ ha_create_cbk (call_frame_t *frame,
int32_t op_errno,
fd_t *fd,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1602,7 +1630,7 @@ int32_t
ha_open (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
- int32_t flags, fd_t *fd)
+ int32_t flags, fd_t *fd, int wbflags)
{
ha_local_t *local = NULL;
ha_private_t *pvt = NULL;
@@ -1646,7 +1674,7 @@ ha_open (call_frame_t *frame,
ha_open_cbk,
children[i],
children[i]->fops->open,
- loc, flags, fd);
+ loc, flags, fd, wbflags);
if (--cnt == 0)
break;
}
@@ -1719,7 +1747,8 @@ ha_writev_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *stbuf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
int ret = 0;
ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);
@@ -1728,7 +1757,8 @@ ha_writev_cbk (call_frame_t *frame,
STACK_UNWIND (frame,
op_ret,
op_errno,
- stbuf);
+ prebuf,
+ postbuf);
}
return 0;
}
@@ -1820,7 +1850,9 @@ ha_fsync_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *prebuf,
+ struct stat *postbuf)
{
int ret = 0;
ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);
diff --git a/xlators/cluster/map/src/map.c b/xlators/cluster/map/src/map.c
index 3eb49e2eddc..91cf8eb24a1 100644
--- a/xlators/cluster/map/src/map.c
+++ b/xlators/cluster/map/src/map.c
@@ -92,14 +92,15 @@ map_truncate_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
call_frame_t *prev = NULL;
prev = cookie;
- map_itransform (this, prev->this, buf->st_ino, &buf->st_ino);
+ map_itransform (this, prev->this, postbuf->st_ino, &postbuf->st_ino);
- STACK_UNWIND (frame, op_ret, op_errno, buf);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -109,14 +110,15 @@ map_ftruncate_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
call_frame_t *prev = NULL;
prev = cookie;
- map_itransform (this, prev->this, buf->st_ino, &buf->st_ino);
+ map_itransform (this, prev->this, postbuf->st_ino, &postbuf->st_ino);
- STACK_UNWIND (frame, op_ret, op_errno, buf);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -138,9 +140,10 @@ map_readlink_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- const char *path)
+ const char *path,
+ struct stat *sbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno, path);
+ STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);
return 0;
}
@@ -149,9 +152,11 @@ map_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
- STACK_UNWIND (frame, op_ret, op_errno);
+ STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);
return 0;
}
@@ -160,9 +165,11 @@ map_rmdir_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
- STACK_UNWIND (frame, op_ret, op_errno);
+ STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);
return 0;
}
@@ -173,7 +180,11 @@ map_rename_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preoldparent,
+ struct stat *postoldparent,
+ struct stat *prenewparent,
+ struct stat *postnewparent)
{
call_frame_t *prev = NULL;
prev = cookie;
@@ -191,7 +202,9 @@ map_link_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
prev = cookie;
@@ -240,14 +253,15 @@ map_writev_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *stbuf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
call_frame_t *prev = NULL;
prev = cookie;
- map_itransform (this, prev->this, stbuf->st_ino, &stbuf->st_ino);
+ map_itransform (this, prev->this, postbuf->st_ino, &postbuf->st_ino);
- STACK_UNWIND (frame, op_ret, op_errno, stbuf);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -268,9 +282,11 @@ map_fsync_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *prebuf,
+ struct stat *postbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -476,7 +492,9 @@ map_newentry_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
prev = cookie;
@@ -497,7 +515,9 @@ map_create_cbk (call_frame_t *frame,
int32_t op_errno,
fd_t *fd,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
prev = cookie;
@@ -605,7 +625,8 @@ map_single_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
call_frame_t *prev = NULL;
prev = cookie;
@@ -625,7 +646,8 @@ map_root_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
int callcnt = 0;
map_local_t *local = NULL;
@@ -1210,7 +1232,7 @@ int32_t
map_open (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
- int32_t flags, fd_t *fd)
+ int32_t flags, fd_t *fd, int wbflags)
{
int32_t op_errno = 1;
xlator_t *subvol = NULL;
@@ -1228,7 +1250,7 @@ map_open (call_frame_t *frame,
}
STACK_WIND (frame, map_open_cbk, subvol,
- subvol->fops->open, loc, flags, fd);
+ subvol->fops->open, loc, flags, fd, wbflags);
return 0;
err:
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c
index 5a02d17bc2e..2d875ab3e2f 100644
--- a/xlators/cluster/stripe/src/stripe.c
+++ b/xlators/cluster/stripe/src/stripe.c
@@ -70,6 +70,19 @@ stripe_get_matching_bs (const char *path, struct stripe_options *opts,
/*
+ * stripe_common_remove_cbk -
+ */
+int32_t
+stripe_common_remove_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno,
+ struct stat *preparent, struct stat *postparent)
+{
+ STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);
+ return 0;
+}
+
+
+/*
* stripe_common_cbk -
*/
int32_t
@@ -127,6 +140,169 @@ stripe_stack_unwind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
return 0;
}
+
+int32_t
+stripe_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
+{
+ 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;
+}
+
+
+
+/**
+ * stripe_stack_unwind_remove_cbk - This function is used for unlink
+ * _cbk without any extra arguments (other than the minimum given)
+ * This is called from functions like fsync,unlink,rmdir etc.
+ *
+ */
+int32_t
+stripe_stack_unwind_unlink_cbk (call_frame_t *frame, void *cookie,
+ xlator_t *this, int32_t op_ret,
+ int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
+{
+ 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_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
+{
+ 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 = *postbuf;
+ /* 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 = postbuf->st_ino;
+ local->stbuf.st_mtime = postbuf->st_mtime;
+ }
+
+ local->stbuf.st_blocks += postbuf->st_blocks;
+ if (local->stbuf.st_size < postbuf->st_size)
+ local->stbuf.st_size = postbuf->st_size;
+ if (local->stbuf.st_blksize != postbuf->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;
+}
+
+
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)
@@ -135,6 +311,76 @@ stripe_common_buf_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
return 0;
}
+
+int32_t
+stripe_stack_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, struct stat *buf,
+ struct stat *preoldparent, struct stat *postoldparent,
+ struct stat *prenewparent, struct stat *postnewparent)
+{
+ 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;
+}
+
+
/**
* stripe_stack_unwind_buf_cbk - This function is used for all the _cbk with
* 'struct stat *buf' as extra argument (other than minimum)
@@ -214,9 +460,11 @@ stripe_stack_unwind_buf_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
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)
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
- STACK_UNWIND (frame, op_ret, op_errno, inode, buf);
+ STACK_UNWIND (frame, op_ret, op_errno, inode, buf, preparent,
+ postparent);
return 0;
}
@@ -232,7 +480,8 @@ 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)
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
stripe_local_t *local = NULL;
@@ -293,7 +542,7 @@ stripe_stack_unwind_inode_cbk (call_frame_t *frame, void *cookie,
int32_t
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)
+ struct stat *buf, dict_t *dict, struct stat *postparent)
{
int32_t callcnt = 0;
dict_t *tmp_dict = NULL;
@@ -611,7 +860,7 @@ stripe_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
send_fop_to_all = 1;
if (!send_fop_to_all) {
- STACK_WIND (frame, stripe_common_buf_cbk, trav->xlator,
+ STACK_WIND (frame, stripe_truncate_cbk, trav->xlator,
trav->xlator->fops->truncate, loc, offset);
} else {
/* Initialization */
@@ -626,7 +875,7 @@ stripe_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
local->call_count = priv->child_count;
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ STACK_WIND (frame, stripe_truncate_cbk,
trav->xlator, trav->xlator->fops->truncate,
loc, offset);
trav = trav->next;
@@ -822,7 +1071,9 @@ stripe_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
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)
+ int32_t op_ret, int32_t op_errno, struct stat *buf,
+ struct stat *preoldparent, struct stat *postoldparent,
+ struct stat *prenewparent, struct stat *postnewparent)
{
stripe_local_t *local = NULL;
xlator_list_t *trav = NULL;
@@ -840,7 +1091,7 @@ stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
trav = trav->next; /* Skip first child */
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_buf_cbk,
+ STACK_WIND (frame, stripe_stack_rename_cbk,
trav->xlator, trav->xlator->fops->rename,
&local->loc, &local->loc2);
trav = trav->next;
@@ -933,9 +1184,10 @@ stripe_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask)
*/
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)
+ int32_t op_ret, int32_t op_errno, const char *path,
+ struct stat *sbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno, path);
+ STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);
return 0;
}
@@ -994,7 +1246,7 @@ stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
send_fop_to_all = 1;
if (!send_fop_to_all) {
- STACK_WIND (frame, stripe_common_cbk, trav->xlator,
+ STACK_WIND (frame, stripe_common_remove_cbk, trav->xlator,
trav->xlator->fops->unlink, loc);
} else {
/* Don't unlink a file if a node is down */
@@ -1014,7 +1266,7 @@ stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
local->call_count = priv->child_count;
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_cbk,
+ STACK_WIND (frame, stripe_stack_unwind_unlink_cbk,
trav->xlator, trav->xlator->fops->unlink,
loc);
trav = trav->next;
@@ -1030,7 +1282,9 @@ stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
int32_t
stripe_first_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno)
+ int32_t op_ret, int32_t op_errno,struct stat *preparent,
+ struct stat *postparent)
+
{
xlator_list_t *trav = NULL;
stripe_local_t *local = NULL;
@@ -1047,7 +1301,7 @@ stripe_first_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
trav = trav->next; /* Skip first child */
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ STACK_WIND (frame, stripe_stack_unwind_unlink_cbk, trav->xlator,
trav->xlator->fops->rmdir, &local->loc);
trav = trav->next;
}
@@ -1139,7 +1393,8 @@ stripe_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
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)
+ int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
stripe_local_t *local = NULL;
@@ -1216,7 +1471,8 @@ stripe_mknod_ifreg_setxattr_cbk (call_frame_t *frame, void *cookie,
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)
+ struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
int ret = 0;
int32_t callcnt = 0;
@@ -1544,7 +1800,8 @@ stripe_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)
int32_t
stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie,
xlator_t *this, int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno, struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
fd_t *lfd = NULL;
@@ -1632,7 +1889,8 @@ stripe_create_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
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)
+ inode_t *inode, struct stat *buf, struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
stripe_local_t *local = NULL;
@@ -2015,7 +2273,7 @@ stripe_open_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
while (trav) {
STACK_WIND (frame, stripe_open_cbk, trav->xlator,
trav->xlator->fops->open, &local->loc,
- local->flags, local->fd);
+ local->flags, local->fd, 0);
trav = trav->next;
}
}
@@ -2035,7 +2293,7 @@ stripe_open_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
*/
int32_t
stripe_open (call_frame_t *frame, xlator_t *this, loc_t *loc,
- int32_t flags, fd_t *fd)
+ int32_t flags, fd_t *fd, int32_t wbflags)
{
stripe_local_t *local = NULL;
stripe_private_t *priv = NULL;
@@ -2100,7 +2358,8 @@ stripe_open (call_frame_t *frame, xlator_t *this, loc_t *loc,
while (trav) {
STACK_WIND (frame, stripe_open_cbk, trav->xlator,
trav->xlator->fops->open,
- &local->loc, local->flags, local->fd);
+ &local->loc, local->flags, local->fd,
+ wbflags);
trav = trav->next;
}
}
@@ -2464,7 +2723,7 @@ stripe_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)
local->call_count = priv->child_count;
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_cbk, trav->xlator,
+ STACK_WIND (frame, stripe_fsync_cbk, trav->xlator,
trav->xlator->fops->fsync, fd, flags);
trav = trav->next;
}
@@ -2552,7 +2811,7 @@ stripe_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
local->call_count = priv->child_count;
while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_buf_cbk, trav->xlator,
+ STACK_WIND (frame, stripe_truncate_cbk, trav->xlator,
trav->xlator->fops->ftruncate, fd, offset);
trav = trav->next;
}
@@ -2823,7 +3082,8 @@ stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd,
*/
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 op_ret, int32_t op_errno, struct stat *prebuf,
+ struct stat *postbuf)
{
int32_t callcnt = 0;
stripe_local_t *local = NULL;
@@ -2844,7 +3104,7 @@ stripe_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
if (op_ret >= 0) {
local->op_ret += op_ret;
- local->stbuf = *stbuf;
+ local->stbuf = *postbuf;
}
}
UNLOCK (&frame->lock);
diff --git a/xlators/cluster/unify/src/unify.c b/xlators/cluster/unify/src/unify.c
index b641fb3307e..80ba10278c1 100644
--- a/xlators/cluster/unify/src/unify.c
+++ b/xlators/cluster/unify/src/unify.c
@@ -328,7 +328,8 @@ unify_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
int32_t callcnt = 0;
unify_private_t *priv = this->private;
@@ -788,7 +789,9 @@ unify_mkdir_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
unify_private_t *priv = this->private;
@@ -849,7 +852,9 @@ unify_ns_mkdir_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_private_t *priv = this->private;
unify_local_t *local = frame->local;
@@ -928,7 +933,9 @@ unify_rmdir_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
unify_private_t *priv = this->private;
@@ -960,7 +967,9 @@ unify_ns_rmdir_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int16_t index = 0;
unify_private_t *priv = this->private;
@@ -1237,7 +1246,8 @@ unify_open (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
int32_t flags,
- fd_t *fd)
+ fd_t *fd,
+ int32_t wbflags)
{
unify_private_t *priv = this->private;
unify_local_t *local = NULL;
@@ -1305,7 +1315,7 @@ unify_open (call_frame_t *frame,
priv->xl_array[file_list[index]]->fops->open,
loc,
flags,
- fd);
+ fd, wbflags);
if (need_break)
break;
}
@@ -1319,7 +1329,9 @@ unify_create_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
inode_t *inode = local->loc1.inode;
@@ -1432,7 +1444,8 @@ unify_create_lookup_cbk (call_frame_t *frame,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
- dict_t *dict)
+ dict_t *dict,
+ struct stat *postparent)
{
int32_t callcnt = 0;
int16_t index = 0;
@@ -1514,7 +1527,7 @@ unify_create_lookup_cbk (call_frame_t *frame,
priv->xl_array[file_list[index]]->fops->open,
&local->loc1,
local->flags,
- local->fd);
+ local->fd, 0);
if (need_break)
break;
}
@@ -1535,7 +1548,9 @@ unify_create_cbk (call_frame_t *frame,
int32_t op_errno,
fd_t *fd,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
int ret = 0;
unify_local_t *local = frame->local;
@@ -1592,7 +1607,9 @@ unify_ns_create_cbk (call_frame_t *frame,
int32_t op_errno,
fd_t *fd,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
struct sched_ops *sched_ops = NULL;
xlator_t *sched_xl = NULL;
@@ -1921,6 +1938,69 @@ unify_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
/**
+ * unify_ftruncate_cbk -
+ */
+int32_t
+unify_ftruncate_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;
+ unify_private_t *priv = this->private;
+ unify_local_t *local = frame->local;
+ call_frame_t *prev_frame = cookie;
+
+ LOCK (&frame->lock);
+ {
+ callcnt = --local->call_count;
+
+ if (op_ret == -1) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "child(%s): path(%s): %s",
+ prev_frame->this->name,
+ (local->loc1.path)?local->loc1.path:"",
+ strerror (op_errno));
+ local->op_errno = op_errno;
+ if (!((op_errno == ENOENT) && priv->optimist))
+ local->op_ret = -1;
+ }
+
+ if (op_ret >= 0) {
+ if (NS (this) == prev_frame->this) {
+ local->st_ino = buf->st_ino;
+ /* If the entry is directory, get the
+ stat from NS node */
+ if (S_ISDIR (buf->st_mode) ||
+ !local->stbuf.st_blksize) {
+ local->stbuf = *buf;
+ }
+ }
+
+ if ((!S_ISDIR (buf->st_mode)) &&
+ (NS (this) != prev_frame->this)) {
+ /* If file, take the stat info from
+ Storage node. */
+ local->stbuf = *buf;
+ }
+ }
+ }
+ UNLOCK (&frame->lock);
+
+ if (!callcnt) {
+ if (local->st_ino)
+ local->stbuf.st_ino = local->st_ino;
+ else
+ local->op_ret = -1;
+ unify_local_wipe (local);
+ STACK_UNWIND (frame, local->op_ret, local->op_errno,
+ &local->stbuf);
+ }
+
+ return 0;
+}
+
+
+
+/**
* unify_truncate_cbk -
*/
int32_t
@@ -1929,7 +2009,8 @@ unify_truncate_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
int32_t callcnt = 0;
unify_private_t *priv = this->private;
@@ -1953,20 +2034,20 @@ unify_truncate_cbk (call_frame_t *frame,
if (op_ret >= 0) {
if (NS (this) == prev_frame->this) {
- local->st_ino = buf->st_ino;
+ local->st_ino = postbuf->st_ino;
/* If the entry is directory, get the
stat from NS node */
- if (S_ISDIR (buf->st_mode) ||
+ if (S_ISDIR (postbuf->st_mode) ||
!local->stbuf.st_blksize) {
- local->stbuf = *buf;
+ local->stbuf = *postbuf;
}
}
- if ((!S_ISDIR (buf->st_mode)) &&
+ if ((!S_ISDIR (postbuf->st_mode)) &&
(NS (this) != prev_frame->this)) {
/* If file, take the stat info from
Storage node. */
- local->stbuf = *buf;
+ local->stbuf = *postbuf;
}
}
}
@@ -2027,7 +2108,7 @@ unify_truncate (call_frame_t *frame,
}
/* Don't send truncate to NS node */
- STACK_WIND (frame, unify_truncate_cbk, NS(this),
+ STACK_WIND (frame, unify_ftruncate_cbk, NS(this),
NS(this)->fops->stat, loc);
callcnt--;
@@ -2057,9 +2138,10 @@ unify_readlink_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- const char *path)
+ const char *path,
+ struct stat *sbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno, path);
+ STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);
return 0;
}
@@ -2117,7 +2199,9 @@ unify_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
unify_private_t *priv = this->private;
@@ -2245,9 +2329,10 @@ unify_writev_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *stbuf)
+ struct stat *prebuf,
+ struct stat *postbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno, stbuf);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -2307,11 +2392,11 @@ unify_ftruncate (call_frame_t *frame,
local->call_count = 2;
- STACK_WIND (frame, unify_truncate_cbk,
+ STACK_WIND (frame, unify_truncate_cbk,
child, child->fops->ftruncate,
fd, offset);
- STACK_WIND (frame, unify_truncate_cbk,
+ STACK_WIND (frame, unify_ftruncate_cbk,
NS(this), NS(this)->fops->fstat,
fd);
@@ -2363,9 +2448,11 @@ unify_fsync_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *prebuf,
+ struct stat *postbuf)
{
- STACK_UNWIND (frame, op_ret, op_errno);
+ STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);
return 0;
}
@@ -3015,7 +3102,9 @@ unify_mknod_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
@@ -3039,7 +3128,9 @@ unify_mknod_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
@@ -3073,7 +3164,9 @@ unify_ns_mknod_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
struct sched_ops *sched_ops = NULL;
xlator_t *sched_xl = NULL;
@@ -3177,7 +3270,9 @@ unify_symlink_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
if (op_ret == -1)
@@ -3199,7 +3294,9 @@ unify_symlink_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
@@ -3238,7 +3335,9 @@ unify_ns_symlink_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
struct sched_ops *sched_ops = NULL;
@@ -3347,7 +3446,9 @@ unify_rename_unlink_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
- int32_t op_errno)
+ int32_t op_errno,
+ struct stat *preparent,
+ struct stat *postparent)
{
int32_t callcnt = 0;
unify_local_t *local = frame->local;
@@ -3382,7 +3483,11 @@ unify_ns_rename_undo_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preoldparent,
+ struct stat *postoldparent,
+ struct stat *prenewparent,
+ struct stat *postnewparent)
{
unify_local_t *local = frame->local;
@@ -3405,7 +3510,11 @@ unify_rename_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preoldparent,
+ struct stat *postoldparent,
+ struct stat *prenewparent,
+ struct stat *postnewparent)
{
int32_t index = 0;
int32_t callcnt = 0;
@@ -3561,7 +3670,11 @@ unify_ns_rename_cbk (call_frame_t *frame,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preoldparent,
+ struct stat *postoldparent,
+ struct stat *prenewparent,
+ struct stat *postnewparent)
{
int32_t index = 0;
int32_t callcnt = 0;
@@ -3680,7 +3793,9 @@ unify_link_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_local_t *local = frame->local;
@@ -3704,7 +3819,9 @@ unify_ns_link_cbk (call_frame_t *frame,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
- struct stat *buf)
+ struct stat *buf,
+ struct stat *preparent,
+ struct stat *postparent)
{
unify_private_t *priv = this->private;
unify_local_t *local = frame->local;