From b3d395b4eb2bc239bfd342a5417130b7c29d15de Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Tue, 19 Feb 2013 08:42:58 +0800 Subject: [PATCH] LU-2790 ldlm: handle lvbo_init failure in ldlm_resource_get Under some special cases, such as RAM pressure, lvbo_init() may be failed, then the caller - ldlm_resource_get() should handle the failure to prevent subsequent operations to use non-exist resource. Signed-off-by: Fan Yong Change-Id: I0eabbf5daaaba9aa163a45f24b6b621477ec4d32 Reviewed-on: http://review.whamcloud.com/5699 Tested-by: Hudson Reviewed-by: Alex Zhuravlev Tested-by: Maloo Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin --- lustre/include/lustre_dlm.h | 2 +- lustre/ldlm/ldlm_resource.c | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index df5014a..ea27fcca 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -1137,7 +1137,7 @@ struct ldlm_resource { * To serialize lvbo_init. */ struct mutex lr_lvb_mutex; - __u32 lr_lvb_len; + int lr_lvb_len; /** protected by lr_lock */ void *lr_lvb_data; diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c index e48124b..47b2901 100644 --- a/lustre/ldlm/ldlm_resource.c +++ b/lustre/ldlm/ldlm_resource.c @@ -1104,6 +1104,11 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, mutex_lock(&res->lr_lvb_mutex); mutex_unlock(&res->lr_lvb_mutex); } + + if (unlikely(res->lr_lvb_len < 0)) { + ldlm_resource_putref(res); + res = NULL; + } return res; } @@ -1143,6 +1148,11 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, mutex_lock(&res->lr_lvb_mutex); mutex_unlock(&res->lr_lvb_mutex); } + + if (unlikely(res->lr_lvb_len < 0)) { + ldlm_resource_putref(res); + res = NULL; + } return res; } /* We won! Let's add the resource. */ @@ -1156,9 +1166,18 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent, OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_CREATE_RESOURCE, 2); rc = ns->ns_lvbo->lvbo_init(res); - if (rc) - CERROR("lvbo_init failed for resource " - LPU64": rc %d\n", name->name[0], rc); + if (rc < 0) { + CERROR("lvbo_init failed for resource " + LPU64": rc %d\n", name->name[0], rc); + if (res->lr_lvb_data) { + OBD_FREE(res->lr_lvb_data, res->lr_lvb_len); + res->lr_lvb_data = NULL; + } + res->lr_lvb_len = rc; + mutex_unlock(&res->lr_lvb_mutex); + ldlm_resource_putref(res); + return NULL; + } } /* We create resource with locked lr_lvb_mutex. */ -- 1.8.3.1