* [PATCH 0/3] scsi: pollable 'state' attribute
@ 2017-08-10 7:05 Hannes Reinecke
2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Hannes Reinecke @ 2017-08-10 7:05 UTC (permalink / raw)
To: Martin K. Petersen
Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke
Hi all,
here's a small patchset to make the 'state' device attribute pollable.
It was supposed to be a small patch, but tnen hch suggested a rework
and I found a missing state transition.
So there you go.
Hannes Reinecke (3):
scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE
scsi_lib: rework scsi_internal_device_unblock_nowait()
scsi: make 'state' device attribute pollable
drivers/scsi/scsi_lib.c | 22 ++++++++++++++++------
drivers/scsi/scsi_transport_srp.c | 5 ++++-
2 files changed, 20 insertions(+), 7 deletions(-)
--
1.8.5.6
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE 2017-08-10 7:05 [PATCH 0/3] scsi: pollable 'state' attribute Hannes Reinecke @ 2017-08-10 7:05 ` Hannes Reinecke 2017-08-10 7:09 ` Johannes Thumshirn ` (2 more replies) 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke 2017-08-10 7:05 ` [PATCH 3/3] scsi: make 'state' device attribute pollable Hannes Reinecke 2 siblings, 3 replies; 12+ messages in thread From: Hannes Reinecke @ 2017-08-10 7:05 UTC (permalink / raw) To: Martin K. Petersen Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke, Hannes Reinecke scsi_internal_device_unblock_nowait() allows a state transition SDEV_CREATED_BLOCK -> SDEV_TRANSPORT_OFFLINE/SDEV_OFFLINE, scsi_device_set_state() does not. So add the missing state transition to scsi_device_set_state(). Signed-off-by: Hannes Reinecke <hare@suse.com> --- drivers/scsi/scsi_lib.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 41c19c7..1ae531b 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2599,6 +2599,7 @@ void scsi_exit_queue(void) case SDEV_RUNNING: case SDEV_QUIESCE: case SDEV_BLOCK: + case SDEV_CREATED_BLOCK: break; default: goto illegal; -- 1.8.5.6 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke @ 2017-08-10 7:09 ` Johannes Thumshirn 2017-08-10 9:26 ` Christoph Hellwig 2017-08-10 14:31 ` James Bottomley 2 siblings, 0 replies; 12+ messages in thread From: Johannes Thumshirn @ 2017-08-10 7:09 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke Looks good, Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> -- Johannes Thumshirn Storage jthumshirn@suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke 2017-08-10 7:09 ` Johannes Thumshirn @ 2017-08-10 9:26 ` Christoph Hellwig 2017-08-10 14:31 ` James Bottomley 2 siblings, 0 replies; 12+ messages in thread From: Christoph Hellwig @ 2017-08-10 9:26 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke 2017-08-10 7:09 ` Johannes Thumshirn 2017-08-10 9:26 ` Christoph Hellwig @ 2017-08-10 14:31 ` James Bottomley 2 siblings, 0 replies; 12+ messages in thread From: James Bottomley @ 2017-08-10 14:31 UTC (permalink / raw) To: Hannes Reinecke, Martin K. Petersen Cc: Christoph Hellwig, linux-scsi, Hannes Reinecke On Thu, 2017-08-10 at 09:05 +0200, Hannes Reinecke wrote: > scsi_internal_device_unblock_nowait() allows a state transition > SDEV_CREATED_BLOCK -> SDEV_TRANSPORT_OFFLINE/SDEV_OFFLINE, > scsi_device_set_state() does not. > So add the missing state transition to scsi_device_set_state(). > > Signed-off-by: Hannes Reinecke <hare@suse.com> > --- > drivers/scsi/scsi_lib.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c > index 41c19c7..1ae531b 100644 > --- a/drivers/scsi/scsi_lib.c > +++ b/drivers/scsi/scsi_lib.c > @@ -2599,6 +2599,7 @@ void scsi_exit_queue(void) > case SDEV_RUNNING: > case SDEV_QUIESCE: > case SDEV_BLOCK: > + case SDEV_CREATED_BLOCK: > break; > default: > goto illegal; This isn't quite good enough: a device that went CREATE_BLOCK -> OFFLINE, the queue will still be stopped meaning I/O will pile up in it forever and it won't restart when the device is brought online. It we need to set the queue running again so that the now offline device errors all pending I/O. It looks like this is a bug in BLOCK->OFFLINE too. We can't simply call scsi_start_queue() from within scsi_device_set_state() because we may have a lock recursion problem, so we might have to introduce a new state that allows the queue to be restarted in the caller. James ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() 2017-08-10 7:05 [PATCH 0/3] scsi: pollable 'state' attribute Hannes Reinecke 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke @ 2017-08-10 7:05 ` Hannes Reinecke 2017-08-10 7:11 ` Johannes Thumshirn ` (2 more replies) 2017-08-10 7:05 ` [PATCH 3/3] scsi: make 'state' device attribute pollable Hannes Reinecke 2 siblings, 3 replies; 12+ messages in thread From: Hannes Reinecke @ 2017-08-10 7:05 UTC (permalink / raw) To: Martin K. Petersen Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke, Hannes Reinecke Rework scsi_internal_device_unblock_nowait() into using a switch statement. No functional changes. Signed-off-by: Hannes Reinecke <hare@suse.com> --- drivers/scsi/scsi_lib.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 1ae531b..035aa4c 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -3074,19 +3074,25 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev, * Try to transition the scsi device to SDEV_RUNNING or one of the * offlined states and goose the device queue if successful. */ - if ((sdev->sdev_state == SDEV_BLOCK) || - (sdev->sdev_state == SDEV_TRANSPORT_OFFLINE)) + switch (sdev->sdev_state) { + case SDEV_BLOCK: + case SDEV_TRANSPORT_OFFLINE: sdev->sdev_state = new_state; - else if (sdev->sdev_state == SDEV_CREATED_BLOCK) { + break; + case SDEV_CREATED_BLOCK: if (new_state == SDEV_TRANSPORT_OFFLINE || new_state == SDEV_OFFLINE) sdev->sdev_state = new_state; else sdev->sdev_state = SDEV_CREATED; - } else if (sdev->sdev_state != SDEV_CANCEL && - sdev->sdev_state != SDEV_OFFLINE) + break; + case SDEV_TRANSPORT_OFFLINE: + case SDEV_CANCEL: + case SDEV_OFFLINE: + break; + default: return -EINVAL; - + } scsi_start_queue(sdev); return 0; -- 1.8.5.6 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke @ 2017-08-10 7:11 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig 2017-08-11 3:31 ` kbuild test robot 2 siblings, 0 replies; 12+ messages in thread From: Johannes Thumshirn @ 2017-08-10 7:11 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke switch()es are so much nicer to read :-) Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> -- Johannes Thumshirn Storage jthumshirn@suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke 2017-08-10 7:11 ` Johannes Thumshirn @ 2017-08-10 9:27 ` Christoph Hellwig 2017-08-11 3:31 ` kbuild test robot 2 siblings, 0 replies; 12+ messages in thread From: Christoph Hellwig @ 2017-08-10 9:27 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke On Thu, Aug 10, 2017 at 09:05:30AM +0200, Hannes Reinecke wrote: > Rework scsi_internal_device_unblock_nowait() into using a > switch statement. > No functional changes. > > Signed-off-by: Hannes Reinecke <hare@suse.com> > --- > drivers/scsi/scsi_lib.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c > index 1ae531b..035aa4c 100644 > --- a/drivers/scsi/scsi_lib.c > +++ b/drivers/scsi/scsi_lib.c > @@ -3074,19 +3074,25 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev, > * Try to transition the scsi device to SDEV_RUNNING or one of the > * offlined states and goose the device queue if successful. > */ > - if ((sdev->sdev_state == SDEV_BLOCK) || > - (sdev->sdev_state == SDEV_TRANSPORT_OFFLINE)) > + switch (sdev->sdev_state) { > + case SDEV_BLOCK: > + case SDEV_TRANSPORT_OFFLINE: > sdev->sdev_state = new_state; > - else if (sdev->sdev_state == SDEV_CREATED_BLOCK) { > + break; > + case SDEV_CREATED_BLOCK: > if (new_state == SDEV_TRANSPORT_OFFLINE || > new_state == SDEV_OFFLINE) > sdev->sdev_state = new_state; > else > sdev->sdev_state = SDEV_CREATED; > - } else if (sdev->sdev_state != SDEV_CANCEL && > - sdev->sdev_state != SDEV_OFFLINE) > + break; > + case SDEV_TRANSPORT_OFFLINE: > + case SDEV_CANCEL: > + case SDEV_OFFLINE: > + break; > + default: > return -EINVAL; This changes ok by default to reject by default and instead lists the ok states. Which probably is the right thing to do for future proofing against new states, so: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke 2017-08-10 7:11 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig @ 2017-08-11 3:31 ` kbuild test robot 2 siblings, 0 replies; 12+ messages in thread From: kbuild test robot @ 2017-08-11 3:31 UTC (permalink / raw) Cc: kbuild-all, Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke, Hannes Reinecke [-- Attachment #1: Type: text/plain, Size: 2888 bytes --] Hi Hannes, [auto build test ERROR on mkp-scsi/for-next] [also build test ERROR on v4.13-rc4 next-20170810] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Hannes-Reinecke/scsi-pollable-state-attribute/20170811-071630 base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next config: xtensa-allmodconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 4.9.0 reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=xtensa All errors (new ones prefixed by >>): drivers/scsi/scsi_lib.c: In function 'scsi_internal_device_unblock_nowait': >> drivers/scsi/scsi_lib.c:3089:2: error: duplicate case value case SDEV_TRANSPORT_OFFLINE: ^ >> drivers/scsi/scsi_lib.c:3079:2: error: previously used here case SDEV_TRANSPORT_OFFLINE: ^ vim +3089 drivers/scsi/scsi_lib.c 3054 3055 /** 3056 * scsi_internal_device_unblock_nowait - resume a device after a block request 3057 * @sdev: device to resume 3058 * @new_state: state to set the device to after unblocking 3059 * 3060 * Restart the device queue for a previously suspended SCSI device. Does not 3061 * sleep. 3062 * 3063 * Returns zero if successful or a negative error code upon failure. 3064 * 3065 * Notes: 3066 * This routine transitions the device to the SDEV_RUNNING state or to one of 3067 * the offline states (which must be a legal transition) allowing the midlayer 3068 * to goose the queue for this device. 3069 */ 3070 int scsi_internal_device_unblock_nowait(struct scsi_device *sdev, 3071 enum scsi_device_state new_state) 3072 { 3073 /* 3074 * Try to transition the scsi device to SDEV_RUNNING or one of the 3075 * offlined states and goose the device queue if successful. 3076 */ 3077 switch (sdev->sdev_state) { 3078 case SDEV_BLOCK: > 3079 case SDEV_TRANSPORT_OFFLINE: 3080 sdev->sdev_state = new_state; 3081 break; 3082 case SDEV_CREATED_BLOCK: 3083 if (new_state == SDEV_TRANSPORT_OFFLINE || 3084 new_state == SDEV_OFFLINE) 3085 sdev->sdev_state = new_state; 3086 else 3087 sdev->sdev_state = SDEV_CREATED; 3088 break; > 3089 case SDEV_TRANSPORT_OFFLINE: 3090 case SDEV_CANCEL: 3091 case SDEV_OFFLINE: 3092 break; 3093 default: 3094 return -EINVAL; 3095 } 3096 scsi_start_queue(sdev); 3097 3098 return 0; 3099 } 3100 EXPORT_SYMBOL_GPL(scsi_internal_device_unblock_nowait); 3101 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 50926 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/3] scsi: make 'state' device attribute pollable 2017-08-10 7:05 [PATCH 0/3] scsi: pollable 'state' attribute Hannes Reinecke 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke @ 2017-08-10 7:05 ` Hannes Reinecke 2017-08-10 7:19 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig 2 siblings, 2 replies; 12+ messages in thread From: Hannes Reinecke @ 2017-08-10 7:05 UTC (permalink / raw) To: Martin K. Petersen Cc: Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke, Hannes Reinecke While the 'state' attribute can (and will) change occasionally, calling 'poll()' or 'select()' on it fails as sysfs is never notified that the state has changed. With this patch calling 'poll()' or 'select()' will work properly. Signed-off-by: Hannes Reinecke <hare@suse.com> --- drivers/scsi/scsi_lib.c | 3 +++ drivers/scsi/scsi_transport_srp.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 035aa4c..3abef85 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2655,6 +2655,7 @@ void scsi_exit_queue(void) } sdev->sdev_state = state; + sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state"); return 0; illegal: @@ -3078,6 +3079,7 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev, case SDEV_BLOCK: case SDEV_TRANSPORT_OFFLINE: sdev->sdev_state = new_state; + sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state"); break; case SDEV_CREATED_BLOCK: if (new_state == SDEV_TRANSPORT_OFFLINE || @@ -3085,6 +3087,7 @@ int scsi_internal_device_unblock_nowait(struct scsi_device *sdev, sdev->sdev_state = new_state; else sdev->sdev_state = SDEV_CREATED; + sysfs_notify(&sdev->sdev_gendev.kobj, NULL, "state"); break; case SDEV_TRANSPORT_OFFLINE: case SDEV_CANCEL: diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c index f617021..698cc46 100644 --- a/drivers/scsi/scsi_transport_srp.c +++ b/drivers/scsi/scsi_transport_srp.c @@ -556,8 +556,11 @@ int srp_reconnect_rport(struct srp_rport *rport) */ shost_for_each_device(sdev, shost) { mutex_lock(&sdev->state_mutex); - if (sdev->sdev_state == SDEV_OFFLINE) + if (sdev->sdev_state == SDEV_OFFLINE) { sdev->sdev_state = SDEV_RUNNING; + sysfs_notify(&sdev->sdev_gendev.kobj, + NULL, "state"); + } mutex_unlock(&sdev->state_mutex); } } else if (rport->state == SRP_RPORT_RUNNING) { -- 1.8.5.6 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 3/3] scsi: make 'state' device attribute pollable 2017-08-10 7:05 ` [PATCH 3/3] scsi: make 'state' device attribute pollable Hannes Reinecke @ 2017-08-10 7:19 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig 1 sibling, 0 replies; 12+ messages in thread From: Johannes Thumshirn @ 2017-08-10 7:19 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke Looks good, Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> -- Johannes Thumshirn Storage jthumshirn@suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/3] scsi: make 'state' device attribute pollable 2017-08-10 7:05 ` [PATCH 3/3] scsi: make 'state' device attribute pollable Hannes Reinecke 2017-08-10 7:19 ` Johannes Thumshirn @ 2017-08-10 9:27 ` Christoph Hellwig 1 sibling, 0 replies; 12+ messages in thread From: Christoph Hellwig @ 2017-08-10 9:27 UTC (permalink / raw) To: Hannes Reinecke Cc: Martin K. Petersen, Christoph Hellwig, James Bottomley, linux-scsi, Hannes Reinecke Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-08-11 3:31 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-10 7:05 [PATCH 0/3] scsi: pollable 'state' attribute Hannes Reinecke 2017-08-10 7:05 ` [PATCH 1/3] scsi: allow state transition CREATED_BLOCK -> TRANSPORT_OFFLINE Hannes Reinecke 2017-08-10 7:09 ` Johannes Thumshirn 2017-08-10 9:26 ` Christoph Hellwig 2017-08-10 14:31 ` James Bottomley 2017-08-10 7:05 ` [PATCH 2/3] scsi_lib: rework scsi_internal_device_unblock_nowait() Hannes Reinecke 2017-08-10 7:11 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig 2017-08-11 3:31 ` kbuild test robot 2017-08-10 7:05 ` [PATCH 3/3] scsi: make 'state' device attribute pollable Hannes Reinecke 2017-08-10 7:19 ` Johannes Thumshirn 2017-08-10 9:27 ` Christoph Hellwig
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox