Whamcloud - gitweb
LU-5687 dt: propagate errors from failed declarations
[fs/lustre-release.git] / lustre / obdclass / llog.c
index 3a3f430..a4fbc25 100644 (file)
@@ -47,9 +47,6 @@
 
 #define DEBUG_SUBSYSTEM S_LOG
 
-#ifndef __KERNEL__
-#include <liblustre.h>
-#endif
 
 #include <obd_class.h>
 #include <lustre_log.h>
@@ -69,7 +66,7 @@ struct llog_handle *llog_alloc_handle(void)
 
        init_rwsem(&loghandle->lgh_lock);
        spin_lock_init(&loghandle->lgh_hdr_lock);
-       CFS_INIT_LIST_HEAD(&loghandle->u.phd.phd_entry);
+       INIT_LIST_HEAD(&loghandle->u.phd.phd_entry);
        atomic_set(&loghandle->lgh_refcount, 1);
 
        return loghandle;
@@ -87,9 +84,9 @@ void llog_free_handle(struct llog_handle *loghandle)
                goto out;
 
        if (loghandle->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)
-               LASSERT(cfs_list_empty(&loghandle->u.phd.phd_entry));
+               LASSERT(list_empty(&loghandle->u.phd.phd_entry));
        else if (loghandle->lgh_hdr->llh_flags & LLOG_F_IS_CAT)
-               LASSERT(cfs_list_empty(&loghandle->u.chd.chd_head));
+               LASSERT(list_empty(&loghandle->u.chd.chd_head));
        LASSERT(sizeof(*(loghandle->lgh_hdr)) == LLOG_CHUNK_SIZE);
        OBD_FREE(loghandle->lgh_hdr, LLOG_CHUNK_SIZE);
 out:
@@ -150,7 +147,7 @@ int llog_cancel_rec(const struct lu_env *env, struct llog_handle *loghandle,
        }
        spin_unlock(&loghandle->lgh_hdr_lock);
 
