Whamcloud - gitweb
LU-4615 lfsck: verify index before locating target descriptor 89/14189/6
authorFan Yong <fan.yong@intel.com>
Wed, 8 Apr 2015 13:41:53 +0000 (21:41 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 30 May 2015 02:41:41 +0000 (02:41 +0000)
Sometimes, the OST index stored in the file layout EA may be crashed,
or maybe the target server has not registered. LFSCK should has the
ability to detect that to avoid invalid accessing.

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I83ead7077885b6fc73bc56361725724d087c1957
Reviewed-on: http://review.whamcloud.com/14189
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lfsck/lfsck_engine.c
lustre/lfsck/lfsck_internal.h
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_namespace.c
lustre/lfsck/lfsck_striped_dir.c

index 375e64c..afcbb9b 100644 (file)
@@ -1381,7 +1381,7 @@ next:
                spin_lock(&ltds->ltd_lock);
                if (com->lc_type == LFSCK_TYPE_LAYOUT) {
                        cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
-                               ltd = LTD_TGT(ltds, idx);
+                               ltd = lfsck_ltd2tgt(ltds, idx);
                                LASSERT(ltd != NULL);
 
                                if (!list_empty(&ltd->ltd_layout_list))
@@ -1394,7 +1394,7 @@ next:
                        }
                } else {
                        cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
-                               ltd = LTD_TGT(ltds, idx);
+                               ltd = lfsck_ltd2tgt(ltds, idx);
                                LASSERT(ltd != NULL);
 
                                if (!list_empty(&ltd->ltd_namespace_list))
index 7945769..4abe593 100644 (file)
@@ -483,12 +483,30 @@ struct lfsck_tgt_descs {
        __u32                            ltd_tgtnr;
 };
 
-#define LTD_TGT(ltd, index)    \
-       ((ltd)->ltd_tgts_idx[(index) / TGT_PTRS_PER_BLOCK]->\
-        ldi_tgts[(index) % TGT_PTRS_PER_BLOCK])
+static inline struct lfsck_tgt_desc *
+lfsck_ltd2tgt(struct lfsck_tgt_descs *ltd, __u32 index)
+{
+       __u32 idx1 = index / TGT_PTRS_PER_BLOCK;
+       __u32 idx2 = index % TGT_PTRS_PER_BLOCK;
+       struct lfsck_tgt_desc *__tgt = NULL;
+
+       if (unlikely(idx1 >= TGT_PTRS))
+               CDEBUG(D_LFSCK, "The target idx %u is invalid.\n", index);
+       else if (likely(ltd->ltd_tgts_idx[idx1] != NULL))
+               __tgt = ltd->ltd_tgts_idx[idx1]->ldi_tgts[idx2];
+
+       return __tgt;
+}
 
-#define OST_TGT(lfsck, index)   LTD_TGT(&lfsck->li_ost_descs, index)
-#define MDT_TGT(lfsck, index)   LTD_TGT(&lfsck->li_mdt_descs, index)
+static inline void lfsck_assign_tgt(struct lfsck_tgt_descs *ltd,
+                                   struct lfsck_tgt_desc *tgt, __u32 index)
+{
+       __u32 idx1 = index / TGT_PTRS_PER_BLOCK;
+       __u32 idx2 = index % TGT_PTRS_PER_BLOCK;
+
+       if (likely(idx1 < TGT_PTRS && ltd->ltd_tgts_idx[idx1] != NULL))
+               ltd->ltd_tgts_idx[idx1]->ldi_tgts[idx2] = tgt;
+}
 
 #define LFSCK_STF_BITS 4
 /* If want to adjust the LFSCK_STF_COUNT, please change LFSCK_STF_BITS. */
@@ -1243,7 +1261,7 @@ lfsck_find_dev_by_fid(const struct lu_env *env, struct lfsck_instance *lfsck,
        } else {
                struct lfsck_tgt_desc *ltd;
 
-               ltd = LTD_TGT(&lfsck->li_mdt_descs, idx);
+               ltd = lfsck_ltd2tgt(&lfsck->li_mdt_descs, idx);
                if (unlikely(ltd == NULL))
                        return ERR_PTR(-ENODEV);
 
@@ -1302,7 +1320,7 @@ static inline struct lfsck_tgt_desc *lfsck_tgt_get(struct lfsck_tgt_descs *ltds,
 {
        struct lfsck_tgt_desc *ltd;
 
-       ltd = LTD_TGT(ltds, index);
+       ltd = lfsck_ltd2tgt(ltds, index);
        if (ltd != NULL)
                atomic_inc(&ltd->ltd_ref);
 
index ca1ba12..9569602 100644 (file)
@@ -278,7 +278,7 @@ static void lfsck_layout_assistant_sync_failures(const struct lu_env *env,
 
        down_read(&ltds->ltd_rw_sem);
        cfs_foreach_bit(lad->lad_bitmap, idx) {
-               ltd = LTD_TGT(ltds, idx);
+               ltd = lfsck_ltd2tgt(ltds, idx);
                LASSERT(ltd != NULL);
 
                laia->laia_ltd = ltd;
@@ -5203,7 +5203,7 @@ static int lfsck_layout_master_in_notify(const struct lu_env *env,
        else
                ltds = &lfsck->li_mdt_descs;
        spin_lock(&ltds->ltd_lock);
-       ltd = LTD_TGT(ltds, lr->lr_index);
+       ltd = lfsck_ltd2tgt(ltds, lr->lr_index);
        if (ltd == NULL) {
                spin_unlock(&ltds->ltd_lock);
 
index d301bac..178aa3a 100644 (file)
@@ -149,7 +149,7 @@ static void lfsck_tgt_descs_fini(struct lfsck_tgt_descs *ltds)
        }
 
        cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
-               ltd = LTD_TGT(ltds, idx);
+               ltd = lfsck_ltd2tgt(ltds, idx);
                if (likely(ltd != NULL)) {
                        LASSERT(list_empty(&ltd->ltd_layout_list));
                        LASSERT(list_empty(&ltd->ltd_layout_phase_list));
@@ -158,7 +158,7 @@ static void lfsck_tgt_descs_fini(struct lfsck_tgt_descs *ltds)
 
                        ltds->ltd_tgtnr--;
                        cfs_bitmap_clear(ltds->ltd_tgts_bitmap, idx);
-                       LTD_TGT(ltds, idx) = NULL;
+                       lfsck_assign_tgt(ltds, NULL, idx);
                        lfsck_tgt_put(ltd);
                }
        }
@@ -230,7 +230,7 @@ static int __lfsck_add_target(const struct lu_env *env,
                        GOTO(unlock, rc = -ENOMEM);
        }
 
-       LTD_TGT(ltds, index) = ltd;
+       lfsck_assign_tgt(ltds, ltd, index);
        cfs_bitmap_set(ltds->ltd_tgts_bitmap, index);
        ltds->ltd_tgtnr++;
 
@@ -3512,7 +3512,7 @@ void lfsck_del_target(const struct lu_env *env, struct dt_device *key,
        if (unlikely(index >= ltds->ltd_tgts_bitmap->size))
                goto unlock;
 
-       ltd = LTD_TGT(ltds, index);
+       ltd = lfsck_ltd2tgt(ltds, index);
        if (unlikely(ltd == NULL))
                goto unlock;
 
@@ -3520,7 +3520,7 @@ void lfsck_del_target(const struct lu_env *env, struct dt_device *key,
 
        ltds->ltd_tgtnr--;
        cfs_bitmap_clear(ltds->ltd_tgts_bitmap, index);
-       LTD_TGT(ltds, index) = NULL;
+       lfsck_assign_tgt(ltds, NULL, index);
 
 unlock:
        if (ltd == NULL) {
index 7af4eb6..cbe6661 100644 (file)
@@ -4660,7 +4660,7 @@ log:
               lr->lr_index, lr->lr_status, lr->lr_flags2);
 
        spin_lock(&ltds->ltd_lock);
-       ltd = LTD_TGT(ltds, lr->lr_index);
+       ltd = lfsck_ltd2tgt(ltds, lr->lr_index);
        if (ltd == NULL) {
                spin_unlock(&ltds->ltd_lock);
 
@@ -5113,7 +5113,7 @@ static int lfsck_namespace_assistant_handler_p1(const struct lu_env *env,
                        GOTO(out, rc);
                }
 
-               ltd = LTD_TGT(&lfsck->li_mdt_descs, idx);
+               ltd = lfsck_ltd2tgt(&lfsck->li_mdt_descs, idx);
                if (unlikely(ltd == NULL)) {
                        CDEBUG(D_LFSCK, "%s: cannot talk with MDT %x which "
                               "did not join the namespace LFSCK\n",
@@ -6262,7 +6262,7 @@ static void lfsck_namespace_assistant_sync_failures(const struct lu_env *env,
 
        down_read(&ltds->ltd_rw_sem);
        cfs_foreach_bit(lad->lad_bitmap, idx) {
-               ltd = LTD_TGT(ltds, idx);
+               ltd = lfsck_ltd2tgt(ltds, idx);
                LASSERT(ltd != NULL);
 
                laia->laia_ltd = ltd;
index 8ed965c..7bf4ac0 100644 (file)
@@ -2299,7 +2299,7 @@ int lfsck_namespace_handle_striped_master(const struct lu_env *env,
                        GOTO(out, rc);
                }
 
-               ltd = LTD_TGT(&lfsck->li_mdt_descs, shard_idx);
+               ltd = lfsck_ltd2tgt(&lfsck->li_mdt_descs, shard_idx);
                if (unlikely(ltd == NULL)) {
                        CDEBUG(D_LFSCK, "%s: cannot talk with MDT %x which "
                               "did not join the namespace LFSCK\n",