Linux RAID subsystem development
 help / color / mirror / Atom feed
* Re: [PATCH 06/32] xen blkback: prepare for bi_rw split
From: Christoph Hellwig @ 2015-11-07 10:17 UTC (permalink / raw)
  To: mchristi-H+wXaHxf7aLQT0dZR+AlfA
  Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA, Konrad Rzeszutek Wilk,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-raid-u79uwXL29TY76Z2rM5mHXA,
	dm-devel-H+wXaHxf7aLQT0dZR+AlfA,
	linux-fsdevel-u79uwXL29TY76Z2rM5mHXA,
	xen-devel-GuqFBffKawtpuQazS67q72D2FQJk+8+b,
	drbd-dev-cunTk1MwBs8qoQakbn7OcQ
In-Reply-To: <1446674909-5371-7-git-send-email-mchristi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

A little offtopic for this patch, but can some explain this whole
mess about bios in Xen blkfront?  We can happily do partial completions
at the request later.

Also since the blk-mq conversion the call to blk_end_request_all is
completely broken, so it doesn't look like this code path is exactly
well tested.

^ permalink raw reply

* Re: [RESEND RFC PATCH 00/32] separate operations from flags in the bio/request structs
From: Christoph Hellwig @ 2015-11-07 10:10 UTC (permalink / raw)
  To: mchristi
  Cc: linux-fsdevel, dm-devel, linux-raid, linux-kernel, linux-scsi,
	drbd-dev
In-Reply-To: <1446674909-5371-1-git-send-email-mchristi@redhat.com>

On Wed, Nov 04, 2015 at 04:07:57PM -0600, mchristi@redhat.com wrote:
> Known issues:
> - REQ_FLUSH is still a flag, but should probably be a operation.
>  For lower level drivers like SCSI where we only get a flush, it makes
> more sense to be a operation. However, upper layers like filesystems
> can send down flushes with writes, so it is more of a flag for them.
> I am still working on this.

Actually it should be both.  REQ_OP_FLUSH for a real flush operation,
and a REQ_PREFLUSH bio flag that the request layer will sequence into
an actual write an a flush operation.

^ permalink raw reply

* Re: [PATCH] bcache: Really show state of work pending bit
From: Jiri Kosina @ 2015-11-06 19:55 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Kent Overstreet, Tejun Heo, Neil Brown, linux-bcache, linux-raid,
	linux-kernel
In-Reply-To: <1444048792-22847-1-git-send-email-pmladek@suse.com>

On Mon, 5 Oct 2015, Petr Mladek wrote:

