diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h
index e2e68460a6e38ffc3dd3dd0a1641ea366d8f101d..368f35c85efce2b4122f8364f4a974d39ac060aa 100644
--- a/lustre/include/linux/lustre_idl.h
+++ b/lustre/include/linux/lustre_idl.h
@@ -878,7 +878,7 @@ struct llog_rec_tail {
 struct llog_logid_rec {
         struct llog_rec_hdr     lid_hdr;
         struct llog_logid       lid_id;
-        __u32                   padding[5];
+        __u32                   padding;
         struct llog_rec_tail    lid_tail;
 } __attribute__((packed));
 
@@ -887,7 +887,7 @@ struct llog_create_rec {
         struct ll_fid           lcr_fid;
         obd_id                  lcr_oid;
         obd_count               lcr_ogen;
-        __u32                   padding[3];
+        __u32                   padding;
         struct llog_rec_tail    lcr_tail;
 } __attribute__((packed));
 
@@ -895,7 +895,7 @@ struct llog_orphan_rec {
         struct llog_rec_hdr     lor_hdr;
         obd_id                  lor_oid;
         obd_count               lor_ogen;
-        __u32                   padding[7];
+        __u32                   padding;
         struct llog_rec_tail    lor_tail;
 } __attribute__((packed));
 
@@ -903,7 +903,7 @@ struct llog_unlink_rec {
         struct llog_rec_hdr     lur_hdr;
         obd_id                  lur_oid;
         obd_count               lur_ogen;
-        __u32                   padding[7];
+        __u32                   padding;
         struct llog_rec_tail    lur_tail;
 } __attribute__((packed));
 
@@ -911,7 +911,7 @@ struct llog_size_change_rec {
         struct llog_rec_hdr     lsc_hdr;
         struct ll_fid           lsc_fid;
         __u32                   lsc_io_epoch;
-        __u32                   padding[5];
+        __u32                   padding;
         struct llog_rec_tail    lsc_tail;
 } __attribute__((packed));
 
@@ -920,7 +920,7 @@ struct llog_size_change_rec {
 #define LLOG_HEADER_SIZE        (96)
 #define LLOG_BITMAP_BYTES       (LLOG_CHUNK_SIZE - LLOG_HEADER_SIZE)
 
-#define LLOG_MIN_REC_SIZE       (32) /* round(struct llog_rec_hdr+end_len) */
+#define LLOG_MIN_REC_SIZE       (24) /* round(llog_rec_hdr + llog_rec_tail) */
 
 /* flags for the logs */
 #define LLOG_F_ZAP_WHEN_EMPTY   0x1
diff --git a/lustre/include/linux/lustre_log.h b/lustre/include/linux/lustre_log.h
index 4a7b12443a21a9b6bb1e076a260ecf14200a7bfe..ad60e1b462a3abef2fddcaf85230fefbdbe6f4b8 100644
--- a/lustre/include/linux/lustre_log.h
+++ b/lustre/include/linux/lustre_log.h
@@ -231,12 +231,7 @@ static inline int llog_handle2ops(struct llog_handle *loghandle,
 
 static inline int llog_data_len(int len)
 {
-        int mask = LLOG_MIN_REC_SIZE - 1;
-        int remains = LLOG_MIN_REC_SIZE - sizeof(struct llog_rec_hdr) -
-                sizeof(struct llog_rec_tail); 
-        
-        return (len <= remains) ? 
-                remains : (((len + mask) & (~mask)) + remains);
+        return size_round(len);
 }
 
 static inline struct llog_ctxt *llog_get_context(struct obd_device *obd,
@@ -268,7 +263,7 @@ static inline int llog_write_rec(struct llog_handle *handle,
                                 + sizeof(struct llog_rec_tail);
         else
                 buflen = le32_to_cpu(rec->lrh_len);
-        LASSERT((buflen % LLOG_MIN_REC_SIZE) == 0);
+        LASSERT(size_round(buflen) == buflen);
 
         rc = lop->lop_write_rec(handle, rec, logcookies, numcookies, buf, idx);
         RETURN(rc);
diff --git a/lustre/obdclass/llog_lvfs.c b/lustre/obdclass/llog_lvfs.c
index 21992991e7e79f09200c7f2dfa42e30673a77312..a5a94eb67f781ffdb21b0ef25c565b8e5d0b8503 100644
--- a/lustre/obdclass/llog_lvfs.c
+++ b/lustre/obdclass/llog_lvfs.c
@@ -57,7 +57,7 @@ static int llog_lvfs_pad(struct obd_device *obd, struct l_file *file,
         int rc;
         ENTRY;
 
-        LASSERT(len >= LLOG_MIN_REC_SIZE && (len & 0xf) == 0);
+        LASSERT(len >= LLOG_MIN_REC_SIZE && (len & 0x7) == 0);
 
         tail.lrt_len = rec.lrh_len = cpu_to_le32(len);
         tail.lrt_index = rec.lrh_index = cpu_to_le32(index);
@@ -247,7 +247,8 @@ static int llog_lvfs_write_rec(struct llog_handle *loghandle,
                         sizeof(struct llog_rec_tail);
 
         /* NOTE: padding is a record, but no bit is set */
-        if (left != 0 && left < reclen) {
+        if (left != 0 && left != reclen && 
+            left < (reclen + LLOG_MIN_REC_SIZE)) {
                 loghandle->lgh_last_idx++;
                 rc = llog_lvfs_pad(obd, file, left, loghandle->lgh_last_idx);
                 if (rc)
diff --git a/lustre/obdclass/llog_test.c b/lustre/obdclass/llog_test.c
index 4f58a40eda49156879667bf7e4a8c8b5d699d147..137b5b759d03209cd41873abde877c6d5d2b4f25 100644
--- a/lustre/obdclass/llog_test.c
+++ b/lustre/obdclass/llog_test.c
@@ -40,7 +40,6 @@ static struct llog_logid cat_logid;
 
 struct llog_mini_rec {
         struct llog_rec_hdr     lmr_hdr;
-        __u32                   padding[2];
         struct llog_rec_tail    lmr_tail;
 } __attribute__((packed));