History

Merge tag 'block-5.19-2022-07-01' of git://git.kernel.dk/linux-block

Pull block fixes from Jens Axboe: - Fix for batch getting of tags in sbitmap (wuchi) - NVMe pull request via Christoph: - More quirks (Lamarque Vieira Souza, Pablo Greco) - Fix a fabrics disconnect regression (Ruozhu Li) - Fix a nvmet-tcp data_digest calculation regression (Sagi Grimberg) - Fix nvme-tcp send failure handling (Sagi Grimberg) - Fix a regression with nvmet-loop and passthrough controllers (Alan Adamson) * tag 'block-5.19-2022-07-01' of git://git.kernel.dk/linux-block: nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA IM2P33F8ABR1 nvmet: add a clear_ids attribute for passthru targets nvme: fix regression when disconnect a recovering ctrl nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA XPG SX6000LNP (AKA SPECTRIX S40G) nvme-tcp: always fail a request when sending it failed nvmet-tcp: fix regression in data_digest calculation lib/sbitmap: Fix invalid loop in __sbitmap_queue_get_batch()

Linus Torvalds committed 4 years ago

Commit d516e222 parents 067c227 f3163d811 files · +113 −30Browse files

Showing the changes to lib (1 of 11 files). Show all

Unified · Split

lib/sbitmap.c+4−1
@@ -528,7 +528,7 @@ unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags, · 527 unmodified lines
528528
529529 sbitmap_deferred_clear(map);
530530 if (map->word == (1UL << (map_depth - 1)) - 1)
531− continue;
531+ goto next;
532532
533533 nr = find_first_zero_bit(&map->word, map_depth);
534534 if (nr + nr_tags <= map_depth) {
@@ -539,6 +539,8 @@ unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags, · 4 unmodified lines
539539 get_mask = ((1UL << map_tags) - 1) << nr;
540540 do {
541541 val = READ_ONCE(map->word);
542+ if ((val & ~get_mask) != val)
543+ goto next;
542544 ret = atomic_long_cmpxchg(ptr, val, get_mask | val);
543545 } while (ret != val);
544546 get_mask = (get_mask & ~ret) >> nr;
@@ -549,6 +551,7 @@ unsigned long __sbitmap_queue_get_batch(struct sbitmap_queue *sbq, int nr_tags, · 4 unmodified lines
549551 return get_mask;
550552 }
551553 }
554+next:
552555 /* Jump to next index. */
553556 if (++index >= sb->map_nr)
554557 index = 0;