> WORK_STRUCT_PENDING is a mask for testing the pending bit.
> test_bit() expects the number of the bit and we need to
> use WORK_STRUCT_PENDING_BIT there.
> 
> Also work_data_bits() is defined in workqueues.h now.
> 
> I have noticed this just by chance when looking how
> WORK_STRUCT_PENDING_BIT is used. The change is compile
> tested.
> 
> Signed-off-by: Petr Mladek <pmladek@suse.com>
> ---
>  drivers/md/bcache/closure.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/md/bcache/closure.c b/drivers/md/bcache/closure.c
> index 7a228de95fd7..9eaf1d6e8302 100644
> --- a/drivers/md/bcache/closure.c
> +++ b/drivers/md/bcache/closure.c
> @@ -167,8 +167,6 @@ EXPORT_SYMBOL(closure_debug_destroy);
>  
>  static struct dentry *debug;
>  
> -#define work_data_bits(work) ((unsigned long *)(&(work)->data))
> -
>  static int debug_seq_show(struct seq_file *f, void *data)
>  {
>  	struct closure *cl;
> @@ -182,7 +180,7 @@ static int debug_seq_show(struct seq_file *f, void *data)
>  			   r & CLOSURE_REMAINING_MASK);
>  
>  		seq_printf(f, "%s%s%s%s\n",
> -			   test_bit(WORK_STRUCT_PENDING,
> +			   test_bit(WORK_STRUCT_PENDING_BIT,

I don't see this in linux-next as of today, so I am picking it up for 4.4.

-- 
Jiri Kosina 
SUSE Labs

^ permalink raw reply

* [PATCH] md: MD_RAID456 now depends on LIBCRC32C
From: Guenter Roeck @ 2015-11-06 17:31 UTC (permalink / raw)
  To: Neil Brown; +Cc: linux-raid, linux-kernel, Guenter Roeck

Since commit 5cb2fbd6ea0d1 ("raid5-cache: use crc32c checksum"),
parisc:generic-32bit_defconfig and probably other builds fail as follows.

ERROR: "crc32c" [drivers/md/raid456.ko] undefined!

Fixes: 5cb2fbd6ea0d1 ("raid5-cache: use crc32c checksum")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/md/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index 3e01e6fb3424..1d5609ca2bbe 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -127,6 +127,7 @@ config MD_RAID456
 	select ASYNC_XOR
 	select ASYNC_PQ
 	select ASYNC_RAID6_RECOV
+	select LIBCRC32C
 	---help---
 	  A RAID-5 set of N drives with a capacity of C MB per drive provides
 	  the capacity of C * (N - 1) MB, and protects against a failure
-- 
2.1.4

^ permalink raw reply related

* Re: [PATCH 2/8] mmc: handle add_disk() return value
From: Ulf Hansson @ 2015-11-06 16:03 UTC (permalink / raw)
  To: Vishnu Pratap Singh
  Cc: Jens Axboe, Andrew Morton, linux-kernel@vger.kernel.org,
	Jeff Moyer, minchan, ngupta, sergey.senozhatsky.work,
	David S. Miller, neilb, Takashi Iwai, hare, ming.lei, jarod, viro,
	Tejun Heo, Adrian Hunter, Jon Hunter, Grant Grundler, linux-ide,
	linux-raid, linux-mmc, cpgs ., vishu13285, pintu.k, rohit.kr
In-Reply-To: <1446812535-10567-2-git-send-email-vishnu.ps@samsung.com>

On 6 November 2015 at 13:22, Vishnu Pratap Singh <vishnu.ps@samsung.com> wrote:
> This patch handles  add_disk() return value.
> Earlier add_disk() function doesn't handle error
> cases, now it is added, so the callers of this function
> should also handle it.
>
> Verfied on X86 based ubuntu machine.
> This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Please remove these two lines from the change log.

Still it's great that you provide this information while posting the
patches, but you can do that by adding text between the sign-off-by
and "---". Just add a new line consisting of "---" and then add you
text below it.

>
> Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
> ---
>  drivers/mmc/card/block.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 23b6c8e..543c670 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -2432,7 +2432,10 @@ static int mmc_add_disk(struct mmc_blk_data *md)
>         int ret;
>         struct mmc_card *card = md->queue.card;
>
> -       add_disk(md->disk);
> +       ret = add_disk(md->disk);
> +       if (ret)
> +               goto add_disk_fail;

You don't need a goto here. Please just do "return ret;" as I think it
makes code easier.

> +
>         md->force_ro.show = force_ro_show;
>         md->force_ro.store = force_ro_store;
>         sysfs_attr_init(&md->force_ro.attr);
> @@ -2468,7 +2471,7 @@ power_ro_lock_fail:
>         device_remove_file(disk_to_dev(md->disk), &md->force_ro);
>  force_ro_fail:
>         del_gendisk(md->disk);
> -
> +add_disk_fail:
>         return ret;
>  }
>
> --
> 1.9.1
>

Kind regards
Uffe

^ permalink raw reply

* Re: RAID6 reshape stalls immediately
From: Anugraha Sinha @ 2015-11-06 13:54 UTC (permalink / raw)
  To: Peter Chubb, linux-raid
In-Reply-To: <563CAFC1.2080708@gmail.com>

Dear Peter,

Also please follow one of the mails over linux-raid mailing list.
Subject : RAID6 reshape stalls immediately

It discusses a similar problem, when giving backup-file.

Regards
Anugraha

On 11/6/2015 10:48 PM, Anugraha Sinha wrote:
> Dear Peter,
>
> What happening on the root partition where you are trying to take a backup?
>
> Any I/O, filesize etc?
>
> Also could you share the output of mdadm --examine <all of your 6 raid
> members individually?
>
> On 11/5/2015 8:39 AM, Peter Chubb wrote:
>> Hi Folks,
>>     I added two disks to my RAID5 array then attempted to reshape it to
>>     RAID 6.  And it has been sitting on 0% complete, with no disk I/O
>>     for 24 hours now.
>>
>>     Is there any way to kick the reshape process?
>>
>> /proc/mdstat is:
>>
>>    Personalities : [raid6] [raid5] [raid4]
>>    md0 : active raid6 sdi1[6] sdh1[5] sdd1[4] sde1[2] sdb1[1] sda1[0]
>>        5860122624 blocks super 1.2 level 6, 512k chunk, algorithm 18
>> [6/5] [UUUU_U]
>>        [>....................]  reshape =  0.0% (0/1953374208)
>> finish=1308.7min speed=24099K/sec
>>        bitmap: 0/15 pages [0KB], 65536KB chunk
>>
>>    unused devices: <none>
>>
>>
>> What I did:
>>    mdadm --add /dev/md0 /dev/sdh1
>>    mdadm --add /dev/md0 /dev/sdi1
>>    mdadm --grow /dev/md0 --level=6 --raid-devices=6
>> --backup-file=/root/raid5-backup
>>
>> dmesg reported:
>> [691739.298345] md: bind<sdh1>
>> [691739.364534] RAID conf printout:
>> [691739.364537]  --- level:5 rd:4 wd:4
>> [691739.364539]  disk 0, o:1, dev:sda1
>> [691739.364540]  disk 1, o:1, dev:sdb1
>> [691739.364541]  disk 2, o:1, dev:sde1
>> [691739.364542]  disk 3, o:1, dev:sdd1
>> [691741.832242] md: bind<sdi1>
>> [691741.898470] RAID conf printout:
>> [691741.898474]  --- level:5 rd:4 wd:4
>> [691741.898476]  disk 0, o:1, dev:sda1
>> [691741.898478]  disk 1, o:1, dev:sdb1
>> [691741.898480]  disk 2, o:1, dev:sde1
>> [691741.898481]  disk 3, o:1, dev:sdd1
>> [691741.898482] RAID conf printout:
>> [691741.898482]  --- level:5 rd:4 wd:4
>> [691741.898484]  disk 0, o:1, dev:sda1
>> [691741.898485]  disk 1, o:1, dev:sdb1
>> [691741.898486]  disk 2, o:1, dev:sde1
>> [691741.898487]  disk 3, o:1, dev:sdd1
>> [691805.469105] md/raid:md0: device sdd1 operational as raid disk 3
>> [691805.469110] md/raid:md0: device sde1 operational as raid disk 2
>> [691805.469111] md/raid:md0: device sdb1 operational as raid disk 1
>> [691805.469112] md/raid:md0: device sda1 operational as raid disk 0
>> [691805.469551] md/raid:md0: allocated 5424kB
>> [691805.506035] md/raid:md0: raid level 6 active with 4 out of 5
>> devices, algori
>> thm 18
>> [691805.506050] RAID conf printout:
>> [691805.506051]  --- level:6 rd:5 wd:4
>> [691805.506053]  disk 0, o:1, dev:sda1
>> [691805.506054]  disk 1, o:1, dev:sdb1
>> [691805.506055]  disk 2, o:1, dev:sde1
>> [691805.506056]  disk 3, o:1, dev:sdd1
>> [691805.847329] RAID conf printout:
>> [691805.847333]  --- level:6 rd:6 wd:5
>> [691805.847335]  disk 0, o:1, dev:sda1
>> [691805.847336]  disk 1, o:1, dev:sdb1
>> [691805.847337]  disk 2, o:1, dev:sde1
>> [691805.847338]  disk 3, o:1, dev:sdd1
>> [691805.847340]  disk 4, o:1, dev:sdi1
>> [691805.847350] RAID conf printout:
>> [691805.847350]  --- level:6 rd:6 wd:5
>> [691805.847351]  disk 0, o:1, dev:sda1
>> [691805.847352]  disk 1, o:1, dev:sdb1
>> [691805.847353]  disk 2, o:1, dev:sde1
>> [691805.847354]  disk 3, o:1, dev:sdd1
>> [691805.847354]  disk 4, o:1, dev:sdi1
>> [691805.847355]  disk 5, o:1, dev:sdh1
>> [691805.847424] md: reshape of RAID array md0
>> [691805.847426] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
>> [691805.847428] md: using maximum available idle IO bandwidth (but not
>> more than 200000 KB/sec) for reshape.
>> [691805.847439] md: using 128k window, over a total of 1953374208k.
>>
>> And nothing since.
>>

^ permalink raw reply

* Re: RAID6 reshape stalls immediately
From: Anugraha Sinha @ 2015-11-06 13:48 UTC (permalink / raw)
  To: Peter Chubb, linux-raid
In-Reply-To: <84a8qtgwqk.wl-peter.chubb@nicta.com.au>

Dear Peter,

What happening on the root partition where you are trying to take a backup?

Any I/O, filesize etc?

Also could you share the output of mdadm --examine <all of your 6 raid 
members individually?

On 11/5/2015 8:39 AM, Peter Chubb wrote:
> Hi Folks,
>     I added two disks to my RAID5 array then attempted to reshape it to
>     RAID 6.  And it has been sitting on 0% complete, with no disk I/O
>     for 24 hours now.
>
>     Is there any way to kick the reshape process?
>
> /proc/mdstat is:
>
>    Personalities : [raid6] [raid5] [raid4]
>    md0 : active raid6 sdi1[6] sdh1[5] sdd1[4] sde1[2] sdb1[1] sda1[0]
>        5860122624 blocks super 1.2 level 6, 512k chunk, algorithm 18 [6/5] [UUUU_U]
>        [>....................]  reshape =  0.0% (0/1953374208) finish=1308.7min speed=24099K/sec
>        bitmap: 0/15 pages [0KB], 65536KB chunk
>
>    unused devices: <none>
>
>
> What I did:
>    mdadm --add /dev/md0 /dev/sdh1
>    mdadm --add /dev/md0 /dev/sdi1
>    mdadm --grow /dev/md0 --level=6 --raid-devices=6 --backup-file=/root/raid5-backup
>
> dmesg reported:
> [691739.298345] md: bind<sdh1>
> [691739.364534] RAID conf printout:
> [691739.364537]  --- level:5 rd:4 wd:4
> [691739.364539]  disk 0, o:1, dev:sda1
> [691739.364540]  disk 1, o:1, dev:sdb1
> [691739.364541]  disk 2, o:1, dev:sde1
> [691739.364542]  disk 3, o:1, dev:sdd1
> [691741.832242] md: bind<sdi1>
> [691741.898470] RAID conf printout:
> [691741.898474]  --- level:5 rd:4 wd:4
> [691741.898476]  disk 0, o:1, dev:sda1
> [691741.898478]  disk 1, o:1, dev:sdb1
> [691741.898480]  disk 2, o:1, dev:sde1
> [691741.898481]  disk 3, o:1, dev:sdd1
> [691741.898482] RAID conf printout:
> [691741.898482]  --- level:5 rd:4 wd:4
> [691741.898484]  disk 0, o:1, dev:sda1
> [691741.898485]  disk 1, o:1, dev:sdb1
> [691741.898486]  disk 2, o:1, dev:sde1
> [691741.898487]  disk 3, o:1, dev:sdd1
> [691805.469105] md/raid:md0: device sdd1 operational as raid disk 3
> [691805.469110] md/raid:md0: device sde1 operational as raid disk 2
> [691805.469111] md/raid:md0: device sdb1 operational as raid disk 1
> [691805.469112] md/raid:md0: device sda1 operational as raid disk 0
> [691805.469551] md/raid:md0: allocated 5424kB
> [691805.506035] md/raid:md0: raid level 6 active with 4 out of 5 devices, algori
> thm 18
> [691805.506050] RAID conf printout:
> [691805.506051]  --- level:6 rd:5 wd:4
> [691805.506053]  disk 0, o:1, dev:sda1
> [691805.506054]  disk 1, o:1, dev:sdb1
> [691805.506055]  disk 2, o:1, dev:sde1
> [691805.506056]  disk 3, o:1, dev:sdd1
> [691805.847329] RAID conf printout:
> [691805.847333]  --- level:6 rd:6 wd:5
> [691805.847335]  disk 0, o:1, dev:sda1
> [691805.847336]  disk 1, o:1, dev:sdb1
> [691805.847337]  disk 2, o:1, dev:sde1
> [691805.847338]  disk 3, o:1, dev:sdd1
> [691805.847340]  disk 4, o:1, dev:sdi1
> [691805.847350] RAID conf printout:
> [691805.847350]  --- level:6 rd:6 wd:5
> [691805.847351]  disk 0, o:1, dev:sda1
> [691805.847352]  disk 1, o:1, dev:sdb1
> [691805.847353]  disk 2, o:1, dev:sde1
> [691805.847354]  disk 3, o:1, dev:sdd1
> [691805.847354]  disk 4, o:1, dev:sdi1
> [691805.847355]  disk 5, o:1, dev:sdh1
> [691805.847424] md: reshape of RAID array md0
> [691805.847426] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
> [691805.847428] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reshape.
> [691805.847439] md: using 128k window, over a total of 1953374208k.
>
> And nothing since.
>

^ permalink raw reply

* Re: [PATCH 3/8] block/floppy.c: handle blk_register_region() return value
From: kbuild test robot @ 2015-11-06 12:50 UTC (permalink / raw)
  Cc: kbuild-all, axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc, cpgs, vishu13285, pintu.k,
	rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-3-git-send-email-vishnu.ps@samsung.com>

[-- Attachment #1: Type: text/plain, Size: 1195 bytes --]

Hi Vishnu,

[auto build test ERROR on ide/master]
[also build test ERROR on v4.3]
[cannot apply to block/for-next next-20151106]

url:    https://github.com/0day-ci/linux/commits/Vishnu-Pratap-Singh/block-genhd-c-Add-error-handling/20151106-204249
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/ide.git master
config: x86_64-randconfig-x002-11051802 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/block/floppy.c: In function 'do_floppy_init':
>> drivers/block/floppy.c:4266:3: error: label 'out_fdc_region' used but not defined
      goto out_fdc_region;
      ^

vim +/out_fdc_region +4266 drivers/block/floppy.c

  4260	
  4261		fdc = 0;		/* reset fdc in case of unexpected interrupt */
  4262		err = floppy_grab_irq_and_dma();
  4263		if (err) {
  4264			cancel_delayed_work(&fd_timeout);
  4265			err = -EBUSY;
> 4266			goto out_fdc_region;
  4267		}
  4268	
  4269		/* initialise drive state */

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 28253 bytes --]

^ permalink raw reply

* [PATCH 8/8] ide/ide-probe.c: handle blk_register_region() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles blk_register_region() return value.
Earlier blk_register_region() function doesn't handle error
cases, now it is added, so the callers of this function
should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/ide/ide-probe.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 0b63fac..651eb05 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -917,9 +917,9 @@ static int exact_lock(dev_t dev, void *data)
 	return 0;
 }
 
-void ide_register_region(struct gendisk *disk)
+int ide_register_region(struct gendisk *disk)
 {
-	blk_register_region(MKDEV(disk->major, disk->first_minor),
+	return blk_register_region(MKDEV(disk->major, disk->first_minor),
 			    disk->minors, NULL, exact_match, exact_lock, disk);
 }
 
@@ -988,8 +988,9 @@ static int hwif_init(ide_hwif_t *hwif)
 		goto out;
 	}
 
-	blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
-			    THIS_MODULE, ata_probe, ata_lock, hwif);
+	if (blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
+			    THIS_MODULE, ata_probe, ata_lock, hwif))
+		goto out;
 	return 1;
 
 out:
