Whamcloud - gitweb
LU-6838 llog: limit file size of plain logs
[fs/lustre-release.git] / lustre / obdclass / llog.c
index 0ab7a34..f2f2fc6 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -519,8 +515,19 @@ repeat:
                                 * while llog_processing, check this is not
                                 * the case and re-read the current chunk
                                 * otherwise. */
+                               int records;
                                if (index > loghandle->lgh_last_idx)
                                        GOTO(out, rc = 0);
+                               /* <2 records means no more records
+                                * if the last record we processed was
+                                * the final one, then the underlying
+                                * object might have been destroyed yet.
+                                * we better don't access that.. */
+                               mutex_lock(&loghandle->lgh_hdr_mutex);
+                               records = loghandle->lgh_hdr->llh_count;
+                               mutex_unlock(&loghandle->lgh_hdr_mutex);
+                               if (records <= 1)
+                                       GOTO(out, rc = 0);
                                CDEBUG(D_OTHER, "Re-read last llog buffer for "
                                       "new records, index %u, last %u\n",
                                       index, loghandle->lgh_last_idx);
@@ -898,11 +905,29 @@ int llog_write_rec(const struct lu_env *env, struct llog_handle *handle,
 
        ENTRY;
 
+       /* API sanity checks */
+       if (handle == NULL) {
+               CERROR("loghandle is missed\n");
+               RETURN(-EPROTO);
+       } else if (handle->lgh_obj == NULL) {
+               CERROR("loghandle %p with NULL object\n",
+                       handle);
+               RETURN(-EPROTO);
+       } else if (th == NULL) {
+               CERROR("%s: missed transaction handle\n",
+                       handle->lgh_obj->do_lu.lo_dev->ld_obd->obd_name);
+               RETURN(-EPROTO);
+       } else if (handle->lgh_hdr == NULL) {
+               CERROR("%s: loghandle %p with no header\n",
+                       handle->lgh_obj->do_lu.lo_dev->ld_obd->obd_name,
+                       handle);
+               RETURN(-EPROTO);
+       }
+
        rc = llog_handle2ops(handle, &lop);
        if (rc)
                RETURN(rc);
 
-       LASSERT(lop);
        if (lop->lop_write_rec == NULL)
                RETURN(-EOPNOTSUPP);