-       rc = llog_write(env, loghandle, &llh->llh_hdr, NULL, 0, NULL, 0);
+       rc = llog_write(env, loghandle, &llh->llh_hdr, LLOG_HEADER_IDX);
        if (rc < 0) {
                CERROR("%s: fail to write header for llog #"DOSTID
                       "#%08x: rc = %d\n",
@@ -207,6 +204,7 @@ int llog_init_handle(const struct lu_env *env, struct llog_handle *handle,
                     int flags, struct obd_uuid *uuid)
 {
        struct llog_log_hdr     *llh;
+       enum llog_flag           fmt = flags & LLOG_F_EXT_MASK;
        int                      rc;
 
        ENTRY;
@@ -252,8 +250,8 @@ int llog_init_handle(const struct lu_env *env, struct llog_handle *handle,
                }
        }
        if (flags & LLOG_F_IS_CAT) {
-               LASSERT(cfs_list_empty(&handle->u.chd.chd_head));
-               CFS_INIT_LIST_HEAD(&handle->u.chd.chd_head);
+               LASSERT(list_empty(&handle->u.chd.chd_head));
+               INIT_LIST_HEAD(&handle->u.chd.chd_head);
                llh->llh_size = sizeof(struct llog_logid_rec);
        } else if (!(flags & LLOG_F_IS_PLAIN)) {
                CERROR("%s: unknown flags: %#x (expected %#x or %#x)\n",
@@ -261,6 +259,7 @@ int llog_init_handle(const struct lu_env *env, struct llog_handle *handle,
                       flags, LLOG_F_IS_CAT, LLOG_F_IS_PLAIN);
                rc = -EINVAL;
        }
+       llh->llh_flags |= fmt;
 out:
        if (rc) {
                OBD_FREE_PTR(llh);
@@ -325,15 +324,15 @@ repeat:
                 if (rc)
                         GOTO(out, rc);
 
-                /* NB: when rec->lrh_len is accessed it is already swabbed
-                 * since it is used at the "end" of the loop and the rec
-                 * swabbing is done at the beginning of the loop. */
-                for (rec = (struct llog_rec_hdr *)buf;
-                     (char *)rec < buf + LLOG_CHUNK_SIZE;
-                     rec = (struct llog_rec_hdr *)((char *)rec + rec->lrh_len)){
+               /* NB: when rec->lrh_len is accessed it is already swabbed
+                * since it is used at the "end" of the loop and the rec
+                * swabbing is done at the beginning of the loop. */
+               for (rec = (struct llog_rec_hdr *)buf;
+                    (char *)rec < buf + LLOG_CHUNK_SIZE;
+                    rec = llog_rec_hdr_next(rec)) {
 
-                        CDEBUG(D_OTHER, "processing rec 0x%p type %#x\n",
-                               rec, rec->lrh_type);
+                       CDEBUG(D_OTHER, "processing rec 0x%p type %#x\n",
+                              rec, rec->lrh_type);
 
                         if (LLOG_REC_HDR_NEEDS_SWABBING(rec))
                                lustre_swab_llog_rec(rec);
@@ -399,12 +398,12 @@ out:
         if (cd != NULL)
                 cd->lpcd_last_idx = last_called_index;
 
-       if (unlikely(rc == -EIO)) {
-               /* something bad happened to the processing, probably I/O
-                * error or the log got corrupted..
+       if (unlikely(rc == -EIO && loghandle->lgh_obj != NULL)) {
+               /* something bad happened to the processing of a local
+                * llog file, probably I/O error or the log got corrupted..
                 * to be able to finally release the log we discard any
                 * remaining bits in the header */
-               CERROR("llog found corrupted\n");
+               CERROR("Local llog found corrupted\n");
                while (index <= last_index) {
                        if (ext2_test_bit(index, llh->llh_bitmap) != 0)
                                llog_cancel_rec(lpi->lpi_env, loghandle, index);
@@ -418,7 +417,6 @@ out:
         return 0;
 }
 
-#ifdef __KERNEL__
 static int llog_process_thread_daemonize(void *arg)
 {
        struct llog_process_info        *lpi = arg;
@@ -440,7 +438,6 @@ out:
        complete(&lpi->lpi_completion);
        return rc;
 }
-#endif
 
 int llog_process_or_fork(const struct lu_env *env,
                         struct llog_handle *loghandle,
@@ -461,7 +458,6 @@ int llog_process_or_fork(const struct lu_env *env,
         lpi->lpi_cbdata    = data;
         lpi->lpi_catdata   = catdata;
 
-#ifdef __KERNEL__
        if (fork) {
                struct task_struct *task;
 
@@ -482,15 +478,9 @@ int llog_process_or_fork(const struct lu_env *env,
                lpi->lpi_env = env;
                llog_process_thread(lpi);
        }
-#else
-       lpi->lpi_env = env;
-       llog_process_thread(lpi);
-#endif
        rc = lpi->lpi_rc;
 
-#ifdef __KERNEL__
 out_lpi:
-#endif
        OBD_FREE_PTR(lpi);
        RETURN(rc);
 }
@@ -703,7 +693,7 @@ EXPORT_SYMBOL(llog_declare_write_rec);
 
 int llog_write_rec(const struct lu_env *env, struct llog_handle *handle,
                   struct llog_rec_hdr *rec, struct llog_cookie *logcookies,
-                  int numcookies, void *buf, int idx, struct thandle *th)
+                  int idx, struct thandle *th)
 {
        struct llog_operations  *lop;
        int                      raised, rc, buflen;
@@ -718,18 +708,13 @@ int llog_write_rec(const struct lu_env *env, struct llog_handle *handle,
        if (lop->lop_write_rec == NULL)
                RETURN(-EOPNOTSUPP);
 
-       if (buf)
-               buflen = rec->lrh_len + sizeof(struct llog_rec_hdr) +
-                        sizeof(struct llog_rec_tail);
-       else
-               buflen = rec->lrh_len;
+       buflen = rec->lrh_len;
        LASSERT(cfs_size_round(buflen) == buflen);
 
        raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE);
        if (!raised)
                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
-       rc = lop->lop_write_rec(env, handle, rec, logcookies, numcookies,
-                               buf, idx, th);
+       rc = lop->lop_write_rec(env, handle, rec, logcookies, idx, th);
        if (!raised)
                cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
        RETURN(rc);
@@ -738,7 +723,7 @@ EXPORT_SYMBOL(llog_write_rec);
 
 int llog_add(const struct lu_env *env, struct llog_handle *lgh,
             struct llog_rec_hdr *rec, struct llog_cookie *logcookies,
-            void *buf, struct thandle *th)
+            struct thandle *th)
 {
        int raised, rc;
 
@@ -750,7 +735,7 @@ int llog_add(const struct lu_env *env, struct llog_handle *lgh,
        raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE);
        if (!raised)
                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
-       rc = lgh->lgh_logops->lop_add(env, lgh, rec, logcookies, buf, th);
+       rc = lgh->lgh_logops->lop_add(env, lgh, rec, logcookies, th);
        if (!raised)
                cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
        RETURN(rc);
@@ -856,8 +841,7 @@ EXPORT_SYMBOL(llog_erase);
  * Valid only with local llog.
  */
 int llog_write(const struct lu_env *env, struct llog_handle *loghandle,
-              struct llog_rec_hdr *rec, struct llog_cookie *reccookie,
-              int cookiecount, void *buf, int idx)
+              struct llog_rec_hdr *rec, int idx)
 {
        struct dt_device        *dt;
        struct thandle          *th;
@@ -884,8 +868,7 @@ int llog_write(const struct lu_env *env, struct llog_handle *loghandle,
                GOTO(out_trans, rc);
 
        down_write(&loghandle->lgh_lock);
-       rc = llog_write_rec(env, loghandle, rec, reccookie,
-                           cookiecount, buf, idx, th);
+       rc = llog_write_rec(env, loghandle, rec, NULL, idx, th);
        up_write(&loghandle->lgh_lock);
 out_trans:
        dt_trans_stop(env, dt, th);
@@ -949,6 +932,17 @@ out:
 }
 EXPORT_SYMBOL(llog_close);
 
+/**
+ * Helper function to get the llog size in records. It is used by MGS
+ * mostly to check that config llog exists and contains data.
+ *
+ * \param[in] env      execution environment
+ * \param[in] ctxt     llog context
+ * \param[in] name     llog name
+ *
+ * \retval             true if there are records in llog besides a header
+ * \retval             false on error or llog without records
+ */
 int llog_is_empty(const struct lu_env *env, struct llog_ctxt *ctxt,
                  char *name)
 {
@@ -970,7 +964,8 @@ int llog_is_empty(const struct lu_env *env, struct llog_ctxt *ctxt,
 out_close:
        llog_close(env, llh);
 out:
-       /* header is record 1 */
+       /* The header is record 1, the llog is still considered as empty
+        * if there is only header */
        return (rc <= 1);
 }
 EXPORT_SYMBOL(llog_is_empty);
@@ -981,7 +976,7 @@ int llog_copy_handler(const struct lu_env *env, struct llog_handle *llh,
        struct llog_handle      *copy_llh = data;
 
        /* Append all records */
-       return llog_write(env, copy_llh, rec, NULL, 0, NULL, -1);
+       return llog_write(env, copy_llh, rec, LLOG_NEXT_IDX);
 }
 EXPORT_SYMBOL(llog_copy_handler);