-- 
1.9.1


^ permalink raw reply related

* [PATCH 7/8] cdrom/gdrom.c: handle add_disk() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles  add_disk() return value.
Earlier add_disk() function doesn't handle error
cases, now it is added, so the callers of this function
should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/cdrom/gdrom.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index 584bc31..38ca43a 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -817,9 +817,14 @@ static int probe_gdrom(struct platform_device *devptr)
 	gd.toc = kzalloc(sizeof(struct gdromtoc), GFP_KERNEL);
 	if (!gd.toc)
 		goto probe_fail_toc;
-	add_disk(gd.disk);
+	err = add_disk(gd.disk);
+	if (err)
+		goto probe_fail_add_disk;
+
 	return 0;
 
+probe_fail_add_disk:
+	kfree(gd.toc);
 probe_fail_toc:
 	blk_cleanup_queue(gd.gdrom_rq);
 probe_fail_requestq:
-- 
1.9.1


^ permalink raw reply related

* [PATCH 6/8] md/md.c: handle blk_register_region() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles blk_register_region() return value.
Earlier blk_register_region() function doesn't handle error
cases, now it is added, so the callers of this function
should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/md/md.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index a71b36f..244bb26 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8940,10 +8940,12 @@ static int __init md_init(void)
 		goto err_mdp;
 	mdp_major = ret;
 
-	blk_register_region(MKDEV(MD_MAJOR, 0), 512, THIS_MODULE,
-			    md_probe, NULL, NULL);
-	blk_register_region(MKDEV(mdp_major, 0), 1UL<<MINORBITS, THIS_MODULE,
-			    md_probe, NULL, NULL);
+	if (blk_register_region(MKDEV(MD_MAJOR, 0), 512, THIS_MODULE,
+			    md_probe, NULL, NULL))
+		goto err_md_blk;
+	if (blk_register_region(MKDEV(mdp_major, 0), 1UL<<MINORBITS,
+			    THIS_MODULE, md_probe, NULL, NULL))
+		goto err_mdp_blk;
 
 	register_reboot_notifier(&md_notifier);
 	raid_table_header = register_sysctl_table(raid_root_table);
@@ -8951,6 +8953,10 @@ static int __init md_init(void)
 	md_geninit();
 	return 0;
 
+err_mdp_blk:
+	blk_unregister_region(MKDEV(MD_MAJOR, 0), 512);
+err_md_blk:
+	unregister_blkdev(MD_MAJOR, "mdp");
 err_mdp:
 	unregister_blkdev(MD_MAJOR, "md");
 err_md:
-- 
1.9.1


^ permalink raw reply related

* [PATCH 5/8] zram: handle add_disk() & blk_register_region() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles blk_register_region() & add_disk() return value.
Earlier these function doesn't handle error cases, now it is added,
so the callers of this function should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/block/z2ram.c         | 12 ++++++++++--
 drivers/block/zram/zram_drv.c |  9 ++++++---
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index 968f9e5..85e841f 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -364,12 +364,20 @@ z2_init(void)
     sprintf(z2ram_gendisk->disk_name, "z2ram");
 
     z2ram_gendisk->queue = z2_queue;
-    add_disk(z2ram_gendisk);
-    blk_register_region(MKDEV(Z2RAM_MAJOR, 0), Z2MINOR_COUNT, THIS_MODULE,
+    ret = add_disk(z2ram_gendisk);
+    if (ret)
+	goto out_add_disk;
+
+    ret = blk_register_region(MKDEV(Z2RAM_MAJOR, 0), Z2MINOR_COUNT, THIS_MODULE,
 				z2_find, NULL, NULL);
+    if (ret)
+	goto out_blk_reg;
 
     return 0;
 
+out_blk_reg:
+	del_gendisk(z2ram_gendisk);
+out_add_disk:
 out_queue:
     put_disk(z2ram_gendisk);
 out_disk:
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 81a557c..f3d7a49 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -1261,14 +1261,16 @@ static int zram_add(void)
 		zram->disk->queue->limits.discard_zeroes_data = 0;
 	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, zram->disk->queue);
 
-	add_disk(zram->disk);
+	ret = add_disk(zram->disk);
+	if (ret)
+		goto out_free_disk;
 
 	ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj,
 				&zram_disk_attr_group);
 	if (ret < 0) {
 		pr_err("Error creating sysfs group for device %d\n",
 				device_id);
-		goto out_free_disk;
+		goto out_del_disk;
 	}
 	strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
 	zram->meta = NULL;
@@ -1277,8 +1279,9 @@ static int zram_add(void)
 	pr_info("Added device: %s\n", zram->disk->disk_name);
 	return device_id;
 
-out_free_disk:
+out_del_disk:
 	del_gendisk(zram->disk);
+out_free_disk:
 	put_disk(zram->disk);
 out_free_queue:
 	blk_cleanup_queue(queue);
-- 
1.9.1


^ permalink raw reply related

* [PATCH 4/8] block/loop.c: handle add_disk() & blk_register_region() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles blk_register_region() & add_disk() return value.
Earlier these function doesn't handle error cases, now it is added,
so the callers of this function should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/block/loop.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 423f4ca..22e6fd0 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1794,10 +1794,14 @@ static int loop_add(struct loop_device **l, int i)
 	disk->private_data	= lo;
 	disk->queue		= lo->lo_queue;
 	sprintf(disk->disk_name, "loop%d", i);
-	add_disk(disk);
+	err = add_disk(disk);
+	if (err)
+		goto out_free_disk;
 	*l = lo;
 	return lo->lo_number;
 
+out_free_disk:
+	put_disk(disk);
 out_free_queue:
 	blk_cleanup_queue(lo->lo_queue);
 out_cleanup_tags:
@@ -1998,8 +2002,10 @@ static int __init loop_init(void)
 		goto misc_out;
 	}
 
-	blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
+	err = blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
 				  THIS_MODULE, loop_probe, NULL, NULL);
+	if (err)
+		goto out_blkdev;
 
 	/* pre-create number of devices given by config or max_loop */
 	mutex_lock(&loop_index_mutex);
@@ -2010,6 +2016,8 @@ static int __init loop_init(void)
 	printk(KERN_INFO "loop: module loaded\n");
 	return 0;
 
+out_blkdev:
+	unregister_blkdev(LOOP_MAJOR, "loop");
 misc_out:
 	misc_deregister(&loop_misc);
 	return err;
-- 
1.9.1


^ permalink raw reply related

* [PATCH 3/8] block/floppy.c: handle blk_register_region() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles blk_register_region() return value.
Earlier blk_register_region() function doesn't handle error
cases, now it is added, so the callers of this function
should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/block/floppy.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 331363e..50802a6 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4219,8 +4219,10 @@ static int __init do_floppy_init(void)
 	if (err)
 		goto out_unreg_blkdev;
 
-	blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
+	err = blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
 			    floppy_find, NULL, NULL);
+	if (err)
+		goto out_unreg_region;
 
 	for (i = 0; i < 256; i++)
 		if (ITYPE(i))
@@ -4250,7 +4252,7 @@ static int __init do_floppy_init(void)
 	if (fdc_state[0].address == -1) {
 		cancel_delayed_work(&fd_timeout);
 		err = -ENODEV;
-		goto out_unreg_region;
+		goto out_fdc_err;
 	}
 #if N_FDC > 1
 	fdc_state[1].address = FDC2;
@@ -4261,7 +4263,7 @@ static int __init do_floppy_init(void)
 	if (err) {
 		cancel_delayed_work(&fd_timeout);
 		err = -EBUSY;
-		goto out_unreg_region;
+		goto out_fdc_region;
 	}
 
 	/* initialise drive state */
@@ -4357,8 +4359,9 @@ out_remove_drives:
 out_release_dma:
 	if (atomic_read(&usage_count))
 		floppy_release_irq_and_dma();
-out_unreg_region:
+out_fdc_err:
 	blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
+out_unreg_region:
 	platform_driver_unregister(&floppy_driver);
 out_unreg_blkdev:
 	unregister_blkdev(FLOPPY_MAJOR, "fd");
-- 
1.9.1


^ permalink raw reply related

* [PATCH 2/8] mmc: handle add_disk() return value
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <1446812535-10567-1-git-send-email-vishnu.ps@samsung.com>

This patch handles  add_disk() return value.
Earlier add_disk() function doesn't handle error
cases, now it is added, so the callers of this function
should also handle it.

Verfied on X86 based ubuntu machine.
This patch depends on [PATCH 1/8] block/genhd.c: Add error handling

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 drivers/mmc/card/block.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 23b6c8e..543c670 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -2432,7 +2432,10 @@ static int mmc_add_disk(struct mmc_blk_data *md)
 	int ret;
 	struct mmc_card *card = md->queue.card;
 
-	add_disk(md->disk);
+	ret = add_disk(md->disk);
+	if (ret)
+		goto add_disk_fail;
+
 	md->force_ro.show = force_ro_show;
 	md->force_ro.store = force_ro_store;
 	sysfs_attr_init(&md->force_ro.attr);
@@ -2468,7 +2471,7 @@ power_ro_lock_fail:
 	device_remove_file(disk_to_dev(md->disk), &md->force_ro);
 force_ro_fail:
 	del_gendisk(md->disk);
-
+add_disk_fail:
 	return ret;
 }
 
-- 
1.9.1


^ permalink raw reply related

