Whamcloud - gitweb
LU-5631 obdclass: Proper swabbing of llog_rec_tail. 37/11937/2
authorHenri Doreau <henri.doreau@cea.fr>
Tue, 16 Sep 2014 10:34:07 +0000 (12:34 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 18 Sep 2014 10:24:21 +0000 (10:24 +0000)
A variable-length structure preceeds llog_rec_tail within an llog
block. Thus cr_tail shouldn't be accessed directly as a structure
member but its actual location should be computed dynamically.

Signed-off-by: Henri Doreau <henri.doreau@cea.fr>
Change-Id: I2d244797d107cf52f647e19b2db780138e910925
Reviewed-on: http://review.whamcloud.com/11937
Tested-by: Jenkins
Reviewed-by: jacques-Charles Lafoucriere <jacques-charles.lafoucriere@cea.fr>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/obdclass/llog_swab.c

index a647a4b..25e249a 100644 (file)
@@ -171,16 +171,17 @@ void lustre_swab_llog_rec(struct llog_rec_hdr *rec)
        }
        case CHANGELOG_REC:
        {
-                struct llog_changelog_rec *cr = (struct llog_changelog_rec*)rec;
-
-                __swab16s(&cr->cr.cr_namelen);
-                __swab16s(&cr->cr.cr_flags);
-                __swab32s(&cr->cr.cr_type);
-                __swab64s(&cr->cr.cr_index);
-                __swab64s(&cr->cr.cr_prev);
-                __swab64s(&cr->cr.cr_time);
-                lustre_swab_lu_fid(&cr->cr.cr_tfid);
-                lustre_swab_lu_fid(&cr->cr.cr_pfid);
+               struct llog_changelog_rec *cr =
+                       (struct llog_changelog_rec *)rec;
+
+               __swab16s(&cr->cr.cr_namelen);
+               __swab16s(&cr->cr.cr_flags);
+               __swab32s(&cr->cr.cr_type);
+               __swab64s(&cr->cr.cr_index);
+               __swab64s(&cr->cr.cr_prev);
+               __swab64s(&cr->cr.cr_time);
+               lustre_swab_lu_fid(&cr->cr.cr_tfid);
+               lustre_swab_lu_fid(&cr->cr.cr_pfid);
                if (CHANGELOG_REC_EXTENDED(&cr->cr)) {
                        struct llog_changelog_ext_rec *ext =
                                (struct llog_changelog_ext_rec *)rec;
@@ -191,8 +192,10 @@ void lustre_swab_llog_rec(struct llog_rec_hdr *rec)
                } else {
                        tail = &cr->cr_tail;
                }
-                break;
-        }
+               tail = (struct llog_rec_tail *)((char *)tail +
+                                               cr->cr.cr_namelen);
+               break;
+       }
        case CHANGELOG_USER_REC:
        {
                 struct llog_changelog_user_rec *cur =
@@ -275,10 +278,10 @@ void lustre_swab_llog_rec(struct llog_rec_hdr *rec)
                        rec->lrh_type, rec);
         }
 
-        if (tail) {
-                __swab32s(&tail->lrt_len);
-                __swab32s(&tail->lrt_index);
-        }
+       if (tail) {
+               __swab32s(&tail->lrt_len);
+               __swab32s(&tail->lrt_index);
+       }
 }
 EXPORT_SYMBOL(lustre_swab_llog_rec);