All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event
@ 2013-03-21 12:07 Michael S. Tsirkin
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 1/3] qdev: " Michael S. Tsirkin
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-03-21 12:07 UTC (permalink / raw)
  To: Anthony Liguori, Markus Armbruster
  Cc: Kevin Wolf, Eduardo Habkost, libvir-list, Stefan Hajnoczi,
	qemu-devel, Luiz Capitulino, Gerd Hoffmann, Paolo Bonzini,
	afaerber

libvirt has a long-standing bug: when removing the device,
it can request removal but does not know when the
removal completes. Add an event so we can fix this in a robust way.

First patch only adds the event with ID, second patch adds a path field.
Split this way for ease of backport (stable downstreams without QOM
would want to only take the first patch).
Event without fields is still useful as management can use it to
poll device list to figure out which device was removed.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

If there are no more comments I'll stick this on my
pci branch.

Changes from v8:
    - reorder qom destruction so no need to change unparent 

Changes from v7:
    - none, v7 was malformed series sent by mistake

Changes from v6:
    - make empty event use data: {}, Markus prefers this

Changes from v5:
    - Emit an empty event on unnamed devices in patch 1/3, as suggested by Markus

Changes from v4:
    - Add extra triggers and extra fields as requested by Markus

Changes from v3:
    - Document that we only emit events for devices with
      and ID, as suggested by Markus
Changes from v2:
    - move event toward the end of device_unparent,
      so that parents are reported after their children,
      as suggested by Paolo
Changes from v1:
    - move to device_unparent
    - address comments by Andreas and Eric


-- 
Anthony Liguori


Michael S. Tsirkin (3):
  qdev: DEVICE_DELETED event
  qom: call class destructor before unparent
  qmp: add path to device_deleted event

 QMP/qmp-events.txt        | 18 ++++++++++++++++++
 hw/qdev.c                 | 14 ++++++++++++++
 include/monitor/monitor.h |  1 +
 monitor.c                 |  1 +
 qapi-schema.json          |  4 +++-
 qom/object.c              |  6 +++---
 6 files changed, 40 insertions(+), 4 deletions(-)