* [PATCH 1/8] block/genhd.c: Add error handling
From: Vishnu Pratap Singh @ 2015-11-06 12:22 UTC (permalink / raw)
  To: axboe, akpm, linux-kernel, jmoyer, minchan, ngupta,
	sergey.senozhatsky.work, davem, neilb, ulf.hansson, tiwai, hare,
	ming.lei, jarod, viro, tj, adrian.hunter, jonathanh, grundler,
	linux-ide, linux-raid, linux-mmc
  Cc: cpgs, vishu13285, pintu.k, rohit.kr, Vishnu Pratap Singh
In-Reply-To: <437969438-9181-1-git-send-email-vishnu.ps@samsung.com>

This patch adds error handling for blk_register_region(), register_disk(),
add_disk(), disk_alloc_events() & disk_add_events().
add_disk() & register_disk() functions  error handling is very much needed
as this is used mainly by many modules like mmc, zram, mtd, scsi etc.
But there is no error handling and it may cause stability issues also.

Verfied on X86 based ubuntu machine.

Signed-off-by: Vishnu Pratap Singh <vishnu.ps@samsung.com>
---
 block/genhd.c         | 89 +++++++++++++++++++++++++++++++++++----------------
 include/linux/genhd.h |  4 +--
 2 files changed, 64 insertions(+), 29 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index 3213b66..a63ebd6 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -39,8 +39,8 @@ static struct device_type disk_type;
 
 static void disk_check_events(struct disk_events *ev,
 			      unsigned int *clearing_ptr);
-static void disk_alloc_events(struct gendisk *disk);
-static void disk_add_events(struct gendisk *disk);
+static int disk_alloc_events(struct gendisk *disk);
+static int disk_add_events(struct gendisk *disk);
 static void disk_del_events(struct gendisk *disk);
 static void disk_release_events(struct gendisk *disk);
 
@@ -473,11 +473,11 @@ static char *bdevt_str(dev_t devt, char *buf)
  * range must be nonzero
  * The hash chain is sorted on range, so that subranges can override.
  */
-void blk_register_region(dev_t devt, unsigned long range, struct module *module,
+int blk_register_region(dev_t devt, unsigned long range, struct module *module,
 			 struct kobject *(*probe)(dev_t, int *, void *),
 			 int (*lock)(dev_t, void *), void *data)
 {
-	kobj_map(bdev_map, devt, range, module, probe, lock, data);
+	return kobj_map(bdev_map, devt, range, module, probe, lock, data);
 }
 
 EXPORT_SYMBOL(blk_register_region);
@@ -505,7 +505,7 @@ static int exact_lock(dev_t devt, void *data)
 	return 0;
 }
 
-static void register_disk(struct gendisk *disk)
+static int register_disk(struct gendisk *disk)
 {
 	struct device *ddev = disk_to_dev(disk);
 	struct block_device *bdev;
@@ -520,14 +520,15 @@ static void register_disk(struct gendisk *disk)
 	/* delay uevents, until we scanned partition table */
 	dev_set_uevent_suppress(ddev, 1);
 
-	if (device_add(ddev))
-		return;
+	err = device_add(ddev);
+	if (err)
+		return err;
 	if (!sysfs_deprecated) {
 		err = sysfs_create_link(block_depr, &ddev->kobj,
 					kobject_name(&ddev->kobj));
 		if (err) {
 			device_del(ddev);
-			return;
+			return err;
 		}
 	}
 
@@ -569,6 +570,7 @@ exit:
 	while ((part = disk_part_iter_next(&piter)))
 		kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
 	disk_part_iter_exit(&piter);
+	return err;
 }
 
 /**
@@ -577,10 +579,8 @@ exit:
  *
  * This function registers the partitioning information in @disk
  * with the kernel.
- *
- * FIXME: error handling
  */
-void add_disk(struct gendisk *disk)
+int add_disk(struct gendisk *disk)
 {
 	struct backing_dev_info *bdi;
 	dev_t devt;
@@ -598,7 +598,7 @@ void add_disk(struct gendisk *disk)
 	retval = blk_alloc_devt(&disk->part0, &devt);
 	if (retval) {
 		WARN_ON(1);
-		return;
+		return retval;
 	}
 	disk_to_dev(disk)->devt = devt;
 
@@ -608,17 +608,27 @@ void add_disk(struct gendisk *disk)
 	disk->major = MAJOR(devt);
 	disk->first_minor = MINOR(devt);
 
-	disk_alloc_events(disk);
-
+	retval = disk_alloc_events(disk);
+	if (retval)
+		goto err_blk_devt;
 	/* Register BDI before referencing it from bdev */
 	bdi = &disk->queue->backing_dev_info;
-	bdi_register_dev(bdi, disk_devt(disk));
+	retval = bdi_register_dev(bdi, disk_devt(disk));
+	if (retval)
+		goto err_alloc_event;
 
-	blk_register_region(disk_devt(disk), disk->minors, NULL,
+	retval = blk_register_region(disk_devt(disk), disk->minors, NULL,
 			    exact_match, exact_lock, disk);
-	register_disk(disk);
-	blk_register_queue(disk);
+	if (retval)
+		goto err_alloc_event;
+
+	retval = register_disk(disk);
+	if (retval)
+		goto err_reg_region;
 
+	retval = blk_register_queue(disk);
+	if (retval)
+		goto err_reg_disk;
 	/*
 	 * Take an extra ref on queue which will be put on disk_release()
 	 * so that it sticks around as long as @disk is there.
@@ -627,9 +637,28 @@ void add_disk(struct gendisk *disk)
 
 	retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
 				   "bdi");
-	WARN_ON(retval);
+	if (retval)
+		goto err_blk_reg_queue;
+
+	retval = disk_add_events(disk);
+	if (retval)
+		goto err_sysfs;
 
-	disk_add_events(disk);
+	return 0;
+
+err_blk_devt:
+	blk_free_devt(devt);
+err_alloc_event:
+	disk_del_events(disk);
+err_reg_region:
+	blk_unregister_region(disk_devt(disk), disk->minors);
+err_reg_disk:
+	del_gendisk(disk);
+err_blk_reg_queue:
+	blk_unregister_queue(disk);
+err_sysfs:
+	sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
+	return retval;
 }
 EXPORT_SYMBOL(add_disk);
 
@@ -1782,17 +1811,17 @@ module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops,
 /*
  * disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
  */
-static void disk_alloc_events(struct gendisk *disk)
+static int disk_alloc_events(struct gendisk *disk)
 {
 	struct disk_events *ev;
 
 	if (!disk->fops->check_events)
-		return;
+		return 0;
 
 	ev = kzalloc(sizeof(*ev), GFP_KERNEL);
 	if (!ev) {
 		pr_warn("%s: failed to initialize events\n", disk->disk_name);
-		return;
+		return -ENOMEM;
 	}
 
 	INIT_LIST_HEAD(&ev->node);
@@ -1804,17 +1833,22 @@ static void disk_alloc_events(struct gendisk *disk)
 	INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
 
 	disk->ev = ev;
+	return 0;
 }
 
-static void disk_add_events(struct gendisk *disk)
+static int disk_add_events(struct gendisk *disk)
 {
+	int ret = 0;
+
 	if (!disk->ev)
-		return;
+		return ret;
 
-	/* FIXME: error handling */
-	if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0)
+	ret = sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs);
+	if (ret) {
 		pr_warn("%s: failed to create sysfs files for events\n",
 			disk->disk_name);
+		return ret;
+	}
 
 	mutex_lock(&disk_events_mutex);
 	list_add_tail(&disk->ev->node, &disk_events);
@@ -1825,6 +1859,7 @@ static void disk_add_events(struct gendisk *disk)
 	 * unblock kicks it into action.
 	 */
 	__disk_unblock_events(disk, true);
+	return ret;
 }
 
 static void disk_del_events(struct gendisk *disk)
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 2adbfa6..dae3160 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -417,7 +417,7 @@ static inline void free_part_info(struct hd_struct *part)
 extern void part_round_stats(int cpu, struct hd_struct *part);
 
 /* block/genhd.c */
