summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/syncop.c40
-rw-r--r--libglusterfs/src/syncop.h6
2 files changed, 46 insertions, 0 deletions
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c
index 56042d6897e..f571a2ae8bd 100644
--- a/libglusterfs/src/syncop.c
+++ b/libglusterfs/src/syncop.c
@@ -209,6 +209,46 @@ out:
return ret;
}
+int
+syncopctx_setfslkowner (gf_lkowner_t *lk_owner)
+{
+ struct syncopctx *opctx = NULL;
+ int ret = 0;
+
+ /* In args check */
+ if (!lk_owner) {
+ ret = -1;
+ errno = EINVAL;
+ goto out;
+ }
+
+ opctx = syncopctx_getctx ();
+
+ /* alloc for this thread the first time */
+ if (!opctx) {
+ opctx = GF_CALLOC (1, sizeof (*opctx), gf_common_mt_syncopctx);
+ if (!opctx) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = syncopctx_setctx (opctx);
+ if (ret != 0) {
+ GF_FREE (opctx);
+ opctx = NULL;
+ goto out;
+ }
+ }
+
+out:
+ if (opctx && lk_owner) {
+ opctx->lk_owner = *lk_owner;
+ opctx->valid |= SYNCOPCTX_LKOWNER;
+ }
+
+ return ret;
+}
+
static void
__run (struct synctask *task)
{
diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h
index 40ed0e865e3..3f751de6da5 100644
--- a/libglusterfs/src/syncop.h
+++ b/libglusterfs/src/syncop.h
@@ -32,6 +32,7 @@
#define SYNCOPCTX_GID 0x00000002
#define SYNCOPCTX_GROUPS 0x00000004
#define SYNCOPCTX_PID 0x00000008
+#define SYNCOPCTX_LKOWNER 0x00000010
struct synctask;
struct syncproc;
@@ -167,6 +168,7 @@ struct syncopctx {
int ngrps;
gid_t *groups;
pid_t pid;
+ gf_lkowner_t lk_owner;
};
#define __yawn(args) do { \
@@ -264,6 +266,7 @@ int syncopctx_setfsuid (void *uid);
int syncopctx_setfsgid (void *gid);
int syncopctx_setfsgroups (int count, const void *groups);
int syncopctx_setfspid (void *pid);
+int syncopctx_setfslkowner (gf_lkowner_t *lk_owner);
static inline call_frame_t *
syncop_create_frame (xlator_t *this)
@@ -324,6 +327,9 @@ syncop_create_frame (xlator_t *this)
}
}
+ if (opctx && (opctx->valid & SYNCOPCTX_LKOWNER))
+ frame->root->lk_owner = opctx->lk_owner;
+
return frame;
}