summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/features/leases/src/leases-internal.c26
-rw-r--r--xlators/features/leases/src/leases-mem-types.h1
-rw-r--r--xlators/features/leases/src/leases.h6
3 files changed, 27 insertions, 6 deletions
diff --git a/xlators/features/leases/src/leases-internal.c b/xlators/features/leases/src/leases-internal.c
index a52bf577b75..24e8389cbc6 100644
--- a/xlators/features/leases/src/leases-internal.c
+++ b/xlators/features/leases/src/leases-internal.c
@@ -826,12 +826,15 @@ void
recall_lease_timer_handler (struct gf_tw_timer_list *timer,
void *data, unsigned long calltime)
{
- inode_t *inode = NULL;
- lease_inode_t *lease_inode = NULL;
- leases_private_t *priv = NULL;
+ inode_t *inode = NULL;
+ lease_inode_t *lease_inode = NULL;
+ leases_private_t *priv = NULL;
+ lease_timer_data_t *timer_data = NULL;
- priv = THIS->private;
- inode = (inode_t *)data;
+ timer_data = data;
+
+ priv = timer_data->this->private;
+ inode = timer_data->inode;
pthread_mutex_lock (&priv->mutex);
{
lease_inode = new_lease_inode (inode);
@@ -859,6 +862,7 @@ __recall_lease (xlator_t *this, lease_inode_ctx_t *lease_ctx)
int notify_ret = -1;
struct gf_tw_timer_list *timer = NULL;
leases_private_t *priv = NULL;
+ lease_timer_data_t *timer_data = NULL;
if (lease_ctx->recall_in_progress) {
gf_msg_debug (this->name, 0, "Lease recall is already in "
@@ -896,8 +900,18 @@ __recall_lease (xlator_t *this, lease_inode_ctx_t *lease_ctx)
if (!timer) {
goto out;
}
+ timer_data = GF_CALLOC (1, sizeof (*timer_data),
+ gf_leases_mt_timer_data_t);
+ if (!timer_data) {
+ GF_FREE (timer);
+ goto out;
+ }
+
+ timer_data->inode = inode_ref (lease_ctx->inode);
+ timer_data->this = this;
+ timer->data = timer_data;
+
INIT_LIST_HEAD (&timer->entry);
- timer->data = inode_ref (lease_ctx->inode);
timer->expires = get_recall_lease_timeout (this);
timer->function = recall_lease_timer_handler;
lease_ctx->timer = timer;
diff --git a/xlators/features/leases/src/leases-mem-types.h b/xlators/features/leases/src/leases-mem-types.h
index 055da45be5d..d1a59c1db2e 100644
--- a/xlators/features/leases/src/leases-mem-types.h
+++ b/xlators/features/leases/src/leases-mem-types.h
@@ -22,6 +22,7 @@ enum gf_leases_mem_types_ {
gf_leases_mt_lease_inode_ctx_t,
gf_leases_mt_lease_id_entry_t,
gf_leases_mt_fop_stub_t,
+ gf_leases_mt_timer_data_t,
gf_leases_mt_end
};
#endif
diff --git a/xlators/features/leases/src/leases.h b/xlators/features/leases/src/leases.h
index 16143691075..c779f1a67e7 100644
--- a/xlators/features/leases/src/leases.h
+++ b/xlators/features/leases/src/leases.h
@@ -213,6 +213,12 @@ struct __fop_stub {
};
typedef struct __fop_stub fop_stub_t;
+struct __lease_timer_data {
+ inode_t *inode;
+ xlator_t *this;
+};
+typedef struct __lease_timer_data lease_timer_data_t;
+
gf_boolean_t
is_leases_enabled (xlator_t *this);