-extern void add_disk(struct gendisk *disk);
+extern int add_disk(struct gendisk *disk);
 extern void del_gendisk(struct gendisk *gp);
 extern struct gendisk *get_gendisk(dev_t dev, int *partno);
 extern struct block_device *bdget_disk(struct gendisk *disk, int partno);
@@ -620,7 +620,7 @@ extern struct gendisk *alloc_disk_node(int minors, int node_id);
 extern struct gendisk *alloc_disk(int minors);
 extern struct kobject *get_disk(struct gendisk *disk);
 extern void put_disk(struct gendisk *disk);
-extern void blk_register_region(dev_t devt, unsigned long range,
+extern int blk_register_region(dev_t devt, unsigned long range,
 			struct module *module,
 			struct kobject *(*probe)(dev_t, int *, void *),
 			int (*lock)(dev_t, void *),
-- 
1.9.1


^ permalink raw reply related

* Stop resync operation
From: d4lamar @ 2015-11-06  6:44 UTC (permalink / raw)
  To: linux-raid

Dear Developers,

I have a question for you.

I have a raid10 md array:

Is it theoretically possible to stop a running resync operation and
mark the array as clean without stopping the array ?

I do not want the resync to be respawned automatically.

Thanks and Best Regards,
d4lamar

^ permalink raw reply

* [PATCH 6/6] md-cluster: Allow spare devices to be marked as faulty
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Goldwyn Rodrigues
In-Reply-To: <1446781819-25571-1-git-send-email-rgoldwyn@suse.de>

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

If a spare device was marked faulty, it would not be reflected
in receiving nodes because it would mark it as activated and continue.
Continue the operation, so it may be set as faulty.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 drivers/md/md.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 4222285..b98cf04 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -9013,7 +9013,6 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
 				ret = remove_and_add_spares(mddev, rdev2);
 				pr_info("Activated spare: %s\n",
 						bdevname(rdev2->bdev,b));
-				continue;
 			}
 			/* device faulty
 			 * We just want to do the minimum to mark the disk
-- 
1.8.5.6


^ permalink raw reply related

* [PATCH 5/6] md-cluster: Fix the remove sequence with the new MD reload code
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Goldwyn Rodrigues, Guoqing Jiang
In-Reply-To: <1446781819-25571-1-git-send-email-rgoldwyn@suse.de>

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

The remove disk message does not need metadata_update_start(), but
can be an independent message.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
---
 drivers/md/md-cluster.c | 2 +-
 drivers/md/md.c         | 9 +--------
 2 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index 9a36ad6..33f5d7a 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -1018,7 +1018,7 @@ static int remove_disk(struct mddev *mddev, struct md_rdev *rdev)
 	struct md_cluster_info *cinfo = mddev->cluster_info;
 	cmsg.type = cpu_to_le32(REMOVE);
 	cmsg.raid_slot = cpu_to_le32(rdev->desc_nr);
-	return __sendmsg(cinfo, &cmsg);
+	return sendmsg(cinfo, &cmsg);
 }
 
 static int gather_bitmaps(struct md_rdev *rdev)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 65b6326..4222285 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -6045,15 +6045,11 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
 {
 	char b[BDEVNAME_SIZE];
 	struct md_rdev *rdev;
-	int ret = -1;
 
 	rdev = find_rdev(mddev, dev);
 	if (!rdev)
 		return -ENXIO;
 
-	if (mddev_is_clustered(mddev))
-		ret = md_cluster_ops->metadata_update_start(mddev);
-
 	if (rdev->raid_disk < 0)
 		goto kick_rdev;
 
@@ -6064,7 +6060,7 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
 		goto busy;
 
 kick_rdev:
-	if (mddev_is_clustered(mddev) && ret == 0)
+	if (mddev_is_clustered(mddev))
 		md_cluster_ops->remove_disk(mddev, rdev);
 
 	md_kick_rdev_from_array(rdev);
@@ -6073,9 +6069,6 @@ kick_rdev:
 
 	return 0;
 busy:
-	if (mddev_is_clustered(mddev) && ret == 0)
-		md_cluster_ops->metadata_update_cancel(mddev);
-
 	printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n",
 		bdevname(rdev->bdev,b), mdname(mddev));
 	return -EBUSY;
-- 
1.8.5.6


^ permalink raw reply related

* [PATCH 4/6] md-cluster: Defer MD reloading to mddev->thread
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Goldwyn Rodrigues
In-Reply-To: <1446781819-25571-1-git-send-email-rgoldwyn@suse.de>

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

Reloading of superblock must be performed under reconfig_mutex. However,
this cannot be done with md_reload_sb because it would deadlock with
the message DLM lock. So, we defer it in md_check_recovery() which is
executed by mddev->thread.

This introduces a new flag, MD_RELOAD_SB, which if set, will reload the
superblock.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 drivers/md/md-cluster.c | 12 +++++++++++-
 drivers/md/md-cluster.h |  1 +
 drivers/md/md.c         |  3 +++
 drivers/md/md.h         |  3 +++
 4 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index a681706..9a36ad6 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -71,6 +71,7 @@ struct md_cluster_info {
 	struct md_thread *recv_thread;
 	struct completion newdisk_completion;
 	unsigned long state;
+	atomic_t good_device_nr;
 };
 
 enum msg_type {
@@ -434,8 +435,10 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
 static void process_metadata_update(struct mddev *mddev, struct cluster_msg *msg)
 {
 	struct md_cluster_info *cinfo = mddev->cluster_info;
-	md_reload_sb(mddev, le32_to_cpu(msg->raid_slot));
+	atomic_set(&cinfo->good_device_nr, le32_to_cpu(msg->raid_slot));
+	set_bit(MD_RELOAD_SB, &mddev->flags);
 	dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_CR);
+	md_wakeup_thread(mddev->thread);
 }
 
 static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
@@ -1047,6 +1050,12 @@ out:
 	return err;
 }
 
+static int good_device_nr(struct mddev *mddev)
+{
+	struct md_cluster_info *cinfo = mddev->cluster_info;
+	return atomic_read(&cinfo->good_device_nr);
+}
+
 static struct md_cluster_operations cluster_ops = {
 	.join   = join,
 	.leave  = leave,
@@ -1063,6 +1072,7 @@ static struct md_cluster_operations cluster_ops = {
 	.new_disk_ack = new_disk_ack,
 	.remove_disk = remove_disk,
 	.gather_bitmaps = gather_bitmaps,
+	.good_device_nr = good_device_nr,
 };
 
 static int __init cluster_init(void)
diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h
index e75ea26..c699c6c 100644
--- a/drivers/md/md-cluster.h
+++ b/drivers/md/md-cluster.h
@@ -24,6 +24,7 @@ struct md_cluster_operations {
 	int (*new_disk_ack)(struct mddev *mddev, bool ack);
 	int (*remove_disk)(struct mddev *mddev, struct md_rdev *rdev);
 	int (*gather_bitmaps)(struct md_rdev *rdev);
+	int (*good_device_nr)(struct mddev *mddev);
 };
 
 #endif /* _MD_CLUSTER_H */
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 32ca592..65b6326 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8184,6 +8184,7 @@ void md_check_recovery(struct mddev *mddev)
 		(mddev->flags & MD_UPDATE_SB_FLAGS & ~ (1<<MD_CHANGE_PENDING)) ||
 		test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
 		test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
+		test_bit(MD_RELOAD_SB, &mddev->flags) ||
 		(mddev->external == 0 && mddev->safemode == 1) ||
 		(mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)
 		 && !mddev->in_sync && mddev->recovery_cp == MaxSector)
