/* Skip intervals with no intersection */ if (bre_end < start) continue; if (bre->start > clr_end) continue; /* Delete completely overlapped badrange entries */ if ((bre->start >= start) && (bre_end <= clr_end)) {
list_del(&bre->list);
kfree(bre); continue;
} /* Adjust start point of partially cleared entries */ if ((start <= bre->start) && (clr_end > bre->start)) {
bre->length -= clr_end - bre->start + 1;
bre->start = clr_end + 1; continue;
} /* Adjust bre->length for partial clearing at the tail end */ if ((bre->start < start) && (bre_end <= clr_end)) { /* bre->start remains the same */
bre->length = start - bre->start; continue;
} /* *Ifclearinginthemiddleofanentry,wesplititinto *twobymodifyingthecurrententrytorepresentonehalfof *thesplit,andaddinganewentryforthesecondhalf.
*/ if ((bre->start < start) && (bre_end > clr_end)) {
u64 new_start = clr_end + 1;
u64 new_len = bre_end - new_start + 1;
/* Add new entry covering the right half */
alloc_and_append_badrange_entry(badrange, new_start,
new_len, GFP_NOWAIT); /* Adjust this entry to cover the left half */
bre->length = start - bre->start; continue;
}
}
spin_unlock(&badrange->lock);
}
EXPORT_SYMBOL_GPL(badrange_forget);
staticvoid set_badblock(struct badblocks *bb, sector_t s, int num)
{
dev_dbg(bb->dev, "Found a bad range (0x%llx, 0x%llx)\n",
(u64) s * 512, (u64) num * 512); /* this isn't an error as the hardware will still throw an exception */ if (!badblocks_set(bb, s, num, 1))
dev_info_once(bb->dev, "%s: failed for sector %llx\n",
__func__, (u64) s);
}
/* Discard intervals with no intersection */ if (bre_end < range->start) continue; if (bre->start > range->end) continue; /* Deal with any overlap after start of the namespace */ if (bre->start >= range->start) {
u64 start = bre->start;
u64 len;
if (bre_end <= range->end)
len = bre->length; else
len = range->start + range_len(range)
- bre->start;
__add_badblock_range(bb, start - range->start, len); continue;
} /* *Dealwithoverlapforbadrangestartingbefore *thenamespace.
*/ if (bre->start < range->start) {
u64 len;
if (bre_end < range->end)
len = bre->start + bre->length - range->start; else
len = range_len(range);
__add_badblock_range(bb, 0, len);
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.