summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/xlator.h
diff options
context:
space:
mode:
authorVenky Shankar <vshankar@redhat.com>2015-03-15 03:43:49 +0530
committerVijay Bellur <vbellur@redhat.com>2015-03-24 06:34:33 -0700
commit3c474a042aed68659fe0cfdf32e01285bde9f689 (patch)
tree6229d9f3ba8de1946182ebf1b66803563cb21d71 /libglusterfs/src/xlator.h
parent9f5addd987861d0a3a1144d576221a7f93af0970 (diff)
core: Add inode context merge callback
Certain translators may require to update the inode context of an already linked inode before unwinding the call to the client. Normally, such a case in encountered during parallel operations when a fresh inode is chosen at call (wind) time. In the callback path, one of inodes is successfully linked in the inode table, thereby the other inodes being thrown away (and the inode pointers for these calls being pointed to the linked inode). Translators which may have strict dependency on the correct value in the inode context would get stale values in inode context. This patch introduces a new callback which provides gives translators an opportunity to "patch" their respective inode contexts. Note that, as of now, this callback is only invoked during create()s unwind path. Although this might needed to be done for all dentry fops and lookup, but let that be done as an when required (bitrot stub requires this *only* for create()). Change-Id: I6cd91c2af473c44d1511208060d3978e580c67a6 BUG: 1170075 Original-Author: Raghavendra Bhat <rabhat@redhat.com> Original-Author: Venky Shankar <vshankar@redhat.com> Signed-off-by: Venky Shankar <vshankar@redhat.com> Reviewed-on: http://review.gluster.org/9913 Reviewed-by: Vijay Bellur <vbellur@redhat.com> Tested-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs/src/xlator.h')
-rw-r--r--libglusterfs/src/xlator.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index 5a71ceb3f31..5a0b114d6a8 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -796,6 +796,9 @@ typedef int32_t (*cbk_invalidate_t)(xlator_t *this, inode_t *inode);
typedef int32_t (*cbk_client_t)(xlator_t *this, client_t *client);
+typedef void (*cbk_ictxmerge_t) (xlator_t *this, fd_t *fd,
+ inode_t *inode, inode_t *linked_inode);
+
struct xlator_cbks {
cbk_forget_t forget;
cbk_release_t release;
@@ -803,6 +806,7 @@ struct xlator_cbks {
cbk_invalidate_t invalidate;
cbk_client_t client_destroy;
cbk_client_t client_disconnect;
+ cbk_ictxmerge_t ictxmerge;
};
typedef int32_t (*dumpop_priv_t) (xlator_t *this);