@@ -8232,6 +8233,8 @@ void md_check_recovery(struct mddev *mddev)
 						rdev->raid_disk < 0)
 					md_kick_rdev_from_array(rdev);
 			}
+			if (test_and_clear_bit(MD_RELOAD_SB, &mddev->flags))
+				md_reload_sb(mddev, md_cluster_ops->good_device_nr(mddev));
 		}
 
 		if (!mddev->external) {
diff --git a/drivers/md/md.h b/drivers/md/md.h
index db54341..f89866d 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -222,6 +222,9 @@ struct mddev {
 #define MD_STILL_CLOSED	4	/* If set, then array has not been opened since
 				 * md_ioctl checked on it.
 				 */
+#define MD_RELOAD_SB	5	/* Reload the superblock because another node
+				 * updated it.
+				 */
 
 	int				suspended;
 	atomic_t			active_io;
-- 
1.8.5.6


^ permalink raw reply related

* [PATCH 3/6] md-cluster: remove a disk asynchronously from cluster environment
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Guoqing Jiang, Goldwyn Rodrigues
In-Reply-To: <1446781819-25571-1-git-send-email-rgoldwyn@suse.de>

From: Guoqing Jiang <gqjiang@suse.com>

For cluster raid, if one disk couldn't be reach in one node, then
other nodes would receive the REMOVE message for the disk.

In receiving node, we can't call md_kick_rdev_from_array to remove
the disk from array synchronously since the disk might still be busy
in this node. So let's set a ClusterRemove flag on the disk, then
let the thread to do the removal job eventually.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 drivers/md/md-cluster.c |  7 +++++--
 drivers/md/md.c         | 12 ++++++++++++
 drivers/md/md.h         |  1 +
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index 3daa464..a681706 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -443,8 +443,11 @@ static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
 	struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
 						   le32_to_cpu(msg->raid_slot));
 
-	if (rdev)
-		md_kick_rdev_from_array(rdev);
+	if (rdev) {
+		set_bit(ClusterRemove, &rdev->flags);
+		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+		md_wakeup_thread(mddev->thread);
+	}
 	else
 		pr_warn("%s: %d Could not find disk(%d) to REMOVE\n",
 			__func__, __LINE__, le32_to_cpu(msg->raid_slot));
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 44d0342..32ca592 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8222,6 +8222,18 @@ void md_check_recovery(struct mddev *mddev)
 			goto unlock;
 		}
 
