]> git.karo-electronics.de Git - linux-beck.git/commitdiff
staging: lustre: llog: reset llog bitmap
authorwang di <di.wang@intel.com>
Sat, 3 Dec 2016 00:53:13 +0000 (19:53 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Dec 2016 09:47:55 +0000 (10:47 +0100)
Once update request fails due to eviction or other failures,
all of update request in the sending list should return fail,
because after the failure, the update log in the following
request will have wrong llog bitmap.

Signed-off-by: wang di <di.wang@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7039
Reviewed-on: http://review.whamcloud.com/16969
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/obdclass/llog.c

index 1f6609ec7decc2e9ccf71c174b36d49783065ae3..736ea1067c93fc902c1e99bda4578946899d9ae8 100644 (file)
@@ -115,6 +115,7 @@ static int llog_read_header(const struct lu_env *env,
        rc = lop->lop_read_header(env, handle);
        if (rc == LLOG_EEMPTY) {
                struct llog_log_hdr *llh = handle->lgh_hdr;
+               size_t len;
 
                /* lrh_len should be initialized in llog_init_handle */
                handle->lgh_last_idx = 0; /* header is record with index 0 */
@@ -128,6 +129,12 @@ static int llog_read_header(const struct lu_env *env,
                        memcpy(&llh->llh_tgtuuid, uuid,
                               sizeof(llh->llh_tgtuuid));
                llh->llh_bitmap_offset = offsetof(typeof(*llh), llh_bitmap);
+               /*
+                * Since update llog header might also call this function,
+                * let's reset the bitmap to 0 here
+                */
+               len = llh->llh_hdr.lrh_len - llh->llh_bitmap_offset;
+               memset(LLOG_HDR_BITMAP(llh), 0, len - sizeof(llh->llh_tail));
                ext2_set_bit(0, LLOG_HDR_BITMAP(llh));
                LLOG_HDR_TAIL(llh)->lrt_len = llh->llh_hdr.lrh_len;
                LLOG_HDR_TAIL(llh)->lrt_index = llh->llh_hdr.lrh_index;