-- 
MST

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 1/3] qdev: DEVICE_DELETED event
  2013-03-21 12:07 [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Michael S. Tsirkin
@ 2013-03-21 12:07 ` Michael S. Tsirkin
  2013-03-21 12:22   ` Markus Armbruster
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent Michael S. Tsirkin
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-03-21 12:07 UTC (permalink / raw)
  To: Anthony Liguori, Markus Armbruster
  Cc: Kevin Wolf, Eduardo Habkost, libvir-list, Stefan Hajnoczi,
	qemu-devel, Luiz Capitulino, Gerd Hoffmann, Paolo Bonzini,
	afaerber

libvirt has a long-standing bug: when removing the device,
it can request removal but does not know when the
removal completes. Add an event so we can fix this in a robust way.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 QMP/qmp-events.txt        | 16 ++++++++++++++++
 hw/qdev.c                 | 11 +++++++++++
 include/monitor/monitor.h |  1 +
 monitor.c                 |  1 +
 qapi-schema.json          |  4 +++-
 5 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
index b2698e4..24cf3e8 100644
--- a/QMP/qmp-events.txt
+++ b/QMP/qmp-events.txt
@@ -136,6 +136,22 @@ Example:
 Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR
 event.
 
+DEVICE_DELETED
+-----------------
+
+Emitted whenever the device removal completion is acknowledged
+by the guest.
+At this point, it's safe to reuse the specified device ID.
+Device removal can be initiated by the guest or by HMP/QMP commands.
+
+Data:
+
+- "device": device name (json-string, optional)
+
+{ "event": "DEVICE_DELETED",
+  "data": { "device": "virtio-net-pci-0" },
+  "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
+
 DEVICE_TRAY_MOVED
 -----------------
 
diff --git a/hw/qdev.c b/hw/qdev.c
index 0b20280..5e8a89c 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -30,6 +30,8 @@
 #include "qapi/error.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/visitor.h"
+#include "qapi/qmp/qjson.h"
+#include "monitor/monitor.h"
 
 int qdev_hotplug = 0;
 static bool qdev_hot_added = false;
@@ -761,6 +763,7 @@ static void device_unparent(Object *obj)
     DeviceState *dev = DEVICE(obj);
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
     BusState *bus;
+    QObject *event_data;
 
     while (dev->num_child_bus) {
         bus = QLIST_FIRST(&dev->child_bus);
@@ -779,6 +782,14 @@ static void device_unparent(Object *obj)
         object_unref(OBJECT(dev->parent_bus));
         dev->parent_bus = NULL;
     }
+
+    if (dev->id) {
+        event_data = qobject_from_jsonf("{ 'device': %s }", dev->id);
+    } else {
+        event_data = qobject_from_jsonf("{ }");
+    }
+    monitor_protocol_event(QEVENT_DEVICE_DELETED, event_data);
+    qobject_decref(event_data);
 }
 
 static void device_class_init(ObjectClass *class, void *data)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 87fb49c..b868760 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -39,6 +39,7 @@ typedef enum MonitorEvent {
     QEVENT_BLOCK_JOB_CANCELLED,
     QEVENT_BLOCK_JOB_ERROR,
     QEVENT_BLOCK_JOB_READY,
+    QEVENT_DEVICE_DELETED,
     QEVENT_DEVICE_TRAY_MOVED,
     QEVENT_SUSPEND,
     QEVENT_SUSPEND_DISK,
diff --git a/monitor.c b/monitor.c
index 112e920..2fdfb79 100644
--- a/monitor.c
+++ b/monitor.c
@@ -458,6 +458,7 @@ static const char *monitor_event_names[] = {
     [QEVENT_BLOCK_JOB_CANCELLED] = "BLOCK_JOB_CANCELLED",
     [QEVENT_BLOCK_JOB_ERROR] = "BLOCK_JOB_ERROR",
     [QEVENT_BLOCK_JOB_READY] = "BLOCK_JOB_READY",
+    [QEVENT_DEVICE_DELETED] = "DEVICE_DELETED",
     [QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
     [QEVENT_SUSPEND] = "SUSPEND",
     [QEVENT_SUSPEND_DISK] = "SUSPEND_DISK",
diff --git a/qapi-schema.json b/qapi-schema.json
index fdaa9da..080dc39 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2354,7 +2354,9 @@
 # Notes: When this command completes, the device may not be removed from the
 #        guest.  Hot removal is an operation that requires guest cooperation.
 #        This command merely requests that the guest begin the hot removal
-#        process.
+#        process.  Completion of the device removal process is signaled with a
+#        DEVICE_DELETED event. Guest reset will automatically complete removal
+#        for all devices.
 #
 # Since: 0.14.0
 ##
-- 
MST

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent
  2013-03-21 12:07 [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Michael S. Tsirkin
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 1/3] qdev: " Michael S. Tsirkin
@ 2013-03-21 12:07 ` Michael S. Tsirkin
  2013-03-21 12:25   ` Paolo Bonzini
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event Michael S. Tsirkin
  2013-03-21 12:57 ` [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Andreas Färber
  3 siblings, 1 reply; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-03-21 12:07 UTC (permalink / raw)
  To: Anthony Liguori, Markus Armbruster
  Cc: Kevin Wolf, Eduardo Habkost, libvir-list, Stefan Hajnoczi,
	qemu-devel, Luiz Capitulino, Gerd Hoffmann, Paolo Bonzini,
	afaerber

Make sure object is valid when destructor is called.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 qom/object.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index 3d638ff..a0e3cbe 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -363,12 +363,12 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp)
 void object_unparent(Object *obj)
 {
     object_ref(obj);
-    if (obj->parent) {
-        object_property_del_child(obj->parent, obj, NULL);
-    }
     if (obj->class->unparent) {
         (obj->class->unparent)(obj);
     }
+    if (obj->parent) {
+        object_property_del_child(obj->parent, obj, NULL);
+    }
     object_unref(obj);
 }
 
-- 
MST

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event
  2013-03-21 12:07 [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Michael S. Tsirkin
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 1/3] qdev: " Michael S. Tsirkin
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent Michael S. Tsirkin
@ 2013-03-21 12:07 ` Michael S. Tsirkin
  2013-03-21 12:23   ` Markus Armbruster
  2013-03-21 12:57 ` [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Andreas Färber
  3 siblings, 1 reply; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-03-21 12:07 UTC (permalink / raw)
  To: Anthony Liguori, Markus Armbruster
  Cc: Kevin Wolf, Eduardo Habkost, libvir-list, Stefan Hajnoczi,
	qemu-devel, Luiz Capitulino, Gerd Hoffmann, Paolo Bonzini,
	afaerber

Add QOM path to device deleted event.  It now becomes useful to report
it for devices which don't have an ID assigned.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 QMP/qmp-events.txt | 4 +++-
 hw/qdev.c          | 7 +++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
index 24cf3e8..dcc826d 100644
--- a/QMP/qmp-events.txt
+++ b/QMP/qmp-events.txt
@@ -147,9 +147,11 @@ Device removal can be initiated by the guest or by HMP/QMP commands.
 Data:
 
 - "device": device name (json-string, optional)
+- "path": device path (json-string)
 
 { "event": "DEVICE_DELETED",
-  "data": { "device": "virtio-net-pci-0" },
+  "data": { "device": "virtio-net-pci-0",
+            "path": "/machine/peripheral/virtio-net-pci-0" },
   "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
 
 DEVICE_TRAY_MOVED
diff --git a/hw/qdev.c b/hw/qdev.c
index 5e8a89c..0cdf568 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -764,6 +764,7 @@ static void device_unparent(Object *obj)
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
     BusState *bus;
     QObject *event_data;
+    gchar *path = object_get_canonical_path(obj);
 
     while (dev->num_child_bus) {
         bus = QLIST_FIRST(&dev->child_bus);
@@ -784,12 +785,14 @@ static void device_unparent(Object *obj)
     }
 
     if (dev->id) {
-        event_data = qobject_from_jsonf("{ 'device': %s }", dev->id);
+        event_data = qobject_from_jsonf("{ 'device': %s, 'path': %s }",
+                                        dev->id, path);
     } else {
-        event_data = qobject_from_jsonf("{ }");
+        event_data = qobject_from_jsonf("{ 'path': %s }", path);
     }
     monitor_protocol_event(QEVENT_DEVICE_DELETED, event_data);
     qobject_decref(event_data);
+    g_free(path);
 }
 
 static void device_class_init(ObjectClass *class, void *data)
-- 
MST

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 1/3] qdev: DEVICE_DELETED event
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 1/3] qdev: " Michael S. Tsirkin
@ 2013-03-21 12:22   ` Markus Armbruster
  0 siblings, 0 replies; 10+ messages in thread
From: Markus Armbruster @ 2013-03-21 12:22 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, qemu-devel, Luiz Capitulino, Gerd Hoffmann,
	Paolo Bonzini, afaerber

"Michael S. Tsirkin" <mst@redhat.com> writes:

> libvirt has a long-standing bug: when removing the device,
> it can request removal but does not know when the
> removal completes. Add an event so we can fix this in a robust way.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

Acked-by: Markus Armbruster <armbru@redhat.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event Michael S. Tsirkin
@ 2013-03-21 12:23   ` Markus Armbruster
  0 siblings, 0 replies; 10+ messages in thread
From: Markus Armbruster @ 2013-03-21 12:23 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, qemu-devel, Luiz Capitulino, Gerd Hoffmann,
	Paolo Bonzini, afaerber

"Michael S. Tsirkin" <mst@redhat.com> writes:

> Add QOM path to device deleted event.  It now becomes useful to report
> it for devices which don't have an ID assigned.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

Acked-by: Markus Armbruster <armbru@redhat.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent Michael S. Tsirkin
@ 2013-03-21 12:25   ` Paolo Bonzini
  2013-03-21 12:30     ` Michael S. Tsirkin
  0 siblings, 1 reply; 10+ messages in thread
From: Paolo Bonzini @ 2013-03-21 12:25 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, Markus Armbruster, qemu-devel, Gerd Hoffmann,
	Luiz Capitulino, afaerber

Il 21/03/2013 13:07, Michael S. Tsirkin ha scritto:
> Make sure object is valid when destructor is called.

"Make sure the object still has a canonical path while the unparent
callback is running".

Otherwise, the series looks good.

Paolo

> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>  qom/object.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/qom/object.c b/qom/object.c
> index 3d638ff..a0e3cbe 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -363,12 +363,12 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp)
>  void object_unparent(Object *obj)
>  {
>      object_ref(obj);
> -    if (obj->parent) {
> -        object_property_del_child(obj->parent, obj, NULL);
> -    }
>      if (obj->class->unparent) {
>          (obj->class->unparent)(obj);
>      }
> +    if (obj->parent) {
> +        object_property_del_child(obj->parent, obj, NULL);
> +    }
>      object_unref(obj);
>  }
>  
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent
  2013-03-21 12:25   ` Paolo Bonzini
@ 2013-03-21 12:30     ` Michael S. Tsirkin
  2013-03-21 12:47       ` Paolo Bonzini
  0 siblings, 1 reply; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-03-21 12:30 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, Markus Armbruster, qemu-devel, Gerd Hoffmann,
	Luiz Capitulino, afaerber

On Thu, Mar 21, 2013 at 01:25:50PM +0100, Paolo Bonzini wrote:
> Il 21/03/2013 13:07, Michael S. Tsirkin ha scritto:
> > Make sure object is valid when destructor is called.
> 
> "Make sure the object still has a canonical path while the unparent
> callback is running".
> 
> Otherwise, the series looks good.
> 
> Paolo

Worth respinning for?

> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  qom/object.c | 6 +++---
> >  1 file changed, 3 insertions(+), 3 deletions(-)
> > 
> > diff --git a/qom/object.c b/qom/object.c
> > index 3d638ff..a0e3cbe 100644
> > --- a/qom/object.c
> > +++ b/qom/object.c
> > @@ -363,12 +363,12 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp)
> >  void object_unparent(Object *obj)
> >  {
> >      object_ref(obj);
> > -    if (obj->parent) {
> > -        object_property_del_child(obj->parent, obj, NULL);
> > -    }
> >      if (obj->class->unparent) {
> >          (obj->class->unparent)(obj);
> >      }
> > +    if (obj->parent) {
> > +        object_property_del_child(obj->parent, obj, NULL);
> > +    }
> >      object_unref(obj);
> >  }
> >  
> > 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent
  2013-03-21 12:30     ` Michael S. Tsirkin
@ 2013-03-21 12:47       ` Paolo Bonzini
  0 siblings, 0 replies; 10+ messages in thread
From: Paolo Bonzini @ 2013-03-21 12:47 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, Markus Armbruster, qemu-devel, Gerd Hoffmann,
	Luiz Capitulino, afaerber

Il 21/03/2013 13:30, Michael S. Tsirkin ha scritto:
> On Thu, Mar 21, 2013 at 01:25:50PM +0100, Paolo Bonzini wrote:
> > Il 21/03/2013 13:07, Michael S. Tsirkin ha scritto:
> > > Make sure object is valid when destructor is called.
> > 
> > "Make sure the object still has a canonical path while the unparent
> > callback is running".
> > 
> > Otherwise, the series looks good.
> > 
> 
> Worth respinning for?

If it goes through the pci branch, of course not but still make the
change.  Otherwise, probably not.

Paolo

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event
  2013-03-21 12:07 [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Michael S. Tsirkin
                   ` (2 preceding siblings ...)
  2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event Michael S. Tsirkin
@ 2013-03-21 12:57 ` Andreas Färber
  3 siblings, 0 replies; 10+ messages in thread
From: Andreas Färber @ 2013-03-21 12:57 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Kevin Wolf, Anthony Liguori, Eduardo Habkost, libvir-list,
	Stefan Hajnoczi, Markus Armbruster, qemu-devel, Gerd Hoffmann,
	Paolo Bonzini, Luiz Capitulino

Am 21.03.2013 13:07, schrieb Michael S. Tsirkin:
> Changes from v8:
>     - reorder qom destruction so no need to change unparent 
> 
> Changes from v7:
>     - none, v7 was malformed series sent by mistake
> 
> Changes from v6:
>     - make empty event use data: {}, Markus prefers this
> 
> Changes from v5:
>     - Emit an empty event on unnamed devices in patch 1/3, as suggested by Markus
> 
> Changes from v4:
>     - Add extra triggers and extra fields as requested by Markus

Series looks good,

Reviewed-by: Andreas Färber <afaerber@suse.de>

Andreas

> 
> Changes from v3:
>     - Document that we only emit events for devices with
>       and ID, as suggested by Markus
> Changes from v2:
>     - move event toward the end of device_unparent,
>       so that parents are reported after their children,
>       as suggested by Paolo
> Changes from v1:
>     - move to device_unparent
>     - address comments by Andreas and Eric

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-03-21 12:57 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-21 12:07 [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Michael S. Tsirkin
2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 1/3] qdev: " Michael S. Tsirkin
2013-03-21 12:22   ` Markus Armbruster
2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 2/3] qom: call class destructor before unparent Michael S. Tsirkin
2013-03-21 12:25   ` Paolo Bonzini
2013-03-21 12:30     ` Michael S. Tsirkin
2013-03-21 12:47       ` Paolo Bonzini
2013-03-21 12:07 ` [Qemu-devel] [PATCH v9 3/3] qmp: add path to device_deleted event Michael S. Tsirkin
2013-03-21 12:23   ` Markus Armbruster
2013-03-21 12:57 ` [Qemu-devel] [PATCH v9 0/3] DEVICE_DELETED event Andreas Färber

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.