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>
spin_lock(<ds->ltd_lock);
if (com->lc_type == LFSCK_TYPE_LAYOUT) {
cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
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))
LASSERT(ltd != NULL);
if (!list_empty(<d->ltd_layout_list))
}
} else {
cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
}
} 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))
LASSERT(ltd != NULL);
if (!list_empty(<d->ltd_namespace_list))
-#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. */
#define LFSCK_STF_BITS 4
/* If want to adjust the LFSCK_STF_COUNT, please change LFSCK_STF_BITS. */
} else {
struct lfsck_tgt_desc *ltd;
} 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);
if (unlikely(ltd == NULL))
return ERR_PTR(-ENODEV);
{
struct lfsck_tgt_desc *ltd;
{
struct lfsck_tgt_desc *ltd;
- ltd = LTD_TGT(ltds, index);
+ ltd = lfsck_ltd2tgt(ltds, index);
if (ltd != NULL)
atomic_inc(<d->ltd_ref);
if (ltd != NULL)
atomic_inc(<d->ltd_ref);
down_read(<ds->ltd_rw_sem);
cfs_foreach_bit(lad->lad_bitmap, idx) {
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;
LASSERT(ltd != NULL);
laia->laia_ltd = ltd;
else
ltds = &lfsck->li_mdt_descs;
spin_lock(<ds->ltd_lock);
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);
if (ltd == NULL) {
spin_unlock(<ds->ltd_lock);
}
cfs_foreach_bit(ltds->ltd_tgts_bitmap, idx) {
}
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));
if (likely(ltd != NULL)) {
LASSERT(list_empty(<d->ltd_layout_list));
LASSERT(list_empty(<d->ltd_layout_phase_list));
ltds->ltd_tgtnr--;
cfs_bitmap_clear(ltds->ltd_tgts_bitmap, idx);
ltds->ltd_tgtnr--;
cfs_bitmap_clear(ltds->ltd_tgts_bitmap, idx);
- LTD_TGT(ltds, idx) = NULL;
+ lfsck_assign_tgt(ltds, NULL, idx);
GOTO(unlock, rc = -ENOMEM);
}
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++;
cfs_bitmap_set(ltds->ltd_tgts_bitmap, index);
ltds->ltd_tgtnr++;
if (unlikely(index >= ltds->ltd_tgts_bitmap->size))
goto unlock;
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;
if (unlikely(ltd == NULL))
goto unlock;
ltds->ltd_tgtnr--;
cfs_bitmap_clear(ltds->ltd_tgts_bitmap, index);
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) {
unlock:
if (ltd == NULL) {
lr->lr_index, lr->lr_status, lr->lr_flags2);
spin_lock(<ds->ltd_lock);
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);
if (ltd == NULL) {
spin_unlock(<ds->ltd_lock);
- 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",
if (unlikely(ltd == NULL)) {
CDEBUG(D_LFSCK, "%s: cannot talk with MDT %x which "
"did not join the namespace LFSCK\n",
down_read(<ds->ltd_rw_sem);
cfs_foreach_bit(lad->lad_bitmap, idx) {
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;
LASSERT(ltd != NULL);
laia->laia_ltd = ltd;
- 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",
if (unlikely(ltd == NULL)) {
CDEBUG(D_LFSCK, "%s: cannot talk with MDT %x which "
"did not join the namespace LFSCK\n",