Whamcloud - gitweb
LU-15357 mdd: fix changelog context leak 31/45831/4
authorMikhail Pershin <mpershin@whamcloud.com>
Sat, 11 Dec 2021 12:49:47 +0000 (15:49 +0300)
committerOleg Drokin <green@whamcloud.com>
Thu, 23 Dec 2021 07:17:05 +0000 (07:17 +0000)
The mdd_changelog_clear() shouldn't skip llog_ctxt_put()
in case of error.

Fixes: 6b183927e1 (LU-14553 changelog: eliminate mdd_changelog_clear warning)
Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: I9c9aa3ce0d11e8f67470b450d007f2a1081644c6
Reviewed-on: https://review.whamcloud.com/45831
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Olaf Faaland-LLNL <faaland1@llnl.gov>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdd/mdd_device.c

index 7f65dc8..e8ea4a2 100644 (file)
@@ -2142,48 +2142,54 @@ static int mdd_changelog_clear(const struct lu_env *env,
 
        ctxt = llog_get_context(mdd2obd_dev(mdd),
                                LLOG_CHANGELOG_USER_ORIG_CTXT);
 
        ctxt = llog_get_context(mdd2obd_dev(mdd),
                                LLOG_CHANGELOG_USER_ORIG_CTXT);
-       if (ctxt == NULL ||
-           (ctxt->loc_handle->lgh_hdr->llh_flags & LLOG_F_IS_CAT) == 0)
+       if (!ctxt)
+               RETURN(-ENXIO);
+
+       if (!(ctxt->loc_handle->lgh_hdr->llh_flags & LLOG_F_IS_CAT))
                GOTO(out, rc = -ENXIO);
 
        rc = llog_cat_process(env, ctxt->loc_handle, mdd_changelog_clear_cb,
                              &mcuc, 0, 0);
        if (rc == -EINVAL) {
                GOTO(out, rc = -ENXIO);
 
        rc = llog_cat_process(env, ctxt->loc_handle, mdd_changelog_clear_cb,
                              &mcuc, 0, 0);
        if (rc == -EINVAL) {
-               CDEBUG(D_IOCTL, "%s: No changelog recnum <= %llu to clear\n",
+               CDEBUG(D_IOCTL, "%s: no changelog recnum <= %llu to clear\n",
                       mdd2obd_dev(mdd)->obd_name, (unsigned long long)endrec);
                       mdd2obd_dev(mdd)->obd_name, (unsigned long long)endrec);
-               RETURN(-EINVAL);
-       } else if (rc < 0) {
+               GOTO(out, rc);
+       }
+
+       if (rc < 0) {
                CWARN("%s: can't clear the changelog for user %s: rc = %d\n",
                      mdd2obd_dev(mdd)->obd_name, mcuc.mcuc_name, rc);
                CWARN("%s: can't clear the changelog for user %s: rc = %d\n",
                      mdd2obd_dev(mdd)->obd_name, mcuc.mcuc_name, rc);
-       } else if (mcuc.mcuc_flush) {
-               CDEBUG(D_IOCTL,
-                      "%s: purge changelog user %s entries up to %llu\n",
-                      mdd2obd_dev(mdd)->obd_name, mcuc.mcuc_name,
-                      mcuc.mcuc_minrec);
-               rc = mdd_changelog_llog_cancel(env, mdd, mcuc.mcuc_minrec);
-               if (!rc) {
-                       spin_lock(&mdd->mdd_cl.mc_user_lock);
-                       mdd->mdd_cl.mc_minrec = mcuc.mcuc_minrec;
-                       mdd->mdd_cl.mc_mintime = mcuc.mcuc_mintime;
-                       spin_unlock(&mdd->mdd_cl.mc_user_lock);
-               }
-       } else {
-               CDEBUG(D_IOCTL, "%s: No entry for user %d\n",
-                     mdd2obd_dev(mdd)->obd_name, id);
-               rc = -ENOENT;
+               GOTO(out, rc);
        }
 
        }
 
+       if (!mcuc.mcuc_flush) {
+               CDEBUG(D_IOCTL, "%s: no entry for user %d\n",
+                      mdd2obd_dev(mdd)->obd_name, id);
+               GOTO(out, rc = -ENOENT);
+       }
+
+       CDEBUG(D_IOCTL, "%s: purge changelog user %s entries up to %llu\n",
+              mdd2obd_dev(mdd)->obd_name, mcuc.mcuc_name, mcuc.mcuc_minrec);
+
+       rc = mdd_changelog_llog_cancel(env, mdd, mcuc.mcuc_minrec);
+       if (rc)
+               GOTO(out, rc);
+
+       spin_lock(&mdd->mdd_cl.mc_user_lock);
+       mdd->mdd_cl.mc_minrec = mcuc.mcuc_minrec;
+       mdd->mdd_cl.mc_mintime = mcuc.mcuc_mintime;
+       spin_unlock(&mdd->mdd_cl.mc_user_lock);
+
        EXIT;
 out:
        EXIT;
 out:
-       if (ctxt != NULL)
-               llog_ctxt_put(ctxt);
+       llog_ctxt_put(ctxt);
 
        return rc;
 }
 
 static int mdd_changelog_user_deregister(const struct lu_env *env,
 
        return rc;
 }
 
 static int mdd_changelog_user_deregister(const struct lu_env *env,
-                                      struct mdd_device *mdd, int *id,
-                                      const char *name)
+                                        struct mdd_device *mdd, int *id,
+                                        const char *name)
 {
        struct llog_ctxt *ctxt;
        struct mdd_changelog_name_check_data mcnc = {
 {
        struct llog_ctxt *ctxt;
        struct mdd_changelog_name_check_data mcnc = {