Whamcloud - gitweb
LU-7064 obd: detect errors from llog_declare_destroy()
[fs/lustre-release.git] / lustre / obdclass / llog.c
index 56e941e..0ab7a34 100644 (file)
@@ -229,8 +229,11 @@ int llog_cancel_rec(const struct lu_env *env, struct llog_handle *loghandle,
        if (rc < 0)
                GOTO(out_trans, rc);
 
-       if ((llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY))
+       if ((llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY)) {
                rc = llog_declare_destroy(env, loghandle, th);
+               if (rc < 0)
+                       GOTO(out_trans, rc);
+       }
 
        th->th_wait_submit = 1;
        rc = dt_trans_start_local(env, dt, th);
@@ -258,7 +261,12 @@ int llog_cancel_rec(const struct lu_env *env, struct llog_handle *loghandle,
 
        if ((llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY) &&
            (llh->llh_count == 1) &&
-           (loghandle->lgh_last_idx == LLOG_HDR_BITMAP_SIZE(llh) - 1)) {
+           ((loghandle->lgh_last_idx == LLOG_HDR_BITMAP_SIZE(llh) - 1) ||
+            (loghandle->u.phd.phd_cat_handle != NULL &&
+             loghandle->u.phd.phd_cat_handle->u.chd.chd_current_log !=
+               loghandle))) {
+               /* never try to destroy it again */
+               llh->llh_flags &= ~LLOG_F_ZAP_WHEN_EMPTY;
                rc = llog_trans_destroy(env, loghandle, th);
                if (rc < 0) {
                        /* Sigh, can not destroy the final plain llog, but
@@ -419,7 +427,7 @@ static int llog_process_thread(void *arg)
        struct llog_process_cat_data    *cd  = lpi->lpi_catdata;
        char                            *buf;
        size_t                           chunk_size;
-       __u64                            cur_offset;
+       __u64                            cur_offset, tmp_offset;
        int                              rc = 0, index = 1, last_index;
        int                              saved_index = 0;
        int                              last_called_index = 0;
@@ -479,7 +487,8 @@ repeat:
                 * The absolute offset of the current chunk is calculated
                 * from cur_offset value and stored in chunk_offset variable.
                 */
-               if (cur_offset % chunk_size != 0) {
+               tmp_offset = cur_offset;
+               if (do_div(tmp_offset, chunk_size) != 0) {
                        partial_chunk = true;
                        chunk_offset = cur_offset & ~(chunk_size - 1);
                } else {
@@ -1241,3 +1250,21 @@ out_close:
        RETURN(rc);
 }
 EXPORT_SYMBOL(llog_backup);
+
+/* Get size of llog */
+__u64 llog_size(const struct lu_env *env, struct llog_handle *llh)
+{
+       int rc;
+       struct lu_attr la;
+
+       rc = llh->lgh_obj->do_ops->do_attr_get(env, llh->lgh_obj, &la);
+       if (rc) {
+               CERROR("%s: attr_get failed, rc = %d\n",
+                      llh->lgh_ctxt->loc_obd->obd_name, rc);
+               return 0;
+       }
+
+       return la.la_size;
+}
+EXPORT_SYMBOL(llog_size);
+