From: kernel test robot <lkp@intel.com>
To: "Christoph Böhmwalder" <christoph.boehmwalder@linbit.com>,
"Jens Axboe" <axboe@kernel.dk>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org,
"Lars Ellenberg" <lars.ellenberg@linbit.com>,
"Philipp Reisner" <philipp.reisner@linbit.com>,
linux-block@vger.kernel.org,
"Christoph Böhmwalder" <christoph.boehmwalder@linbit.com>
Subject: Re: [PATCH 20/20] drbd: remove BROKEN for DRBD
Date: Sat, 28 Mar 2026 22:20:04 +0800 [thread overview]
Message-ID: <202603282234.zZBLE37a-lkp@intel.com> (raw)
In-Reply-To: <20260327223820.2244227-21-christoph.boehmwalder@linbit.com>
Hi Christoph,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 67807fbaf12719fca46a622d759484652b79c7c3]
url: https://github.com/intel-lab-lkp/linux/commits/Christoph-B-hmwalder/drbd-mark-as-BROKEN-during-DRBD-9-rework/20260328-153634
base: 67807fbaf12719fca46a622d759484652b79c7c3
patch link: https://lore.kernel.org/r/20260327223820.2244227-21-christoph.boehmwalder%40linbit.com
patch subject: [PATCH 20/20] drbd: remove BROKEN for DRBD
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260328/202603282234.zZBLE37a-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260328/202603282234.zZBLE37a-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603282234.zZBLE37a-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/block/drbd/drbd_transport_rdma.c:618:11: warning: variable 'i' set but not used [-Wunused-but-set-variable]
618 | int err, i = 0;
| ^
1 warning generated.
vim +/i +618 drivers/block/drbd/drbd_transport_rdma.c
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 610
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 611
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 612 static int dtr_recv_bio(struct drbd_transport *transport, struct bio_list *bios, size_t size)
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 613 {
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 614 struct dtr_transport *rdma_transport =
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 615 container_of(transport, struct dtr_transport, transport);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 616 struct dtr_stream *rdma_stream = &rdma_transport->stream[DATA_STREAM];
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 617 struct page *page;
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 @618 int err, i = 0;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 619
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 620 if (!dtr_transport_ok(transport))
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 621 return -ECONNRESET;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 622
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 623 // pr_info("%s: in recv_pages, size: %zu\n", rdma_stream->name, size);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 624 TR_ASSERT(transport, rdma_stream->current_rx.bytes_left == 0);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 625 dtr_recycle_rx_desc(transport, DATA_STREAM, &rdma_stream->current_rx.desc, GFP_NOIO);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 626 dtr_refill_rx_desc(rdma_transport, DATA_STREAM);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 627
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 628 while (size) {
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 629 struct dtr_rx_desc *rx_desc = NULL;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 630 long t;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 631
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 632 t = wait_event_interruptible_timeout(rdma_stream->recv_wq,
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 633 dtr_receive_rx_desc(rdma_transport, DATA_STREAM, &rx_desc),
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 634 rdma_stream->recv_timeout);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 635
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 636 if (t <= 0)
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 637 return t == 0 ? -EAGAIN : -EINTR;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 638
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 639 page = rx_desc->page;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 640 /* put_page() if we would get_page() in
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 641 * dtr_create_rx_desc(). but we don't. We return the page
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 642 * chain to the user, which is supposed to give it back to
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 643 * drbd_free_pages() eventually. */
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 644 rx_desc->page = NULL;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 645 size -= rx_desc->size;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 646
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 647 /* If the sender did dtr_send_page every bvec of a bio with
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 648 * unaligned bvecs (as xfs often creates), rx_desc->size and
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 649 * offset may well be not the PAGE_SIZE and 0 we hope for.
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 650 */
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 651
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 652 err = drbd_bio_add_page(transport, bios, page, rx_desc->size, 0);
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 653 if (err < 0)
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 654 return err;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 655
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 656 atomic_dec(&rx_desc->cm->path->flow[DATA_STREAM].rx_descs_allocated);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 657 dtr_free_rx_desc(rx_desc);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 658
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 659 i++;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 660 dtr_refill_rx_desc(rdma_transport, DATA_STREAM);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 661 }
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 662
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 663 // pr_info("%s: rcvd %d pages\n", rdma_stream->name, i);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 664 return 0;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 665 }
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 666
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: "Christoph Böhmwalder" <christoph.boehmwalder@linbit.com>,
"Jens Axboe" <axboe@kernel.dk>
Cc: llvm@lists.linux.dev, linux-kernel@vger.kernel.org,
Philipp Reisner <philipp.reisner@linbit.com>,
linux-block@vger.kernel.org, oe-kbuild-all@lists.linux.dev,
Lars Ellenberg <lars.ellenberg@linbit.com>,
drbd-dev@lists.linbit.com
Subject: Re: [PATCH 20/20] drbd: remove BROKEN for DRBD
Date: Sat, 28 Mar 2026 22:20:04 +0800 [thread overview]
Message-ID: <202603282234.zZBLE37a-lkp@intel.com> (raw)
In-Reply-To: <20260327223820.2244227-21-christoph.boehmwalder@linbit.com>
Hi Christoph,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 67807fbaf12719fca46a622d759484652b79c7c3]
url: https://github.com/intel-lab-lkp/linux/commits/Christoph-B-hmwalder/drbd-mark-as-BROKEN-during-DRBD-9-rework/20260328-153634
base: 67807fbaf12719fca46a622d759484652b79c7c3
patch link: https://lore.kernel.org/r/20260327223820.2244227-21-christoph.boehmwalder%40linbit.com
patch subject: [PATCH 20/20] drbd: remove BROKEN for DRBD
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260328/202603282234.zZBLE37a-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260328/202603282234.zZBLE37a-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603282234.zZBLE37a-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/block/drbd/drbd_transport_rdma.c:618:11: warning: variable 'i' set but not used [-Wunused-but-set-variable]
618 | int err, i = 0;
| ^
1 warning generated.
vim +/i +618 drivers/block/drbd/drbd_transport_rdma.c
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 610
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 611
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 612 static int dtr_recv_bio(struct drbd_transport *transport, struct bio_list *bios, size_t size)
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 613 {
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 614 struct dtr_transport *rdma_transport =
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 615 container_of(transport, struct dtr_transport, transport);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 616 struct dtr_stream *rdma_stream = &rdma_transport->stream[DATA_STREAM];
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 617 struct page *page;
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 @618 int err, i = 0;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 619
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 620 if (!dtr_transport_ok(transport))
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 621 return -ECONNRESET;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 622
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 623 // pr_info("%s: in recv_pages, size: %zu\n", rdma_stream->name, size);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 624 TR_ASSERT(transport, rdma_stream->current_rx.bytes_left == 0);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 625 dtr_recycle_rx_desc(transport, DATA_STREAM, &rdma_stream->current_rx.desc, GFP_NOIO);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 626 dtr_refill_rx_desc(rdma_transport, DATA_STREAM);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 627
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 628 while (size) {
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 629 struct dtr_rx_desc *rx_desc = NULL;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 630 long t;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 631
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 632 t = wait_event_interruptible_timeout(rdma_stream->recv_wq,
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 633 dtr_receive_rx_desc(rdma_transport, DATA_STREAM, &rx_desc),
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 634 rdma_stream->recv_timeout);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 635
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 636 if (t <= 0)
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 637 return t == 0 ? -EAGAIN : -EINTR;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 638
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 639 page = rx_desc->page;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 640 /* put_page() if we would get_page() in
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 641 * dtr_create_rx_desc(). but we don't. We return the page
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 642 * chain to the user, which is supposed to give it back to
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 643 * drbd_free_pages() eventually. */
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 644 rx_desc->page = NULL;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 645 size -= rx_desc->size;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 646
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 647 /* If the sender did dtr_send_page every bvec of a bio with
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 648 * unaligned bvecs (as xfs often creates), rx_desc->size and
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 649 * offset may well be not the PAGE_SIZE and 0 we hope for.
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 650 */
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 651
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 652 err = drbd_bio_add_page(transport, bios, page, rx_desc->size, 0);
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 653 if (err < 0)
221cfdc61a60c9 Christoph Böhmwalder 2026-03-27 654 return err;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 655
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 656 atomic_dec(&rx_desc->cm->path->flow[DATA_STREAM].rx_descs_allocated);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 657 dtr_free_rx_desc(rx_desc);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 658
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 659 i++;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 660 dtr_refill_rx_desc(rdma_transport, DATA_STREAM);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 661 }
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 662
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 663 // pr_info("%s: rcvd %d pages\n", rdma_stream->name, i);
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 664 return 0;
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 665 }
bc43430bc671a7 Christoph Böhmwalder 2026-03-27 666
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2026-03-28 14:20 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-27 22:38 [PATCH 00/20] DRBD 9 rework Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 01/20] drbd: mark as BROKEN during " Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 02/20] drbd: extend wire protocol definitions for DRBD 9 Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-28 14:13 ` kernel test robot
2026-03-28 14:13 ` kernel test robot
2026-03-27 22:38 ` [PATCH 03/20] drbd: introduce DRBD 9 on-disk metadata format Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 04/20] drbd: add transport layer abstraction Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 05/20] drbd: add TCP transport implementation Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 06/20] drbd: add RDMA " Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-04-08 5:42 ` Christoph Hellwig
2026-04-08 5:42 ` Christoph Hellwig
2026-04-08 12:01 ` Christoph Böhmwalder
2026-04-08 12:01 ` Christoph Böhmwalder
2026-04-12 16:36 ` Leon Romanovsky
2026-03-27 22:38 ` [PATCH 07/20] drbd: add load-balancing TCP transport Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 08/20] drbd: add DAX/PMEM support for metadata access Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-04-08 5:46 ` Christoph Hellwig
2026-04-08 5:46 ` Christoph Hellwig
2026-03-27 22:38 ` [PATCH 09/20] drbd: add optional compatibility layer for DRBD 8.4 Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 10/20] drbd: rename drbd_worker.c to drbd_sender.c Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 11/20] drbd: rework sender for DRBD 9 multi-peer Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 12/20] drbd: replace per-device state model with multi-peer data structures Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 13/20] drbd: rewrite state machine for DRBD 9 multi-peer clusters Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 14/20] drbd: rework activity log and bitmap for multi-peer replication Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 15/20] drbd: rework request processing for DRBD 9 multi-peer IO Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 16/20] drbd: rework module core for DRBD 9 transport and multi-peer Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 17/20] drbd: rework receiver for DRBD 9 transport and multi-peer protocol Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 18/20] drbd: rework netlink management interface for DRBD 9 Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 19/20] drbd: update monitoring interfaces for multi-peer topology Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-27 22:38 ` [PATCH 20/20] drbd: remove BROKEN for DRBD Christoph Böhmwalder
2026-03-27 22:38 ` Christoph Böhmwalder
2026-03-28 12:21 ` kernel test robot
2026-03-28 12:21 ` kernel test robot
2026-03-28 14:20 ` kernel test robot [this message]
2026-03-28 14:20 ` kernel test robot
2026-04-03 1:30 ` [PATCH 00/20] DRBD 9 rework Jens Axboe
2026-04-03 1:30 ` Jens Axboe
2026-04-03 13:24 ` Christoph Böhmwalder
2026-04-03 13:24 ` Christoph Böhmwalder
2026-04-03 13:26 ` Jens Axboe
2026-04-08 5:17 ` Christoph Hellwig
2026-04-08 5:17 ` Christoph Hellwig
2026-04-08 12:58 ` Jens Axboe
2026-04-08 12:58 ` Jens Axboe
2026-04-09 6:40 ` Christoph Hellwig
2026-04-09 6:40 ` Christoph Hellwig
2026-04-10 1:14 ` Jens Axboe
2026-04-10 1:14 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202603282234.zZBLE37a-lkp@intel.com \
--to=lkp@intel.com \
--cc=axboe@kernel.dk \
--cc=christoph.boehmwalder@linbit.com \
--cc=drbd-dev@lists.linbit.com \
--cc=lars.ellenberg@linbit.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=philipp.reisner@linbit.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.