* Re: [PATCHv2 0/2] mdadm: setting device role of raid1 disk with failfast
From: Gioh Kim @ 2017-03-27 10:59 UTC (permalink / raw)
To: jes.sorensen; +Cc: neilb, linux-raid, linux-kernel
In-Reply-To: <1490003517-4216-1-git-send-email-gi-oh.kim@profitbricks.com>
Hi,
Is nobody interested in those patches?
On Mon, Mar 20, 2017 at 10:51:55AM +0100, Gioh Kim wrote:
> Hi,
>
> I've found a case that failfast option of mdadm set a disk faulty wrongly.
> Following is my test case.
>
> mdadm --create /dev/md100 -l 1 --failfast -e 1.2 -n 2 /dev/vdb /dev/vdc
> mdadm /dev/md100 -a --failfast /dev/vdd
>
> If I use failfast option, the vdd disk was faulty wrongly.
> If not, it was spare.
>
> This patch fixes a corner case for setting device role and
> prints device role if it's faulty.
> This patch is based on "mdadm - v4.0-8-g72b616a - 2017-03-07".
>
> v2: fix a typo of v1
>
> Gioh Kim (1):
> super1: ignore failfast flag for setting device role
>
> Jack Wang (1):
> super1: check and output faulty dev role
>
> super1.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> --
> 2.5.0
>
--
Best regards,
Gi-Oh Kim
TEL: 0176 2697 8962
^ permalink raw reply
* Re: [PATCH v3 02/14] md: move two macros into md.h
From: NeilBrown @ 2017-03-27 9:52 UTC (permalink / raw)
To: Shaohua Li
Cc: Ming Lei, Jens Axboe, linux-raid, linux-block, Christoph Hellwig
In-Reply-To: <20170327091553.GF6879@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 900 bytes --]
On Mon, Mar 27 2017, Christoph Hellwig wrote:
> On Fri, Mar 24, 2017 at 09:53:25AM -0700, Shaohua Li wrote:
>>
>> I had the same concern when I looked at this patch firstly. The number for
>> raid1/10 doesn't need to be the same. But if we don't move the number to a
>> generic header, the third patch will become a little more complicated. I
>> eventually ignored this issue. If we really need different number for raid1/10,
>> lets do it at that time.
>
> Which brings up my usual queastion: Is is really that benefitical for
> us to keep the raid1.c code around instead of making it a special short
> cut case in raid10.c?
Patches welcome.
They would need to handle write-mostly and write-behind. They would
also need to avoid the assumption of a chunk size for RAID1.
Undoubtedly do-able. Hard to say how beneficial it would be, or how much
it would cost.
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply
* Re: [PATCH v3] block: trace completion of all bios.
From: NeilBrown @ 2017-03-27 9:49 UTC (permalink / raw)
Cc: Ming Lei, Christoph Hellwig, Jens Axboe, linux-block, linux-raid,
dm-devel, Alasdair Kergon, Mike Snitzer, Shaohua Li, linux-kernel,
Martin K . Petersen
In-Reply-To: <20170327090308.GA11757@infradead.org>
[-- Attachment #1: Type: text/plain, Size: 641 bytes --]
On Mon, Mar 27 2017, Christoph Hellwig wrote:
> I don't really like the flag at all. I'd much prefer a __bio_endio
> with a 'bool trace' flag. Also please remove the manual tracing in
> dm.ċ. Once that is done I suspect we can also remove the
> block_bio_complete export.
Can you say why you don't like it?
I find that it neatly handles all the corner cases that I found, and
keeps the complexity local.
Were we to use a flag to __bio_endio(), we would need one to
__generic_make_request() too because we really don't want 'QUEUE' tracing
when when blk_queue_split() (and similar code) calls it.
Thanks,
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply
* Re: [PATCH v3 02/14] md: move two macros into md.h
From: Christoph Hellwig @ 2017-03-27 9:15 UTC (permalink / raw)
To: Shaohua Li
Cc: NeilBrown, Ming Lei, Jens Axboe, linux-raid, linux-block,
Christoph Hellwig
In-Reply-To: <20170324165325.nek4kb4yezz2xmow@kernel.org>
On Fri, Mar 24, 2017 at 09:53:25AM -0700, Shaohua Li wrote:
>
> I had the same concern when I looked at this patch firstly. The number for
> raid1/10 doesn't need to be the same. But if we don't move the number to a
> generic header, the third patch will become a little more complicated. I
> eventually ignored this issue. If we really need different number for raid1/10,
> lets do it at that time.
Which brings up my usual queastion: Is is really that benefitical for
us to keep the raid1.c code around instead of making it a special short
cut case in raid10.c?
^ permalink raw reply
* Re: [PATCH v3 01/14] md: raid1/raid10: don't handle failure of bio_add_page()
From: Christoph Hellwig @ 2017-03-27 9:14 UTC (permalink / raw)
To: Ming Lei; +Cc: Shaohua Li, Jens Axboe, linux-raid, linux-block,
Christoph Hellwig
In-Reply-To: <20170316161235.27110-2-tom.leiming@gmail.com>
Looks fine,
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply
* Re: [PATCH 06/23] dm-kcopyd: switch to use REQ_OP_WRITE_ZEROES
From: Christoph Hellwig @ 2017-03-27 9:12 UTC (permalink / raw)
To: Mike Snitzer
Cc: axboe, linux-raid, linux-scsi, martin.petersen, philipp.reisner,
linux-block, dm-devel, lars.ellenberg, shli, Christoph Hellwig,
agk, drbd-dev
In-Reply-To: <20170323151037.GC17127@redhat.com>
On Thu, Mar 23, 2017 at 11:10:38AM -0400, Mike Snitzer wrote:
> Not sure why you've split out the dm-kcopyd patch, likely best to just
> fold it into the previous dm support patch.
The dm-kcopyd patch switches to using WRITE_ZEROES instead of write
same for dm as user of these interfaces. The one before just adds
WRITE_ZEROES support to dm.
^ permalink raw reply
* Re: RFC: always use REQ_OP_WRITE_ZEROES for zeroing offload
From: Christoph Hellwig @ 2017-03-27 9:10 UTC (permalink / raw)
To: Christoph Hellwig, axboe-tSWWG44O7X1aa/9Udqfwiw,
martin.petersen-QHcLZuEGTsvQT0dZR+AlfA,
agk-H+wXaHxf7aLQT0dZR+AlfA, snitzer-H+wXaHxf7aLQT0dZR+AlfA,
shli-DgEjT+Ai2ygdnm+yROfE0A,
philipp.reisner-63ez5xqkn6DQT0dZR+AlfA,
linux-block-u79uwXL29TY76Z2rM5mHXA,
linux-scsi-u79uwXL29TY76Z2rM5mHXA,
drbd-dev-cunTk1MwBs8qoQakbn7OcQ, dm-devel-H+wXaHxf7aLQT0dZR+AlfA,
linux-raid-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20170323155410.GD1138-w1SgEEioFePxa46PmUWvFg@public.gmane.org>
It sounds like you don't want to support traditional discard at all,
but only WRITE ZEROES. So in many ways this series is the right way
forward. It would be nice if we could do a full blown
REQ_OP_WRITE_ZEROES for dm_think that zeroes out partial blocks,
similar to what hardware that implements WRITE SAME of zeroes
or WRITE ZEROES would do. I'll see if I could include that in my
series.
^ permalink raw reply
* Re: [PATCH v3] block: trace completion of all bios.
From: Christoph Hellwig @ 2017-03-27 9:03 UTC (permalink / raw)
To: NeilBrown
Cc: Ming Lei, Christoph Hellwig, Jens Axboe, linux-block, linux-raid,
dm-devel, Alasdair Kergon, Mike Snitzer, Shaohua Li, linux-kernel,
Martin K . Petersen
In-Reply-To: <87fui3a65o.fsf@notabene.neil.brown.name>
I don't really like the flag at all. I'd much prefer a __bio_endio
with a 'bool trace' flag. Also please remove the manual tracing in
dm.ċ. Once that is done I suspect we can also remove the
block_bio_complete export.
^ permalink raw reply
* Re: [mdadm PATCH 4/5] Add 'force' flag to *hot_remove_disk().
From: 王金浦 @ 2017-03-27 8:05 UTC (permalink / raw)
To: NeilBrown; +Cc: Jes Sorensen, Linux-RAID
In-Reply-To: <149058581604.15679.9993360149817038150.stgit@noble>
2017-03-27 5:36 GMT+02:00 NeilBrown <neilb@suse.com>:
> In rare circumstances, the short period that *hot_remove_disk()
> waits isn't long enough to IO to complete. This particularly happens
> when a device is failing and many retries are still happening.
>
> We don't want to increase the normal wait time for "mdadm --remove"
> as that might be use just to test if a device is active or not, and a
> delay would be problematic.
> So allow "--force" to mean that mdadm should try extra hard for a
> --remove to complete, waiting up to 5 seconds.
>
> Note that this patch fixes a comment which claim the previous
> wait time was half a second, where it was really 50msec.
>
> Signed-off-by: NeilBrown <neilb@suse.com>
> ---
> Grow.c | 2 +-
> Manage.c | 10 +++++-----
> mdadm.h | 4 ++--
> util.c | 10 +++++-----
> 4 files changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/Grow.c b/Grow.c
> index 218a70649c1f..e22661ca3dff 100755
> --- a/Grow.c
> +++ b/Grow.c
> @@ -2749,7 +2749,7 @@ static int impose_level(int fd, int level, char *devname, int verbose)
> continue;
> ioctl(fd, SET_DISK_FAULTY,
> makedev(disk.major, disk.minor));
> - hot_remove_disk(fd, makedev(disk.major, disk.minor));
> + hot_remove_disk(fd, makedev(disk.major, disk.minor), 1);
> }
> }
> c = map_num(pers, level);
> diff --git a/Manage.c b/Manage.c
> index edf5798aa87d..55218d9b0a7d 100644
> --- a/Manage.c
> +++ b/Manage.c
> @@ -1110,7 +1110,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
> }
>
> int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
> - int sysfd, unsigned long rdev, int verbose, char *devname)
> + int sysfd, unsigned long rdev, int force, int verbose, char *devname)
> {
> int lfd = -1;
> int err;
> @@ -1177,9 +1177,9 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
> /* device has been removed and we don't know
> * the major:minor number
> */
> - err = sys_hot_remove_disk(sysfd);
> + err = sys_hot_remove_disk(sysfd, force);
> } else {
> - err = hot_remove_disk(fd, rdev);
> + err = hot_remove_disk(fd, rdev, force);
> if (err && errno == ENODEV) {
> /* Old kernels rejected this if no personality
> * is registered */
> @@ -1603,7 +1603,7 @@ int Manage_subdevs(char *devname, int fd,
>
> if (dv->disposition == 'F')
> /* Need to remove first */
> - hot_remove_disk(fd, rdev);
> + hot_remove_disk(fd, rdev, force);
> /* Make sure it isn't in use (in 2.6 or later) */
> tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
> if (tfd >= 0) {
> @@ -1645,7 +1645,7 @@ int Manage_subdevs(char *devname, int fd,
> rv = -1;
> } else
> rv = Manage_remove(tst, fd, dv, sysfd,
> - rdev, verbose,
> + rdev, verbose, force,
> devname);
> if (sysfd >= 0)
> close(sysfd);
> diff --git a/mdadm.h b/mdadm.h
> index 52952a800ace..3b3d24230a79 100644
> --- a/mdadm.h
> +++ b/mdadm.h
> @@ -1476,8 +1476,8 @@ extern int add_disk(int mdfd, struct supertype *st,
> struct mdinfo *sra, struct mdinfo *info);
> extern int remove_disk(int mdfd, struct supertype *st,
> struct mdinfo *sra, struct mdinfo *info);
> -extern int hot_remove_disk(int mdfd, unsigned long dev);
> -extern int sys_hot_remove_disk(int statefd);
> +extern int hot_remove_disk(int mdfd, unsigned long dev, int force);
> +extern int sys_hot_remove_disk(int statefd, int force);
> extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
> unsigned long long min_recovery_start(struct mdinfo *array);
>
> diff --git a/util.c b/util.c
> index 43fd83e72ded..6fd582520f0d 100644
> --- a/util.c
> +++ b/util.c
> @@ -1795,15 +1795,15 @@ int remove_disk(int mdfd, struct supertype *st,
> return rv;
> }
>
> -int hot_remove_disk(int mdfd, unsigned long dev)
> +int hot_remove_disk(int mdfd, unsigned long dev, int force)
> {
> - int cnt = 5;
> + int cnt = force ? 500 : 5;
> int ret;
>
> /* HOT_REMOVE_DISK can fail with EBUSY if there are
> * outstanding IO requests to the device.
> * In this case, it can be helpful to wait a little while,
> - * up to half a second, for that IO to flush.
> + * up to 5 seconds if 'force' is set, or 50 msec if not.
> */
> while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
> errno == EBUSY &&
> @@ -1813,9 +1813,9 @@ int hot_remove_disk(int mdfd, unsigned long dev)
> return ret;
> }
>
> -int sys_hot_remove_disk(int statefd)
> +int sys_hot_remove_disk(int statefd, int force)
> {
> - int cnt = 5;
> + int cnt = force ? 500 : 5;
> int ret;
>
> while ((ret = write(statefd, "remove", 6)) == -1 &&
>
>
> --
Ah, you've found and fix it,
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
^ permalink raw reply
* [PATCH] md:array cannot be opened again after 'md_set_readonly'
From: Zhilong Liu @ 2017-03-27 7:52 UTC (permalink / raw)
To: neilb, shli; +Cc: linux-raid, Zhilong Liu, Guoqing Jiang
This is a bug about array cannot be opened again after 'md_set_readonly',
because the MD_CLOSING bit is still waiting for clear.
MD_CLOSING should only be set for a short period or time to avoid certain
races. After the operation that set it completes, it should be cleared.
Reviewed-by: NeilBrown <neilb@suse.com>
Cc: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Zhilong Liu <zlliu@suse.com>
---
drivers/md/md.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index f6ae1d6..7f2db7c 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5588,6 +5588,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
int err = 0;
int did_freeze = 0;
+ test_and_clear_bit(MD_CLOSING, &mddev->flags);
if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) {
did_freeze = 1;
set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
--
2.6.6
^ permalink raw reply related
* Re: [mdadm PATCH 2/5] Retry HOT_REMOVE_DISK a few times.
From: 王金浦 @ 2017-03-27 7:51 UTC (permalink / raw)
To: NeilBrown; +Cc: Jes Sorensen, Linux-RAID
In-Reply-To: <149058581564.15679.7099618010536570804.stgit@noble>
Hi Neil,
>
> +int hot_remove_disk(int mdfd, unsigned long dev)
> +{
> + int cnt = 5;
> + int ret;
> +
> + /* HOT_REMOVE_DISK can fail with EBUSY if there are
> + * outstanding IO requests to the device.
> + * In this case, it can be helpful to wait a little while,
> + * up to half a second, for that IO to flush.
> + */
> + while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
> + errno == EBUSY &&
> + cnt-- > 0)
> + usleep(10000);
> +
> + return ret;
> +}
The comments is different with the code, 50000 us = 50 ms not half a seconds.
Other than that.
It looks good to me!
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Thanks,
Jack
> +
> int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
> {
> /* Initialise kernel's knowledge of array.
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH 5/5] scripts: Fix dead URLs to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
In-Reply-To: <20170327054731.31882-1-sj38.park@gmail.com>
As ftp.kernel.org is closed [0], this commit fixes dead URLs to
ftp.kernel.org in scripts/ to use www.kernel.org instead.
[0] https://www.kernel.org/shutting-down-ftp-services.html
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
---
scripts/ksymoops/README | 5 ++---
scripts/package/builddeb | 4 ++--
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/scripts/ksymoops/README b/scripts/ksymoops/README
index f6cb06e3f30e..413043980127 100644
--- a/scripts/ksymoops/README
+++ b/scripts/ksymoops/README
@@ -1,8 +1,7 @@
ksymoops has been removed from the kernel. It was always meant to be a
free standing utility, not linked to any particular kernel version.
The latest version can be found in
-ftp://ftp.<country>.kernel.org/pub/linux/utils/kernel/ksymoops together
-with patches to other utilities in order to give more accurate Oops
-debugging.
+https://www.kernel.org/pub/linux/utils/kernel/ksymoops together with patches to
+other utilities in order to give more accurate Oops debugging.
Keith Owens <kaos@ocs.com.au> Sat Jun 19 10:30:34 EST 1999
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index f04e91f0845d..d7cf7156414e 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -257,8 +257,8 @@ EOF
cat <<EOF > debian/copyright
This is a packacked upstream version of the Linux kernel.
-The sources may be found at most Linux ftp sites, including:
-ftp://ftp.kernel.org/pub/linux/kernel
+The sources may be found at most Linux archive sites, including:
+https://www.kernel.org/pub/linux/kernel
Copyright: 1991 - 2015 Linus Torvalds and others.
--
2.10.0
^ permalink raw reply related
* [PATCH 4/5] fs/autofs4: Fix a dead URL to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
In-Reply-To: <20170327054731.31882-1-sj38.park@gmail.com>
As ftp.kernel.org is closed [0], this commit fixes a dead URL to
ftp.kernel.org in fs/autofs4/ to use www.kernel.org instead.
[0] https://www.kernel.org/shutting-down-ftp-services.html
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
---
fs/autofs4/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/autofs4/Kconfig b/fs/autofs4/Kconfig
index 1204d6384d39..44727bf18297 100644
--- a/fs/autofs4/Kconfig
+++ b/fs/autofs4/Kconfig
@@ -7,7 +7,7 @@ config AUTOFS4_FS
automounter (amd), which is a pure user space daemon.
To use the automounter you need the user-space tools from
- <ftp://ftp.kernel.org/pub/linux/daemons/autofs/v4/>; you also
+ <https://www.kernel.org/pub/linux/daemons/autofs/v4/>; you also
want to answer Y to "NFS file system support", below.
To compile this support as a module, choose M here: the module will be
--
2.10.0
^ permalink raw reply related
* [PATCH 3/5] drivers/md: Fix a dead URL to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
In-Reply-To: <20170327054731.31882-1-sj38.park@gmail.com>
As ftp.kernel.org is closed [0], this commit fixes a dead URL to
ftp.kernel.org in drivers/md/ to use www.kernel.org instead.
[0] https://www.kernel.org/shutting-down-ftp-services.html
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
---
drivers/md/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index 5c5ed97c9fda..6a41633460ba 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -115,7 +115,7 @@ config MD_RAID10
RAID-10 requires mdadm-1.7.0 or later, available at:
- ftp://ftp.kernel.org/pub/linux/utils/raid/mdadm/
+ https://www.kernel.org/pub/linux/utils/raid/mdadm/
If unsure, say Y.
--
2.10.0
^ permalink raw reply related
* [PATCH 2/5] drivers/block: Fix a dead URL to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
In-Reply-To: <20170327054731.31882-1-sj38.park@gmail.com>
As ftp.kernel.org is closed [0], this commit fixes a dead URL to
ftp.kernel.org in drivers/block/ to use www.kernel.org instead.
[0] https://www.kernel.org/shutting-down-ftp-services.html
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
---
drivers/block/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index f744de7a0f9b..7b608cf2516f 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -219,7 +219,7 @@ config BLK_DEV_LOOP
To use the loop device, you need the losetup utility, found in the
util-linux package, see
- <ftp://ftp.kernel.org/pub/linux/utils/util-linux/>.
+ <https://www.kernel.org/pub/linux/utils/util-linux/>.
The loop device driver can also be used to "hide" a file system in
a disk partition, floppy, or regular file, either using encryption
--
2.10.0
^ permalink raw reply related
* [PATCH 1/5] MAINTAINERS: Fix a dead URL to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
In-Reply-To: <20170327054731.31882-1-sj38.park@gmail.com>
As ftp.kernel.org is closed [0], this commit fixes a dead URL to
ftp.kernel.org in MAINTAINERS file to use www.kernel.org instead.
[0] https://www.kernel.org/shutting-down-ftp-services.html
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
---
MAINTAINERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 9c768d79cf3f..6367f0739394 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10158,7 +10158,7 @@ W: http://sourceforge.net/projects/accel-pptp
PREEMPTIBLE KERNEL
M: Robert Love <rml@tech9.net>
L: kpreempt-tech@lists.sourceforge.net
-W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
+W: https://www.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
S: Supported
F: Documentation/preempt-locking.txt
F: include/linux/preempt.h
--
2.10.0
^ permalink raw reply related
* [PATCH 0/5] Fix dead URLs to ftp.kernel.org
From: SeongJae Park @ 2017-03-27 5:47 UTC (permalink / raw)
To: rml, axboe, shli, raven, yamada.masahito, mmarek
Cc: linux-raid, autofs, linux-kbuild, linux-kernel, SeongJae Park
URLs to `ftp.kernel.org` exist here and there though `ftp.kernel.org` is
already dead [0]. This patchset fixes those URLs to use `www.kernel.org`
instead.
The change is splitted into multiple patches for independent review and merge
of each maintainer, though the change is trivial.
[0] https://www.kernel.org/shutting-down-ftp-services.html
SeongJae Park (5):
MAINTAINERS: Fix a dead URL to ftp.kernel.org
drivers/block: Fix a dead URL to ftp.kernel.org
drivers/md: Fix a dead URL to ftp.kernel.org
fs/autofs4: Fix a dead URL to ftp.kernel.org
scripts: Fix dead URLs to ftp.kernel.org
MAINTAINERS | 2 +-
drivers/block/Kconfig | 2 +-
drivers/md/Kconfig | 2 +-
fs/autofs4/Kconfig | 2 +-
scripts/ksymoops/README | 5 ++---
scripts/package/builddeb | 4 ++--
6 files changed, 8 insertions(+), 9 deletions(-)
--
2.10.0
^ permalink raw reply
* Re: [PATCH v3 9/9] raid5-ppl: runtime PPL enabling or disabling
From: NeilBrown @ 2017-03-27 5:08 UTC (permalink / raw)
To: linux-raid; +Cc: shli, jes.sorensen, Artur Paszkiewicz
In-Reply-To: <20170130185953.30428-10-artur.paszkiewicz@intel.com>
[-- Attachment #1: Type: text/plain, Size: 928 bytes --]
On Mon, Jan 30 2017, Artur Paszkiewicz wrote:
>
> +static void raid5_reset_stripe_cache(struct mddev *mddev)
> +{
> + struct r5conf *conf = mddev->private;
> +
> + mutex_lock(&conf->cache_size_mutex);
> + while (conf->max_nr_stripes &&
> + drop_one_stripe(conf))
> + ;
> + while (conf->min_nr_stripes > conf->max_nr_stripes &&
> + grow_one_stripe(conf, GFP_KERNEL))
> + ;
> + mutex_unlock(&conf->cache_size_mutex);
> +}
This is called with the raid array suspended, so any writeout to the
array will block.
A GFP_KERNEL allocation can block waiting for writeout.
So this can deadlock.
At the very least, this should use GFP_NOIO.
It would be better to do something like resize_stripes() does, or maybe
even just use resize_stripes().
It allocates the new stripes first before suspending IO. Then it
cleans out the old stripes, and inserts the pre-allocated stripes.
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply
* [mdadm PATCH 3/5] Introduce sys_hot_remove_disk()
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
In-Reply-To: <149058575542.15679.9804611071393072863.stgit@noble>
The new hot_remove_disk() will retry HOT_REMOVE_DISK
several times in the face of EBUSY.
However we sometimes remove a device by writing "remove" to the
"state" attributed. This should be retried as well.
So introduce sys_hot_remove_disk() to repeat this action a few times.
Signed-off-by: NeilBrown <neilb@suse.com>
---
Manage.c | 6 +-----
mdadm.h | 1 +
util.c | 12 ++++++++++++
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/Manage.c b/Manage.c
index 9139f96e1431..edf5798aa87d 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1177,11 +1177,7 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
/* device has been removed and we don't know
* the major:minor number
*/
- int n = write(sysfd, "remove", 6);
- if (n != 6)
- err = -1;
- else
- err = 0;
+ err = sys_hot_remove_disk(sysfd);
} else {
err = hot_remove_disk(fd, rdev);
if (err && errno == ENODEV) {
diff --git a/mdadm.h b/mdadm.h
index 53b3b5836841..52952a800ace 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1477,6 +1477,7 @@ extern int add_disk(int mdfd, struct supertype *st,
extern int remove_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
extern int hot_remove_disk(int mdfd, unsigned long dev);
+extern int sys_hot_remove_disk(int statefd);
extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
unsigned long long min_recovery_start(struct mdinfo *array);
diff --git a/util.c b/util.c
index e176a9d466cf..43fd83e72ded 100644
--- a/util.c
+++ b/util.c
@@ -1813,6 +1813,18 @@ int hot_remove_disk(int mdfd, unsigned long dev)
return ret;
}
+int sys_hot_remove_disk(int statefd)
+{
+ int cnt = 5;
+ int ret;
+
+ while ((ret = write(statefd, "remove", 6)) == -1 &&
+ errno == EBUSY &&
+ cnt-- > 0)
+ usleep(10000);
+ return ret == 6 ? 0 : -1;
+}
+
int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
{
/* Initialise kernel's knowledge of array.
^ permalink raw reply related
* [mdadm PATCH 5/5] Detail: handle non-existent arrays better.
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
In-Reply-To: <149058575542.15679.9804611071393072863.stgit@noble>
If you call "mdadm --detail" with a device file for an array which
doesn't exist, such as by
mknod /dev/md57 b 9 57
mdadm --detail /dev/md57
you get an unhelpful message about and inactive RAID0, and return
status is '0'. This is confusing.
So catch this possibility and print a more useful message, and
return a non-zero status.
Signed-off-by: NeilBrown <neilb@suse.com>
---
Detail.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Detail.c b/Detail.c
index 509b0d418768..d9d1b7092167 100644
--- a/Detail.c
+++ b/Detail.c
@@ -110,6 +110,14 @@ int Detail(char *dev, struct context *c)
if (ioctl(fd, GET_ARRAY_INFO, &array) == 0) {
inactive = 0;
} else if (errno == ENODEV && sra) {
+ if (sra->array.major_version == -1 &&
+ sra->array.minor_version == -1 &&
+ sra->devs == NULL) {
+ pr_err("Array associated with md device %s does not exist.\n", dev);
+ close(fd);
+ sysfs_free(sra);
+ return rv;
+ }
array = sra->array;
inactive = 1;
} else {
^ permalink raw reply related
* [mdadm PATCH 4/5] Add 'force' flag to *hot_remove_disk().
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
In-Reply-To: <149058575542.15679.9804611071393072863.stgit@noble>
In rare circumstances, the short period that *hot_remove_disk()
waits isn't long enough to IO to complete. This particularly happens
when a device is failing and many retries are still happening.
We don't want to increase the normal wait time for "mdadm --remove"
as that might be use just to test if a device is active or not, and a
delay would be problematic.
So allow "--force" to mean that mdadm should try extra hard for a
--remove to complete, waiting up to 5 seconds.
Note that this patch fixes a comment which claim the previous
wait time was half a second, where it was really 50msec.
Signed-off-by: NeilBrown <neilb@suse.com>
---
Grow.c | 2 +-
Manage.c | 10 +++++-----
mdadm.h | 4 ++--
util.c | 10 +++++-----
4 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/Grow.c b/Grow.c
index 218a70649c1f..e22661ca3dff 100755
--- a/Grow.c
+++ b/Grow.c
@@ -2749,7 +2749,7 @@ static int impose_level(int fd, int level, char *devname, int verbose)
continue;
ioctl(fd, SET_DISK_FAULTY,
makedev(disk.major, disk.minor));
- hot_remove_disk(fd, makedev(disk.major, disk.minor));
+ hot_remove_disk(fd, makedev(disk.major, disk.minor), 1);
}
}
c = map_num(pers, level);
diff --git a/Manage.c b/Manage.c
index edf5798aa87d..55218d9b0a7d 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1110,7 +1110,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
}
int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
- int sysfd, unsigned long rdev, int verbose, char *devname)
+ int sysfd, unsigned long rdev, int force, int verbose, char *devname)
{
int lfd = -1;
int err;
@@ -1177,9 +1177,9 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
/* device has been removed and we don't know
* the major:minor number
*/
- err = sys_hot_remove_disk(sysfd);
+ err = sys_hot_remove_disk(sysfd, force);
} else {
- err = hot_remove_disk(fd, rdev);
+ err = hot_remove_disk(fd, rdev, force);
if (err && errno == ENODEV) {
/* Old kernels rejected this if no personality
* is registered */
@@ -1603,7 +1603,7 @@ int Manage_subdevs(char *devname, int fd,
if (dv->disposition == 'F')
/* Need to remove first */
- hot_remove_disk(fd, rdev);
+ hot_remove_disk(fd, rdev, force);
/* Make sure it isn't in use (in 2.6 or later) */
tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
if (tfd >= 0) {
@@ -1645,7 +1645,7 @@ int Manage_subdevs(char *devname, int fd,
rv = -1;
} else
rv = Manage_remove(tst, fd, dv, sysfd,
- rdev, verbose,
+ rdev, verbose, force,
devname);
if (sysfd >= 0)
close(sysfd);
diff --git a/mdadm.h b/mdadm.h
index 52952a800ace..3b3d24230a79 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1476,8 +1476,8 @@ extern int add_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
extern int remove_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
-extern int hot_remove_disk(int mdfd, unsigned long dev);
-extern int sys_hot_remove_disk(int statefd);
+extern int hot_remove_disk(int mdfd, unsigned long dev, int force);
+extern int sys_hot_remove_disk(int statefd, int force);
extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
unsigned long long min_recovery_start(struct mdinfo *array);
diff --git a/util.c b/util.c
index 43fd83e72ded..6fd582520f0d 100644
--- a/util.c
+++ b/util.c
@@ -1795,15 +1795,15 @@ int remove_disk(int mdfd, struct supertype *st,
return rv;
}
-int hot_remove_disk(int mdfd, unsigned long dev)
+int hot_remove_disk(int mdfd, unsigned long dev, int force)
{
- int cnt = 5;
+ int cnt = force ? 500 : 5;
int ret;
/* HOT_REMOVE_DISK can fail with EBUSY if there are
* outstanding IO requests to the device.
* In this case, it can be helpful to wait a little while,
- * up to half a second, for that IO to flush.
+ * up to 5 seconds if 'force' is set, or 50 msec if not.
*/
while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
errno == EBUSY &&
@@ -1813,9 +1813,9 @@ int hot_remove_disk(int mdfd, unsigned long dev)
return ret;
}
-int sys_hot_remove_disk(int statefd)
+int sys_hot_remove_disk(int statefd, int force)
{
- int cnt = 5;
+ int cnt = force ? 500 : 5;
int ret;
while ((ret = write(statefd, "remove", 6)) == -1 &&
^ permalink raw reply related
* [mdadm PATCH 1/5] udev-md-raid-assembly.rules: Skip non-ready devices
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
In-Reply-To: <149058575542.15679.9804611071393072863.stgit@noble>
From: Hannes Reinecke <hare@suse.de>
If a device isn't fully initialized (e.g if it should be
handled by multipathing) it should not be considered for
md/RAID auto-assembly. Doing so can cause incorrect results
such as causing multipath to fail during startup.
There is a convention that the udev environment variable
SYSTEMD_READY be set to zero for such devices. So change
the mdadm rules to ignore devices with SYSTEMD_READY==0.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: NeilBrown <neilb@suse.com>
---
udev-md-raid-assembly.rules | 3 +++
1 file changed, 3 insertions(+)
diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules
index d0d440a6394c..8ca232a44b1f 100644
--- a/udev-md-raid-assembly.rules
+++ b/udev-md-raid-assembly.rules
@@ -7,6 +7,9 @@ ENV{ANACONDA}=="?*", GOTO="md_inc_end"
SUBSYSTEM!="block", GOTO="md_inc_end"
+# skip non-initialized devices
+ENV{SYSTEMD_READY}=="0", GOTO="md_inc_end"
+
# handle potential components of arrays (the ones supported by md)
ENV{ID_FS_TYPE}=="linux_raid_member", GOTO="md_inc"
^ permalink raw reply related
* [mdadm PATCH 2/5] Retry HOT_REMOVE_DISK a few times.
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
In-Reply-To: <149058575542.15679.9804611071393072863.stgit@noble>
HOT_REMOVE_DISK can fail with EBUSY if there are outstanding
IO request that have not completed yet. It can sometimes
be helpful to wait a little while for these to complete.
We already do this in impose_level() when reshaping a device,
but not in Manage.c in response to an explicit --remove request.
So create hot_remove_disk() to central this code, and call it
where-ever it makes sense to wait for a HOT_REMOVE_DISK to succeed.
Signed-off-by: NeilBrown <neilb@suse.com>
---
Grow.c | 9 +--------
Manage.c | 4 ++--
mdadm.h | 1 +
util.c | 18 ++++++++++++++++++
4 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/Grow.c b/Grow.c
index 455c5f90bf58..218a70649c1f 100755
--- a/Grow.c
+++ b/Grow.c
@@ -2736,7 +2736,6 @@ static int impose_level(int fd, int level, char *devname, int verbose)
for (d = 0, found = 0;
d < MAX_DISKS && found < array.nr_disks;
d++) {
- int cnt;
mdu_disk_info_t disk;
disk.number = d;
if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
@@ -2750,13 +2749,7 @@ static int impose_level(int fd, int level, char *devname, int verbose)
continue;
ioctl(fd, SET_DISK_FAULTY,
makedev(disk.major, disk.minor));
- cnt = 5;
- while (ioctl(fd, HOT_REMOVE_DISK,
- makedev(disk.major, disk.minor)) < 0
- && errno == EBUSY
- && cnt--) {
- usleep(10000);
- }
+ hot_remove_disk(fd, makedev(disk.major, disk.minor));
}
}
c = map_num(pers, level);
diff --git a/Manage.c b/Manage.c
index 5c3d2b9b1a9f..9139f96e1431 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1183,7 +1183,7 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
else
err = 0;
} else {
- err = ioctl(fd, HOT_REMOVE_DISK, rdev);
+ err = hot_remove_disk(fd, rdev);
if (err && errno == ENODEV) {
/* Old kernels rejected this if no personality
* is registered */
@@ -1607,7 +1607,7 @@ int Manage_subdevs(char *devname, int fd,
if (dv->disposition == 'F')
/* Need to remove first */
- ioctl(fd, HOT_REMOVE_DISK, rdev);
+ hot_remove_disk(fd, rdev);
/* Make sure it isn't in use (in 2.6 or later) */
tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
if (tfd >= 0) {
diff --git a/mdadm.h b/mdadm.h
index 71b8afb9fee6..53b3b5836841 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1476,6 +1476,7 @@ extern int add_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
extern int remove_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
+extern int hot_remove_disk(int mdfd, unsigned long dev);
extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
unsigned long long min_recovery_start(struct mdinfo *array);
diff --git a/util.c b/util.c
index f1009723ed04..e176a9d466cf 100644
--- a/util.c
+++ b/util.c
@@ -1795,6 +1795,24 @@ int remove_disk(int mdfd, struct supertype *st,
return rv;
}
+int hot_remove_disk(int mdfd, unsigned long dev)
+{
+ int cnt = 5;
+ int ret;
+
+ /* HOT_REMOVE_DISK can fail with EBUSY if there are
+ * outstanding IO requests to the device.
+ * In this case, it can be helpful to wait a little while,
+ * up to half a second, for that IO to flush.
+ */
+ while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
+ errno == EBUSY &&
+ cnt-- > 0)
+ usleep(10000);
+
+ return ret;
+}
+
int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
{
/* Initialise kernel's knowledge of array.
^ permalink raw reply related
* [mdadm PATCH 0/5] Assorted mdadm patch
From: NeilBrown @ 2017-03-27 3:36 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
I found these while tidying up....
I post a couple already, but then realised that I
have quite a few, so here they are all together.
Sorry for the duplication.
NeilBrown
---
Hannes Reinecke (1):
udev-md-raid-assembly.rules: Skip non-ready devices
NeilBrown (4):
Retry HOT_REMOVE_DISK a few times.
Introduce sys_hot_remove_disk()
Add 'force' flag to *hot_remove_disk().
Detail: handle non-existent arrays better.
Detail.c | 8 ++++++++
Grow.c | 9 +--------
Manage.c | 14 +++++---------
mdadm.h | 2 ++
udev-md-raid-assembly.rules | 3 +++
util.c | 30 ++++++++++++++++++++++++++++++
6 files changed, 49 insertions(+), 17 deletions(-)
--
Signature
^ permalink raw reply
* [mdadm PATCH] Retry HOT_REMOVE_DISK a few times.
From: NeilBrown @ 2017-03-27 1:50 UTC (permalink / raw)
To: Jes Sorensen; +Cc: Linux-RAID
[-- Attachment #1: Type: text/plain, Size: 3612 bytes --]
HOT_REMOVE_DISK can fail with EBUSY if there are outstanding
IO request that have not completed yet. It can sometimes
be helpful to wait a little while for these to complete.
We already do this in impose_level() when reshaping a device,
but not in Manage.c in response to an explicit --remove request.
So create hot_remove_disk() to central this code, and call it
where-ever it makes sense to wait for a HOT_REMOVE_DISK to succeed.
Signed-off-by: NeilBrown <neilb@suse.com>
---
Grow.c | 9 +--------
Manage.c | 4 ++--
mdadm.h | 1 +
util.c | 18 ++++++++++++++++++
4 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/Grow.c b/Grow.c
index 455c5f90bf58..218a70649c1f 100755
--- a/Grow.c
+++ b/Grow.c
@@ -2736,7 +2736,6 @@ static int impose_level(int fd, int level, char *devname, int verbose)
for (d = 0, found = 0;
d < MAX_DISKS && found < array.nr_disks;
d++) {
- int cnt;
mdu_disk_info_t disk;
disk.number = d;
if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
@@ -2750,13 +2749,7 @@ static int impose_level(int fd, int level, char *devname, int verbose)
continue;
ioctl(fd, SET_DISK_FAULTY,
makedev(disk.major, disk.minor));
- cnt = 5;
- while (ioctl(fd, HOT_REMOVE_DISK,
- makedev(disk.major, disk.minor)) < 0
- && errno == EBUSY
- && cnt--) {
- usleep(10000);
- }
+ hot_remove_disk(fd, makedev(disk.major, disk.minor));
}
}
c = map_num(pers, level);
diff --git a/Manage.c b/Manage.c
index 5c3d2b9b1a9f..9139f96e1431 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1183,7 +1183,7 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
else
err = 0;
} else {
- err = ioctl(fd, HOT_REMOVE_DISK, rdev);
+ err = hot_remove_disk(fd, rdev);
if (err && errno == ENODEV) {
/* Old kernels rejected this if no personality
* is registered */
@@ -1607,7 +1607,7 @@ int Manage_subdevs(char *devname, int fd,
if (dv->disposition == 'F')
/* Need to remove first */
- ioctl(fd, HOT_REMOVE_DISK, rdev);
+ hot_remove_disk(fd, rdev);
/* Make sure it isn't in use (in 2.6 or later) */
tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
if (tfd >= 0) {
diff --git a/mdadm.h b/mdadm.h
index 71b8afb9fee6..53b3b5836841 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1476,6 +1476,7 @@ extern int add_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
extern int remove_disk(int mdfd, struct supertype *st,
struct mdinfo *sra, struct mdinfo *info);
+extern int hot_remove_disk(int mdfd, unsigned long dev);
extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
unsigned long long min_recovery_start(struct mdinfo *array);
diff --git a/util.c b/util.c
index f1009723ed04..e176a9d466cf 100644
--- a/util.c
+++ b/util.c
@@ -1795,6 +1795,24 @@ int remove_disk(int mdfd, struct supertype *st,
return rv;
}
+int hot_remove_disk(int mdfd, unsigned long dev)
+{
+ int cnt = 5;
+ int ret;
+
+ /* HOT_REMOVE_DISK can fail with EBUSY if there are
+ * outstanding IO requests to the device.
+ * In this case, it can be helpful to wait a little while,
+ * up to half a second, for that IO to flush.
+ */
+ while ((ret = ioctl(mdfd, HOT_REMOVE_DISK, dev)) == -1 &&
+ errno == EBUSY &&
+ cnt-- > 0)
+ usleep(10000);
+
+ return ret;
+}
+
int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
{
/* Initialise kernel's knowledge of array.
--
2.12.0
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox