From 5e7082318fb078b1b7830a592ffd3564324e15d2 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Wed, 8 Apr 2015 21:41:53 +0800 Subject: [PATCH] LU-4615 lfsck: verify index before locating target descriptor 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 Change-Id: I83ead7077885b6fc73bc56361725724d087c1957 Reviewed-on: http://review.whamcloud.com/14189 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Alex Zhuravlev Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_engine.c | 4 ++-- lustre/lfsck/lfsck_internal.h | 32 +++++++++++++++++++++++++------- lustre/lfsck/lfsck_layout.c | 4 ++-- lustre/lfsck/lfsck_lib.c | 10 +++++----- lustre/lfsck/lfsck_namespace.c | 6 +++--- lustre/lfsck/lfsck_striped_dir.c | 2 +- 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/lustre/lfsck/lfsck_engine.c b/lustre/lfsck/lfsck_engine.c index 375e64c..afcbb9b 100644 --- a/lustre/lfsck/lfsck_engine.c +++ b/lustre/lfsck/lfsck_engine.c @@ -1381,7 +1381,7 @@ next: spin_lock(<ds->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(<d->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(<d->ltd_namespace_list)) diff --git a/lustre/lfsck/lfsck_internal.h b/lustre/lfsck/lfsck_internal.h index 7945769..4abe593 100644 --- a/lustre/lfsck/lfsck_internal.h +++ b/lustre/lfsck/lfsck_internal.h @@ -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(<d->ltd_ref); diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index ca1ba12..9569602 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -278,7 +278,7 @@ static void lfsck_layout_assistant_sync_failures(const struct lu_env *env, down_read(<ds->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(<ds->ltd_lock); - ltd = LTD_TGT(ltds, lr->lr_index); + ltd = lfsck_ltd2tgt(ltds, lr->lr_index); if (ltd == NULL) { spin_unlock(<ds->ltd_lock); diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index d301bac..178aa3a 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -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(<d->ltd_layout_list)); LASSERT(list_empty(<d->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) { diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index 7af4eb6..cbe6661 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -4660,7 +4660,7 @@ log: lr->lr_index, lr->lr_status, lr->lr_flags2); spin_lock(<ds->ltd_lock); - ltd = LTD_TGT(ltds, lr->lr_index); + ltd = lfsck_ltd2tgt(ltds, lr->lr_index); if (ltd == NULL) { spin_unlock(<ds->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(<ds->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; diff --git a/lustre/lfsck/lfsck_striped_dir.c b/lustre/lfsck/lfsck_striped_dir.c index 8ed965c..7bf4ac0 100644 --- a/lustre/lfsck/lfsck_striped_dir.c +++ b/lustre/lfsck/lfsck_striped_dir.c @@ -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", -- 1.8.3.1