Whamcloud - gitweb
LU-2743 mgs: Add a missing rc reset
[fs/lustre-release.git] / lustre / ofd / ofd_lvb.c
index edadc69..fa1e6f4 100644 (file)
@@ -72,13 +72,16 @@ static int ofd_lvbo_init(struct ldlm_resource *res)
        ofd = ldlm_res_to_ns(res)->ns_lvbp;
        LASSERT(ofd != NULL);
 
+       if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_OST_LVB))
+               RETURN(-ENOMEM);
+
        rc = lu_env_init(&env, LCT_DT_THREAD);
        if (rc)
                RETURN(rc);
 
        OBD_ALLOC_PTR(lvb);
        if (lvb == NULL)
-               RETURN(-ENOMEM);
+               GOTO(out, rc = -ENOMEM);
 
        res->lr_lvb_data = lvb;
        res->lr_lvb_len = sizeof(*lvb);
@@ -109,7 +112,7 @@ out_put:
        ofd_object_put(&env, fo);
 out:
        lu_env_fini(&env);
-       if (rc)
+       if (rc && lvb != NULL)
                OST_LVB_SET_ERR(lvb->lvb_blocks, rc);
        /* Don't free lvb data on lookup error */
        return rc;
@@ -281,7 +284,17 @@ static int ofd_lvbo_size(struct ldlm_lock *lock)
 static int ofd_lvbo_fill(struct ldlm_lock *lock, void *buf, int buflen)
 {
        struct ldlm_resource *res = lock->l_resource;
-       int lvb_len = min_t(int, res->lr_lvb_len, buflen);
+       int lvb_len;
+
+       /* Former lvbo_init not allocate the "LVB". */
+       if (unlikely(res->lr_lvb_len == 0))
+               return 0;
+
+       lvb_len = ofd_lvbo_size(lock);
+       LASSERT(lvb_len <= res->lr_lvb_len);
+
+       if (lvb_len > buflen)
+               lvb_len = buflen;
 
        lock_res(res);
        memcpy(buf, res->lr_lvb_data, lvb_len);