+		if (mddev_is_clustered(mddev)) {
+			struct md_rdev *rdev;
+			/* kick the device if another node issued a
+			 * remove disk.
+			 */
+			rdev_for_each(rdev, mddev) {
+				if (test_and_clear_bit(ClusterRemove, &rdev->flags) &&
+						rdev->raid_disk < 0)
+					md_kick_rdev_from_array(rdev);
+			}
+		}
+
 		if (!mddev->external) {
 			int did_change = 0;
 			spin_lock(&mddev->lock);
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 2ea0035..db54341 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -172,6 +172,7 @@ enum flag_bits {
 				 * This device is seen locally but not
 				 * by the whole cluster
 				 */
+	ClusterRemove,
 };
 
 #define BB_LEN_MASK	(0x00000000000001FFULL)
-- 
1.8.5.6


^ permalink raw reply related

* [PATCH 2/6] md-cluster: Avoid the resync ping-pong
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Goldwyn Rodrigues
In-Reply-To: <1446781819-25571-1-git-send-email-rgoldwyn@suse.de>

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

If a RESYNCING message with (0,0) has been sent before, do not send it
again. This avoids a resync ping pong between the nodes. We read
the bitmap lockresource's LVB to figure out the previous value
of the RESYNCING message.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 drivers/md/md-cluster.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index a93734e..3daa464 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -898,8 +898,16 @@ static int resync_start(struct mddev *mddev)
 static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
 {
 	struct md_cluster_info *cinfo = mddev->cluster_info;
+	struct resync_info ri;
 	struct cluster_msg cmsg = {0};
 
+	/* do not send zero again, if we have sent before */
+	if (hi == 0) {
+		memcpy(&ri, cinfo->bitmap_lockres->lksb.sb_lvbptr, sizeof(struct resync_info));
+		if (le64_to_cpu(ri.hi) == 0)
+			return 0;
+	}
+
 	add_resync_info(mddev, cinfo->bitmap_lockres, lo, hi);
 	/* Re-acquire the lock to refresh LVB */
 	dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW);
-- 
1.8.5.6


^ permalink raw reply related

* [PATCH 1/6] md-cluster: Protect communication with mutexes
From: rgoldwyn @ 2015-11-06  3:50 UTC (permalink / raw)
  To: neilb, linux-raid; +Cc: Goldwyn Rodrigues

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

Communication can happen through multiple threads. It is possible that
one thread steps over another threads sequence. So, we use mutexes to
protect both the send and receive sequences.

We use a new flag CLUSTER_MD_COMM_LOCKED which is used to detect
if communication is already locked. This is useful for cases where we need to
take and hold the token DLM lock for a while. This bit is set only
after locking communication.

Also, Remove stray/ununsed sb_mutex.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 drivers/md/md-cluster.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index b73729b..a93734e 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -47,6 +47,7 @@ struct resync_info {
 #define		MD_CLUSTER_WAITING_FOR_NEWDISK		1
 #define		MD_CLUSTER_SUSPEND_READ_BALANCING	2
 #define		MD_CLUSTER_BEGIN_JOIN_CLUSTER		3
+#define		MD_CLUSTER_COMM_LOCKED			4
 
 
 struct md_cluster_info {
@@ -54,7 +55,8 @@ struct md_cluster_info {
 	dlm_lockspace_t *lockspace;
 	int slot_number;
 	struct completion completion;
-	struct mutex sb_mutex;
+	struct mutex recv_mutex;
+	struct mutex send_mutex;
 	struct dlm_lock_resource *bitmap_lockres;
 	struct dlm_lock_resource *resync_lockres;
 	struct list_head suspend_list;
@@ -503,6 +505,7 @@ static void recv_daemon(struct md_thread *thread)
 	struct cluster_msg msg;
 	int ret;
 
+	mutex_lock(&cinfo->recv_mutex);
 	/*get CR on Message*/
 	if (dlm_lock_sync(message_lockres, DLM_LOCK_CR)) {
 		pr_err("md/raid1:failed to get CR on MESSAGE\n");
@@ -529,6 +532,7 @@ static void recv_daemon(struct md_thread *thread)
 	ret = dlm_unlock_sync(message_lockres);
 	if (unlikely(ret != 0))
 		pr_info("unlock msg failed return %d\n", ret);
+	mutex_unlock(&cinfo->recv_mutex);
 }
 
 /* lock_comm()
@@ -542,20 +546,22 @@ static int lock_comm(struct md_cluster_info *cinfo)
 {
 	int error;
 
-	if (cinfo->token_lockres->mode == DLM_LOCK_EX)
-		return 0;
+	mutex_lock(&cinfo->send_mutex);
 
 	error = dlm_lock_sync(cinfo->token_lockres, DLM_LOCK_EX);
 	if (error)
 		pr_err("md-cluster(%s:%d): failed to get EX on TOKEN (%d)\n",
 				__func__, __LINE__, error);
+	mutex_lock(&cinfo->recv_mutex);
 	return error;
 }
 
 static void unlock_comm(struct md_cluster_info *cinfo)
 {
 	WARN_ON(cinfo->token_lockres->mode != DLM_LOCK_EX);
+	mutex_unlock(&cinfo->recv_mutex);
 	dlm_unlock_sync(cinfo->token_lockres);
+	mutex_unlock(&cinfo->send_mutex);
 }
 
 /* __sendmsg()
@@ -709,7 +715,8 @@ static int join(struct mddev *mddev, int nodes)
 	init_completion(&cinfo->completion);
 	set_bit(MD_CLUSTER_BEGIN_JOIN_CLUSTER, &cinfo->state);
 
-	mutex_init(&cinfo->sb_mutex);
+	mutex_init(&cinfo->send_mutex);
+	mutex_init(&cinfo->recv_mutex);
 	mddev->cluster_info = cinfo;
 
 	memset(str, 0, 64);
@@ -839,7 +846,12 @@ static int slot_number(struct mddev *mddev)
 
 static int metadata_update_start(struct mddev *mddev)
 {
-	return lock_comm(mddev->cluster_info);
+	struct md_cluster_info *cinfo = mddev->cluster_info;
+	int ret;
+	if (test_and_clear_bit(MD_CLUSTER_COMM_LOCKED, &cinfo->state))
+		return 0;
+	ret = lock_comm(cinfo);
+	return ret;
 }
 
 static int metadata_update_finish(struct mddev *mddev)
@@ -864,6 +876,7 @@ static int metadata_update_finish(struct mddev *mddev)
 		ret = __sendmsg(cinfo, &cmsg);
 	} else
 		pr_warn("md-cluster: No good device id found to send\n");
+	clear_bit(MD_CLUSTER_COMM_LOCKED, &cinfo->state);
 	unlock_comm(cinfo);
 	return ret;
 }
@@ -871,6 +884,7 @@ static int metadata_update_finish(struct mddev *mddev)
 static void metadata_update_cancel(struct mddev *mddev)
 {
 	struct md_cluster_info *cinfo = mddev->cluster_info;
+	clear_bit(MD_CLUSTER_COMM_LOCKED, &cinfo->state);
 	unlock_comm(cinfo);
 }
 
@@ -945,6 +959,7 @@ static int add_new_disk(struct mddev *mddev, struct md_rdev *rdev)
 	memcpy(cmsg.uuid, uuid, 16);
 	cmsg.raid_slot = cpu_to_le32(rdev->desc_nr);
 	lock_comm(cinfo);
+	set_bit(MD_CLUSTER_COMM_LOCKED, &cinfo->state);
 	ret = __sendmsg(cinfo, &cmsg);
 	if (ret)
 		return ret;
@@ -964,6 +979,7 @@ static int add_new_disk(struct mddev *mddev, struct md_rdev *rdev)
 static void add_new_disk_cancel(struct mddev *mddev)
 {
 	struct md_cluster_info *cinfo = mddev->cluster_info;
+	clear_bit(MD_CLUSTER_COMM_LOCKED, &cinfo->state);
 	unlock_comm(cinfo);
 }
 
-- 
1.8.5.6


^ permalink raw reply related

* Re: [PATCH] raid5-cache: add crc32c Kconfig dependency
From: Neil Brown @ 2015-11-06  3:19 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Shaohua Li, Bart Van Assche, linux-raid, linux-kernel,
	linux-arm-kernel
In-Reply-To: <4308930.z8rrqMJU90@wuerfel>

[-- Attachment #1: Type: text/plain, Size: 869 bytes --]

On Wed, Nov 04 2015, Arnd Bergmann wrote:

> The recent change of the raid5-cache code to use crc32c instead
> of crc32 causes link errors when CONFIG_LIBCRC32C is disabled:
>
> drivers/built-in.o: In function crc32c'
> core.c:(.text+0x1c6060): undefined reference to `crc32c'
>
> This adds an explicit 'select' statement like all other users
> of this function do.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Fixes: 5cb2fbd6ea0d ("raid5-cache: use crc32c checksum")
>
> diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
> index 3e01e6fb3424..7913fdcfc849 100644
> --- a/drivers/md/Kconfig
> +++ b/drivers/md/Kconfig
> @@ -123,6 +123,7 @@ config MD_RAID456
>  	tristate "RAID-4/RAID-5/RAID-6 mode"
>  	depends on BLK_DEV_MD
>  	select RAID6_PQ
> +	select LIBCRC32C
>  	select ASYNC_MEMCPY
>  	select ASYNC_XOR
>  	select ASYNC_PQ

Applied, thanks,

NeilBrown

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

^ permalink raw reply

* Re: [PATCH] md/raid5: remove redundant check in stripe_add_to_batch_list()
From: Neil Brown @ 2015-11-06  0:42 UTC (permalink / raw)
  To: linux-kernel; +Cc: Roman Gushchin, linux-raid
In-Reply-To: <1446458813-6502-1-git-send-email-klamm@yandex-team.ru>

[-- Attachment #1: Type: text/plain, Size: 1551 bytes --]

On Mon, Nov 02 2015, Roman Gushchin wrote:

> The stripe_add_to_batch_list() function is called only if
> stripe_can_batch() returned true, so there is no need for double check.
>
> Signed-off-by: Roman Gushchin <klamm@yandex-team.ru>
> Cc: Neil Brown <neilb@suse.com>
> Cc: linux-raid@vger.kernel.org
> ---
>  drivers/md/raid5.c | 2 --
>  1 file changed, 2 deletions(-)
>
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index 45933c1..f829ebc 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -768,8 +768,6 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
>  	int hash;
>  	int dd_idx;
>  
> -	if (!stripe_can_batch(sh))
> -		return;
>  	/* Don't cross chunks, so stripe pd_idx/qd_idx is the same */
>  	tmp_sec = sh->sector;
>  	if (!sector_div(tmp_sec, conf->chunk_sectors))
> -- 
> 2.4.3

applied, thanks.

(for future reference, public mailing lists like linux-raid aren't
usually mentioned on a 'Cc:' line in a patch.
Documentation/SubmittingPatches suggests:

  If a person has had the opportunity to comment on a patch, but has not
  provided such comments, you may optionally add a "Cc:" tag to the patch.
  This is the only tag which might be added without an explicit action by the
  person it names - but it should indicate that this person was copied on the
  patch.  This tag documents that potentially interested parties
  have been included in the discussion.

so it is primarily for third-party individuals
)

Thanks,
NeilBrown

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox