All of lore.kernel.org
 help / color / mirror / Atom feed
* status of spdk
From: Yehuda Sadeh-Weinraub @ 2016-11-08 23:31 UTC (permalink / raw)
  To: Wang, Haomai, Weil, Sage; +Cc: ceph-devel

I just started looking at spdk, and have a few comments and questions.

First, it's not clear to me how we should handle build. At the moment
the spdk code resides as a submodule in the ceph tree, but it depends
on dpdk, which currently needs to be downloaded separately. We can add
it as a submodule (upstream is here: git://dpdk.org/dpdk). That been
said, getting it to build was a bit tricky and I think it might be
broken with cmake. In order to get it working I resorted to building a
system library and use that.

The way to currently configure an osd to use bluestore with spdk is by
creating a symbolic link that replaces the bluestore 'block' device to
point to a file that has a name that is prefixed with 'spdk:'.
Originally I assumed that the suffix would be the nvme device id, but
it seems that it's not really needed, however, the file itself needs
to contain the device id (see
https://github.com/yehudasa/ceph/tree/wip-yehuda-spdk for a couple of
minor fixes).

As I understand it, in order to support multiple osds on the same NVMe
device we have a few options. We can leverage NVMe namespaces, but
that's not supported on all devices. We can configure bluestore to
only use part of the device (device sharding? not sure if it supports
it). I think it's best if we could keep bluestore out of the loop
there and have the NVMe driver abstract multiple partitions of the
NVMe device. The idea is to be able to define multiple partitions on
the device (e.g., each partition will be defined by the offset, size,
and namespace), and have the osd set to use a specific partition.
We'll probably need a special tool to manage it, and potentially keep
the partition table information on the device itself. The tool could
also manage the creation of the block link. We should probably rethink
how the link is structure and what it points at.

Any thoughts?

Yehuda

^ permalink raw reply

* Re: [conntrack-tools PATCH 1/3] log: introduce a mechanism to know if log was initialized
From: Pablo Neira Ayuso @ 2016-11-08 23:30 UTC (permalink / raw)
  To: Arturo Borrero Gonzalez; +Cc: netfilter-devel
In-Reply-To: <147825582201.31164.6123720868667079634.stgit@nfdev2.cica.es>

On Fri, Nov 04, 2016 at 11:37:02AM +0100, Arturo Borrero Gonzalez wrote:
> This will allow to call dlog() function from all the points in the
> execution at runtime.
> 
> If the log was not initialized, then we just fprintf and return.
> 
> By now, we can't init the log engine earlier because we require config
> from the user, so there is a egg-chicken problem.
> This means that we can't log parsing messages to logfiles but only to
> stderr/stdout.

Series applied, thanks Arturo.

A couple of things that would be good to revisit, just for the record:

1) Get rid of deprecated stuff. By digging into the git log history I
   guess you can probably find that they have been deprecated since
   ~2008, so it's been already enough time for people to update
   configuration files.

2) Make sure the configuration parser works fine with defaults, I mean
   with the bare minimum configuration. I remember reports from people
   that wrote configuration files from scratch, that were not working.
   So I pointed them to the example files to use as template.

Thanks.

^ permalink raw reply

* Re: [RFC] PCI: Fix kernel panic of root-port-less PCIe enum due to ASPM
From: Bjorn Helgaas @ 2016-11-08 23:29 UTC (permalink / raw)
  To: Serge Semin
  Cc: bhelgaas, shawn.lin, luto, Sergey.Semin, linux-pci, linux-kernel
In-Reply-To: <1475746455-20665-1-git-send-email-fancer.lancer@gmail.com>

Hi Serge,

On Thu, Oct 06, 2016 at 12:34:15PM +0300, Serge Semin wrote:
> Hello linux folks,
> 
>     Sometime ago I discovered a kernel panic popping up when PCI subsystem was
> trying to enumerate PCI express bus with ASPM service enabled. Here it is:
> 
> [    5.089667] CPU 0 Unable to handle kernel paging request at virtual
> address 00000060, epc == 80317004, ra == 80316ac8
> [    5.120952] Oops[#1]:
>           ...
> [    5.528438] Call Trace:
> [    5.535640] [<80317004>] pcie_aspm_init_link_state+0x6c0/0x814
> [    5.552843] [<80300c44>] pci_scan_slot+0x140/0x148
> [    5.566957] [<80301dcc>] pci_scan_child_bus+0x50/0x1b0
> [    5.582096] [<80301944>] pci_scan_bridge+0x25c/0x694
> [    5.596724] [<80301e78>] pci_scan_child_bus+0xfc/0x1b0
> [    5.611862] [<80301944>] pci_scan_bridge+0x25c/0x694
> [    5.626488] [<80301e78>] pci_scan_child_bus+0xfc/0x1b0
> [    5.641628] [<8030215c>] pci_scan_root_bus+0x64/0x124
> [    5.656528] [<804ca298>] pcibios_scanbus+0xa8/0x188
> 
>     I more than sure you are familiar with the issue, since I've found the
> mailing discussion: "PCI: avoid NULL deref in alloc_pcie_link_state"
> https://patchwork.kernel.org/patch/2751651/
> https://bugzilla.kernel.org/show_bug.cgi?id=60111

I'm trying to puzzle out a few things here.  Maybe you can help me out?

- Does this issue exist in current upstream kernels?  Your dmesg shows a
  v3.19-based kernel.  c8fc9339409d ("PCI/ASPM: Use dev->has_secondary_link
  to find downstream links"), which appeared in v4.2, fixes a problem very
  similar to what you're reporting.

- When we dereference the NULL pointer, which device did we call
  pcie_aspm_init_link_state() for?

- https://bugzilla.kernel.org/attachment.cgi?id=240981 is the failing dmesg
  log, and it shows "vgaarb: device added: PCI:0000:04:00.0".
  
  Your lspci output (https://bugzilla.kernel.org/attachment.cgi?id=241001)
  shows 04:00.0 is a downstream port, but vga_arbiter_add_pci_device() only
  prints that message for VGA class devices.

  https://bugzilla.kernel.org/attachment.cgi?id=240991, the successful
  dmesg log, shows "vgaarb: device added: PCI:0000:06:00.0".  That makes
  more sense because 06:00.0 is class 0300, which is a VGA device.

Bjorn

^ permalink raw reply

* Re: FAILED: patch "[PATCH] tpm: remove invalid min length check from tpm_do_selftest()" failed to apply to 4.8-stable tree
From: Jarkko Sakkinen @ 2016-11-08 23:29 UTC (permalink / raw)
  To: gregkh; +Cc: james.l.morris, stable
In-Reply-To: <20161108232806.bcvpb6byh5ucjwdy@intel.com>

Adding stable@vger.kernel.org to this patch was human error from my
side. Sorry about that.

/Jarkko


On Tue, Nov 08, 2016 at 03:28:06PM -0800, Jarkko Sakkinen wrote:
> Hi
> 
> This is needed only for 4.9.
> 
> BR
> /Jarkko
> 
> On Tue, Nov 08, 2016 at 05:18:29PM +0100, gregkh@linuxfoundation.org wrote:
> > 
> > The patch below does not apply to the 4.8-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to <stable@vger.kernel.org>.
> > 
> > thanks,
> > 
> > greg k-h
> > 
> > ------------------ original commit in Linus's tree ------------------
> > 
> > From befd99656c5eb765fe9d96045c4cba099fd938db Mon Sep 17 00:00:00 2001
> > From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > Date: Tue, 4 Oct 2016 09:49:47 +0300
> > Subject: [PATCH] tpm: remove invalid min length check from tpm_do_selftest()
> > 
> > Removal of this check was not properly amended to the original commit.
> > 
> > Cc: stable@vger.kernel.org
> > Fixes: 0c541332231e ("tpm: use tpm_pcr_read_dev() in tpm_do_selftest()")
> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > Signed-off-by: James Morris <james.l.morris@oracle.com>
> > 
> > diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> > index 8de61876f633..3a9149cf0110 100644
> > --- a/drivers/char/tpm/tpm-interface.c
> > +++ b/drivers/char/tpm/tpm-interface.c
> > @@ -813,9 +813,6 @@ int tpm_do_selftest(struct tpm_chip *chip)
> >  			continue;
> >  		}
> >  
> > -		if (rc < TPM_HEADER_SIZE)
> > -			return -EFAULT;
> > -
> >  		if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) {
> >  			dev_info(&chip->dev,
> >  				 "TPM is disabled/deactivated (0x%X)\n", rc);
> > 

^ permalink raw reply

* [RESEND][PATCH v4] cgroup: Use CAP_SYS_RESOURCE to allow a process to migrate other tasks between cgroups
From: John Stultz @ 2016-11-08 23:28 UTC (permalink / raw)
  To: lkml
  Cc: John Stultz, Tejun Heo, Li Zefan, Jonathan Corbet, cgroups,
	Android Kernel Team, Rom Lemarchand, Colin Cross, Dmitry Shmidt,
	Todd Kjos, Christian Poetzsch, Amit Pundir, Dmitry Torokhov,
	Kees Cook, Serge E . Hallyn, linux-api

This patch adds logic to allows a process to migrate other tasks
between cgroups if they have CAP_SYS_RESOURCE.

In Android (where this feature originated), the ActivityManager tracks
various application states (TOP_APP, FOREGROUND, BACKGROUND, SYSTEM,
etc), and then as applications change states, the SchedPolicy logic
will migrate the application tasks between different cgroups used
to control the different application states (for example, there is a
background cpuset cgroup which can limit background tasks to stay
on one low-power cpu, and the bg_non_interactive cpuctrl cgroup can
then further limit those background tasks to a small percentage of
that one cpu's cpu time).

However, for security reasons, Android doesn't want to make the
system_server (the process that runs the ActivityManager and
SchedPolicy logic), run as root. So in the Android common.git
kernel, they have some logic to allow cgroups to loosen their
permissions so CAP_SYS_NICE tasks can migrate other tasks between
cgroups.

I feel the approach taken there overloads CAP_SYS_NICE a bit much
for non-android environments.

So this patch, as suggested by Michael Kerrisk, simply adds a
check for CAP_SYS_RESOURCE.

I've tested this with AOSP master, and this seems to work well
as Zygote and system_server already use CAP_SYS_RESOURCE. I've
also submitted patches against the android-4.4 kernel to change
it to use CAP_SYS_RESOURCE, and the Android developers just merged
it.

Cc: Tejun Heo <tj@kernel.org>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: cgroups@vger.kernel.org
Cc: Android Kernel Team <kernel-team@android.com>
Cc: Rom Lemarchand <romlem@android.com>
Cc: Colin Cross <ccross@android.com>
Cc: Dmitry Shmidt <dimitrysh@google.com>
Cc: Todd Kjos <tkjos@google.com>
Cc: Christian Poetzsch <christian.potzsch@imgtec.com>
Cc: Amit Pundir <amit.pundir@linaro.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Serge E. Hallyn <serge@hallyn.com>
Cc: linux-api@vger.kernel.org
Acked-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
v2: Renamed to just CAP_CGROUP_MIGRATE as recommended by Tejun
v3: Switched to just using CAP_SYS_RESOURCE as suggested by Michael
v4: Send out properly folded down version of the patch. :P
---
 kernel/cgroup.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 85bc9be..866059a 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2856,7 +2856,8 @@ static int cgroup_procs_write_permission(struct task_struct *task,
 	 */
 	if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
 	    !uid_eq(cred->euid, tcred->uid) &&
-	    !uid_eq(cred->euid, tcred->suid))
+	    !uid_eq(cred->euid, tcred->suid) &&
+	    !ns_capable(tcred->user_ns, CAP_SYS_RESOURCE))
 		ret = -EACCES;
 
 	if (!ret && cgroup_on_dfl(dst_cgrp)) {
-- 
2.7.4

^ permalink raw reply related

* [RESEND][PATCH v4] cgroup: Use CAP_SYS_RESOURCE to allow a process to migrate other tasks between cgroups
From: John Stultz @ 2016-11-08 23:28 UTC (permalink / raw)
  To: lkml
  Cc: John Stultz, Tejun Heo, Li Zefan, Jonathan Corbet,
	cgroups-u79uwXL29TY76Z2rM5mHXA, Android Kernel Team,
	Rom Lemarchand, Colin Cross, Dmitry Shmidt, Todd Kjos,
	Christian Poetzsch, Amit Pundir, Dmitry Torokhov, Kees Cook,
	Serge E . Hallyn, linux-api-u79uwXL29TY76Z2rM5mHXA

This patch adds logic to allows a process to migrate other tasks
between cgroups if they have CAP_SYS_RESOURCE.

In Android (where this feature originated), the ActivityManager tracks
various application states (TOP_APP, FOREGROUND, BACKGROUND, SYSTEM,
etc), and then as applications change states, the SchedPolicy logic
will migrate the application tasks between different cgroups used
to control the different application states (for example, there is a
background cpuset cgroup which can limit background tasks to stay
on one low-power cpu, and the bg_non_interactive cpuctrl cgroup can
then further limit those background tasks to a small percentage of
that one cpu's cpu time).

However, for security reasons, Android doesn't want to make the
system_server (the process that runs the ActivityManager and
SchedPolicy logic), run as root. So in the Android common.git
kernel, they have some logic to allow cgroups to loosen their
permissions so CAP_SYS_NICE tasks can migrate other tasks between
cgroups.

I feel the approach taken there overloads CAP_SYS_NICE a bit much
for non-android environments.

So this patch, as suggested by Michael Kerrisk, simply adds a
check for CAP_SYS_RESOURCE.

I've tested this with AOSP master, and this seems to work well
as Zygote and system_server already use CAP_SYS_RESOURCE. I've
also submitted patches against the android-4.4 kernel to change
it to use CAP_SYS_RESOURCE, and the Android developers just merged
it.

Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Cc: Jonathan Corbet <corbet-T1hC0tSOHrs@public.gmane.org>
Cc: cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: Android Kernel Team <kernel-team-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
Cc: Rom Lemarchand <romlem-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
Cc: Colin Cross <ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
Cc: Dmitry Shmidt <dimitrysh-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Cc: Todd Kjos <tkjos-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Cc: Christian Poetzsch <christian.potzsch-1AXoQHu6uovQT0dZR+AlfA@public.gmane.org>
Cc: Amit Pundir <amit.pundir-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Kees Cook <keescook-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Cc: Serge E. Hallyn <serge-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
Cc: linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Acked-by: Serge Hallyn <serge-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
Signed-off-by: John Stultz <john.stultz-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
---
v2: Renamed to just CAP_CGROUP_MIGRATE as recommended by Tejun
v3: Switched to just using CAP_SYS_RESOURCE as suggested by Michael
v4: Send out properly folded down version of the patch. :P
---
 kernel/cgroup.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 85bc9be..866059a 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2856,7 +2856,8 @@ static int cgroup_procs_write_permission(struct task_struct *task,
 	 */
 	if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
 	    !uid_eq(cred->euid, tcred->uid) &&
-	    !uid_eq(cred->euid, tcred->suid))
+	    !uid_eq(cred->euid, tcred->suid) &&
+	    !ns_capable(tcred->user_ns, CAP_SYS_RESOURCE))
 		ret = -EACCES;
 
 	if (!ret && cgroup_on_dfl(dst_cgrp)) {
-- 
2.7.4

^ permalink raw reply related

* Re: [PATCH v7 04/17] ref-filter: modify "%(objectname:short)" to take length
From: Jacob Keller @ 2016-11-08 23:27 UTC (permalink / raw)
  To: Karthik Nayak; +Cc: Git mailing list
In-Reply-To: <20161108201211.25213-5-Karthik.188@gmail.com>

On Tue, Nov 8, 2016 at 12:11 PM, Karthik Nayak <karthik.188@gmail.com> wrote:
> From: Karthik Nayak <karthik.188@gmail.com>
>
> Add support for %(objectname:short=<length>) which would print the
> abbreviated unique objectname of given length. When no length is
> specified, the length is 'DEFAULT_ABBREV'. The minimum length is
> 'MINIMUM_ABBREV'. The length may be exceeded to ensure that the provided
> object name is unique.
>

Ok this makes sense. It may be annoying that the length might go
beyond the size that we wanted, but I think it's better than printing
a non-unique short abbreviation.

I have one suggested change, which is to drop O_LENGTH and have
O_SHORT store the length always, setting it to DEFAULT_ABBREV when no
length provided. This allows you to drop some code. I don't think it's
actually worth a re-roll by itself since the current code is correct.

Thanks,
Jake

> Add tests and documentation for the same.
>
> Mentored-by: Christian Couder <christian.couder@gmail.com>
> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
> Helped-by: Jacob Keller <jacob.keller@gmail.com>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
>  Documentation/git-for-each-ref.txt |  4 ++++
>  ref-filter.c                       | 25 +++++++++++++++++++------
>  t/t6300-for-each-ref.sh            | 10 ++++++++++
>  3 files changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
> index b7b8560..92184c4 100644
> --- a/Documentation/git-for-each-ref.txt
> +++ b/Documentation/git-for-each-ref.txt
> @@ -107,6 +107,10 @@ objectsize::
>  objectname::
>         The object name (aka SHA-1).
>         For a non-ambiguous abbreviation of the object name append `:short`.
> +       For an abbreviation of the object name with desired length append
> +       `:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
> +       length may be exceeded to ensure unique object names.
> +
>
>  upstream::
>         The name of a local ref which can be considered ``upstream''
> diff --git a/ref-filter.c b/ref-filter.c
> index 44481c3..fe4ea2b 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -55,7 +55,10 @@ static struct used_atom {
>                         const char *if_equals,
>                                 *not_equals;
>                 } if_then_else;
> -               enum { O_FULL, O_SHORT } objectname;
> +               struct {
> +                       enum { O_FULL, O_LENGTH, O_SHORT } option;
> +                       unsigned int length;
> +               } objectname;
>         } u;
>  } *used_atom;
>  static int used_atom_cnt, need_tagged, need_symref;
> @@ -118,10 +121,17 @@ static void contents_atom_parser(struct used_atom *atom, const char *arg)
>  static void objectname_atom_parser(struct used_atom *atom, const char *arg)
>  {
>         if (!arg)
> -               atom->u.objectname = O_FULL;
> +               atom->u.objectname.option = O_FULL;
>         else if (!strcmp(arg, "short"))
> -               atom->u.objectname = O_SHORT;
> -       else
> +               atom->u.objectname.option = O_SHORT;
> +       else if (skip_prefix(arg, "short=", &arg)) {
> +               atom->u.objectname.option = O_LENGTH;
> +               if (strtoul_ui(arg, 10, &atom->u.objectname.length) ||
> +                   atom->u.objectname.length == 0)
> +                       die(_("positive value expected objectname:short=%s"), arg);
> +               if (atom->u.objectname.length < MINIMUM_ABBREV)
> +                       atom->u.objectname.length = MINIMUM_ABBREV;

One way to reduce some code is to set O_SHORT and O_LENGTH as the same
(either O_SHORT or O_LENGTH) and when no length is found simply set it
to the DEFAULT_ABBREV.

> +       } else
>                 die(_("unrecognized %%(objectname) argument: %s"), arg);
>  }
>
> @@ -591,12 +601,15 @@ static int grab_objectname(const char *name, const unsigned char *sha1,
>                            struct atom_value *v, struct used_atom *atom)
>  {
>         if (starts_with(name, "objectname")) {
> -               if (atom->u.objectname == O_SHORT) {
> +               if (atom->u.objectname.option == O_SHORT) {
>                         v->s = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
>                         return 1;

That would allow dropping an entire section here.

I don't think this is worth a re-roll by itself, and I think either
approach is probably ok.

> -               } else if (atom->u.objectname == O_FULL) {
> +               } else if (atom->u.objectname.option == O_FULL) {
>                         v->s = xstrdup(sha1_to_hex(sha1));
>                         return 1;
> +               } else if (atom->u.objectname.option == O_LENGTH) {
> +                       v->s = xstrdup(find_unique_abbrev(sha1, atom->u.objectname.length));
> +                       return 1;
>                 } else
>                         die("BUG: unknown %%(objectname) option");
>         }
> diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
> index 19a2823..2be0a3f 100755
> --- a/t/t6300-for-each-ref.sh
> +++ b/t/t6300-for-each-ref.sh
> @@ -60,6 +60,8 @@ test_atom head objecttype commit
>  test_atom head objectsize 171
>  test_atom head objectname $(git rev-parse refs/heads/master)
>  test_atom head objectname:short $(git rev-parse --short refs/heads/master)
> +test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
> +test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master)
>  test_atom head tree $(git rev-parse refs/heads/master^{tree})
>  test_atom head parent ''
>  test_atom head numparent 0
> @@ -99,6 +101,8 @@ test_atom tag objecttype tag
>  test_atom tag objectsize 154
>  test_atom tag objectname $(git rev-parse refs/tags/testtag)
>  test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag)
> +test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
> +test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master)
>  test_atom tag tree ''
>  test_atom tag parent ''
>  test_atom tag numparent ''
> @@ -164,6 +168,12 @@ test_expect_success 'Check invalid format specifiers are errors' '
>         test_must_fail git for-each-ref --format="%(authordate:INVALID)" refs/heads
>  '
>
> +test_expect_success 'arguments to %(objectname:short=) must be positive integers' '
> +       test_must_fail git for-each-ref --format="%(objectname:short=0)" &&
> +       test_must_fail git for-each-ref --format="%(objectname:short=-1)" &&
> +       test_must_fail git for-each-ref --format="%(objectname:short=foo)"
> +'
> +
>  test_date () {
>         f=$1 &&
>         committer_date=$2 &&
> --
> 2.10.2
>

^ permalink raw reply

* Re: FAILED: patch "[PATCH] tpm: remove invalid min length check from tpm_do_selftest()" failed to apply to 4.8-stable tree
From: Jarkko Sakkinen @ 2016-11-08 23:28 UTC (permalink / raw)
  To: gregkh; +Cc: james.l.morris, stable
In-Reply-To: <147862190929230@kroah.com>

Hi

This is needed only for 4.9.

BR
/Jarkko

On Tue, Nov 08, 2016 at 05:18:29PM +0100, gregkh@linuxfoundation.org wrote:
> 
> The patch below does not apply to the 4.8-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <stable@vger.kernel.org>.
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From befd99656c5eb765fe9d96045c4cba099fd938db Mon Sep 17 00:00:00 2001
> From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> Date: Tue, 4 Oct 2016 09:49:47 +0300
> Subject: [PATCH] tpm: remove invalid min length check from tpm_do_selftest()
> 
> Removal of this check was not properly amended to the original commit.
> 
> Cc: stable@vger.kernel.org
> Fixes: 0c541332231e ("tpm: use tpm_pcr_read_dev() in tpm_do_selftest()")
> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> Signed-off-by: James Morris <james.l.morris@oracle.com>
> 
> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> index 8de61876f633..3a9149cf0110 100644
> --- a/drivers/char/tpm/tpm-interface.c
> +++ b/drivers/char/tpm/tpm-interface.c
> @@ -813,9 +813,6 @@ int tpm_do_selftest(struct tpm_chip *chip)
>  			continue;
>  		}
>  
> -		if (rc < TPM_HEADER_SIZE)
> -			return -EFAULT;
> -
>  		if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) {
>  			dev_info(&chip->dev,
>  				 "TPM is disabled/deactivated (0x%X)\n", rc);
> 

^ permalink raw reply

* Re: stable-rc build: 72 warnings 1 failures (stable-rc/v4.4.30-35-gf821e08)
From: Olof Johansson @ 2016-11-08 23:26 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Kernel Build Reports Mailman List, Olof's autobuilder, stable,
	Greg KH, Eric W. Biederman
In-Reply-To: <CAOesGMgee=Cdm5+aW6_F2LwL+1Bg2szmTY6__gqAM539kif93w@mail.gmail.com>

On Tue, Nov 8, 2016 at 2:17 PM, Olof Johansson <olof@lixom.net> wrote:
> On Tue, Nov 8, 2016 at 2:14 PM, Arnd Bergmann <arnd@arndb.de> wrote:
>> On Tuesday, November 8, 2016 9:16:28 AM CET Olof's autobuilder wrote:
>>> Here are the build results from automated periodic testing.
>>>
>>> The tree being built was stable-rc, found at:
>>>
>>> https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable-rc.git/
>>>
>>> Topmost commit:
>>>
>>> f821e08 Linux 4.4.31-rc1
>>>
>>> Build logs (stderr only) can be found at the following link (experimental):
>>>
>>> http://arm-soc.lixom.net/buildlogs/stable-rc/v4.4.30-35-gf821e08/
>>
>> These seem to be largely caused by building with gcc-6. It's probably
>> a good idea to keep supporting that configuration though and
>> backport the fixes. Here are the upstream commit IDs I've found.
>
> That's a lot of noise. I'll move back to build with gcc 4.9.2 instead, for now.
>
> It's not entirely reasonable to expect older releases to build with
> new toolchains without warnings, and I'm not sure if it makes sense to
> bring back those fixes to -stable (unless they fix real bugs, of
> course).

A lot less noise with older gcc:

http://arm-soc.lixom.net/buildlogs/stable-rc/v4.4.30-44-gc5be865/


-Olof

^ permalink raw reply

* Re: [PATCH v3 4/4] KVM: x86: emulate FXSAVE and FXRSTOR
From: Paolo Bonzini @ 2016-11-08 23:25 UTC (permalink / raw)
  To: Radim Krčmář, linux-kernel, kvm; +Cc: Bandan Das, Nadav Amit
In-Reply-To: <20161108195419.4607-5-rkrcmar@redhat.com>



On 08/11/2016 20:54, Radim Krčmář wrote:
> Internal errors were reported on 16 bit fxsave and fxrstor with ipxe.
> Old Intels don't have unrestricted_guest, so we have to emulate them.
> 
> The patch takes advantage of the hardware implementation.
> 
> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
> ---
>  v3:
>  - remove fxsave64 and extra colons at the end of asm to make old GCCs
>    happy  (fxsave64 could have been implemented using other nmemonics,
>    but there is no point when it won't be used + removing it makes the
>    code nicer.)
>  v2:
>  - throws #GP to the guest when reserved MXCSR are set [Nadav]
>  - returns internal emulation error if an exception is hit during
>    execution
>  - preserves XMM 8-15
> ---
>  arch/x86/kvm/emulate.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 112 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 6af3cac6ec89..1b3fab1fb8d3 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -3883,6 +3883,115 @@ static int em_movsxd(struct x86_emulate_ctxt *ctxt)
>  	return X86EMUL_CONTINUE;
>  }
>  
> +static int check_fxsr(struct x86_emulate_ctxt *ctxt)
> +{
> +	u32 eax = 1, ebx, ecx = 0, edx;
> +
> +	ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx);
> +	if (!(edx & FFL(FXSR)))
> +		return emulate_ud(ctxt);
> +
> +	if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
> +		return emulate_nm(ctxt);
> +
> +	/*
> +	 * Don't emulate a case that should never be hit, instead of working
> +	 * around a lack of fxsave64/fxrstor64 on old compilers.
> +	 */
> +	if (ctxt->mode >= X86EMUL_MODE_PROT64)
> +		return X86EMUL_UNHANDLEABLE;
> +
> +	return X86EMUL_CONTINUE;
> +}
> +
> +/*
> + * FXSAVE and FXRSTOR have 4 different formats depending on execution mode,
> + *  1) 16 bit mode
> + *  2) 32 bit mode
> + *     - like (1), but FIP and FDP (foo) are only 16 bit.  At least Intel CPUs
> + *       preserve whole 32 bit values, though, so (1) and (2) are the same wrt.
> + *       save and restore
> + *  3) 64-bit mode with REX.W prefix
> + *     - like (2), but XMM 8-15 are being saved and restored
> + *  4) 64-bit mode without REX.W prefix
> + *     - like (3), but FIP and FDP are 64 bit
> + *
> + * Emulation uses (3) for (1) and (2) and preserves XMM 8-15 to reach the
> + * desired result.  (4) is not emulated.
> + *
> + * XXX: Guest and host CPUID.(EAX=07H,ECX=0H):EBX[bit 13] (deprecate FPU CS
> + * and FPU DS) should match.
> + */
> +static int em_fxsave(struct x86_emulate_ctxt *ctxt)
> +{
> +	struct fxregs_state fx_state;
> +	size_t size = 288; /* up to XMM7 */

Sorry for noticing this only now; if CR4.OSFXSR is 0, XMM and MXCSR
should not be saved.

I can apply the first three patches already if you prefer.

Paolo

> +	int rc;
> +
> +	rc = check_fxsr(ctxt);
> +	if (rc != X86EMUL_CONTINUE)
> +		return rc;
> +
> +	ctxt->ops->get_fpu(ctxt);
> +
> +	rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state));
> +
> +	ctxt->ops->put_fpu(ctxt);
> +
> +	if (rc != X86EMUL_CONTINUE)
> +		return rc;
> +
> +	return segmented_write(ctxt, ctxt->memop.addr.mem, &fx_state, size);
> +}
> +
> +static int fx_load_64bit_xmm(struct fxregs_state *new)
> +{
> +	int rc = X86EMUL_CONTINUE;
> +#ifdef CONFIG_X86_64
> +	struct fxregs_state old;
> +
> +	rc = asm_safe("fxsave %[fx]", , [fx] "+m"(old));
> +
> +	/* XXX: accessing XMM 8-15 is very awkward */
> +	memcpy(&new->xmm_space[8*16 / 4], &old.xmm_space[8*16 / 4], 8*16);
> +#endif
> +	return rc;
> +}
> +
> +static int em_fxrstor(struct x86_emulate_ctxt *ctxt)
> +{
> +	struct fxregs_state fx_state;
> +	int rc;
> +
> +	rc = check_fxsr(ctxt);
> +	if (rc != X86EMUL_CONTINUE)
> +		return rc;
> +
> +	rc = segmented_read(ctxt, ctxt->memop.addr.mem, &fx_state, 512);
> +	if (rc != X86EMUL_CONTINUE)
> +		return rc;
> +
> +	if (fx_state.mxcsr >> 16)
> +		return emulate_gp(ctxt, 0);
> +
> +	ctxt->ops->get_fpu(ctxt);
> +
> +	/*
> +	 * 64 bit host will always restore XMM8-15, which is not correct on
> +	 * non-64 bit guests.  Load the current values in order to preserve 64
> +	 * bit XMMs after fxrstor.
> +	 */
> +	if (ctxt->mode < X86EMUL_MODE_PROT64)
> +		rc = fx_load_64bit_xmm(&fx_state);
> +
> +	if (rc == X86EMUL_CONTINUE)
> +		rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state));
> +
> +	ctxt->ops->put_fpu(ctxt);
> +
> +	return rc;
> +}
> +
>  static bool valid_cr(int nr)
>  {
>  	switch (nr) {
> @@ -4235,7 +4344,9 @@ static const struct gprefix pfx_0f_ae_7 = {
>  };
>  
>  static const struct group_dual group15 = { {
> -	N, N, N, N, N, N, N, GP(0, &pfx_0f_ae_7),
> +	I(ModRM | Aligned16, em_fxsave),
> +	I(ModRM | Aligned16, em_fxrstor),
> +	N, N, N, N, N, GP(0, &pfx_0f_ae_7),
>  }, {
>  	N, N, N, N, N, N, N, N,
>  } };
> 

^ permalink raw reply

* Postinsts question
From: Vuille, Martin (Martin) @ 2016-11-08 23:23 UTC (permalink / raw)
  To: yocto@yoctoproject.org

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

We are running with our rootfs mounted read-only.
Consequently, any postinsts that get deferred to first boot fail.

Is there a way to fail the build for any postinsts that can't
be performed during the build and have to be deferred?

MV

[-- Attachment #2: Type: text/html, Size: 2293 bytes --]

^ permalink raw reply

* Re: [PATCH] scsi: fix spelling mistake in error message
From: Martin K. Petersen @ 2016-11-08 23:24 UTC (permalink / raw)
  To: Colin King
  Cc: Adaptec OEM Raid Solutions, James E . J . Bottomley,
	Martin K . Petersen, linux-scsi, linux-kernel
In-Reply-To: <20161107163857.23766-1-colin.king@canonical.com>

>>>>> "Colin" == Colin King <colin.king@canonical.com> writes:

Colin> From: Colin Ian King <colin.king@canonical.com> Trivial fix to
Colin> spelling mistake "operatio" to "operation" in critical error
Colin> message

Applied to 4.10/scsi-queue.

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply

* + ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler.patch added to -mm tree
From: akpm @ 2016-11-08 23:23 UTC (permalink / raw)
  To: piaojun, jlbec, joseph.qi, junxiao.bi, mfasheh, mm-commits


The patch titled
     Subject: ocfs2/dlm: clean up deadcode in dlm_master_request_handler()
has been added to the -mm tree.  Its filename is
     ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler.patch

This patch should soon appear at
    http://ozlabs.org/~akpm/mmots/broken-out/ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler.patch
and later at
    http://ozlabs.org/~akpm/mmotm/broken-out/ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler.patch

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/SubmitChecklist when testing your code ***

The -mm tree is included into linux-next and is updated
there every 3-4 working days

------------------------------------------------------
From: piaojun <piaojun@huawei.com>
Subject: ocfs2/dlm: clean up deadcode in dlm_master_request_handler()

When 'dispatch_assert' is set, 'response' must be DLM_MASTER_RESP_YES, and
'res' won't be null, so execution can't reach these two branch.

Link: http://lkml.kernel.org/r/58174C91.3040004@huawei.com
Signed-off-by: Jun Piao <piaojun@huawei.com>
Reviewed-by: Joseph Qi <joseph.qi@huawei.com>
Cc: Mark Fasheh <mfasheh@versity.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 fs/ocfs2/dlm/dlmmaster.c |    6 ------
 1 file changed, 6 deletions(-)

diff -puN fs/ocfs2/dlm/dlmmaster.c~ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler fs/ocfs2/dlm/dlmmaster.c
--- a/fs/ocfs2/dlm/dlmmaster.c~ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler
+++ a/fs/ocfs2/dlm/dlmmaster.c
@@ -1641,12 +1641,6 @@ send_response:
 	 * dlm_assert_master_worker() isn't called, we drop it here.
 	 */
 	if (dispatch_assert) {
-		if (response != DLM_MASTER_RESP_YES)
-			mlog(ML_ERROR, "invalid response %d\n", response);
-		if (!res) {
-			mlog(ML_ERROR, "bad lockres while trying to assert!\n");
-			BUG();
-		}
 		mlog(0, "%u is the owner of %.*s, cleaning everyone else\n",
 			     dlm->node_num, res->lockname.len, res->lockname.name);
 		spin_lock(&res->spinlock);
_

Patches currently in -mm which might be from piaojun@huawei.com are

ocfs2-dlm-clean-up-useless-bug_on-default-case-in-dlm_finalize_reco_handler.patch
ocfs2-dlm-clean-up-deadcode-in-dlm_master_request_handler.patch


^ permalink raw reply

* Re: [PATCH v7 03/17] ref-filter: implement %(if:equals=<string>) and %(if:notequals=<string>)
From: Jacob Keller @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Karthik Nayak; +Cc: Git mailing list
In-Reply-To: <20161108201211.25213-4-Karthik.188@gmail.com>

On Tue, Nov 8, 2016 at 12:11 PM, Karthik Nayak <karthik.188@gmail.com> wrote:
> From: Karthik Nayak <karthik.188@gmail.com>
>
> Implement %(if:equals=<string>) wherein the if condition is only
> satisfied if the value obtained between the %(if:...) and %(then) atom
> is the same as the given '<string>'.
>
> Similarly, implement (if:notequals=<string>) wherein the if condition
> is only satisfied if the value obtained between the %(if:...) and
> %(then) atom is differnt from the given '<string>'.
>
> This is done by introducing 'if_atom_parser()' which parses the given
> %(if) atom and then stores the data in used_atom which is later passed
> on to the used_atom of the %(then) atom, so that it can do the required
> comparisons.
>

Ok. How does this handle whitespace? The previous if implementation
treated whitespace as trimming to ignore. Does this require an exact
whitespace match? It appears by the code that strings must match
exactly. Would it make more sense to always trim the value of
whitespace first before comparison? Hmm.. I think we should avoid
doing that actually.

Otherwise this looks good. I might have implemented the storage as one
value and then a boolean indicating whether to check for equality or
inequality. But I think the current implementation is ok too, and is a
bit more elegant on the code savings.

Thanks,
Jake

> Add tests and Documentation for the same.
>
> Mentored-by: Christian Couder <christian.couder@gmail.com>
> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
>  Documentation/git-for-each-ref.txt |  3 +++
>  ref-filter.c                       | 43 +++++++++++++++++++++++++++++++++-----
>  t/t6302-for-each-ref-filter.sh     | 18 ++++++++++++++++
>  3 files changed, 59 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
> index fed8126..b7b8560 100644
> --- a/Documentation/git-for-each-ref.txt
> +++ b/Documentation/git-for-each-ref.txt
> @@ -155,6 +155,9 @@ if::
>         evaluating the string before %(then), this is useful when we
>         use the %(HEAD) atom which prints either "*" or " " and we
>         want to apply the 'if' condition only on the 'HEAD' ref.
> +       Append ":equals=<string>" or ":notequals=<string>" to compare
> +       the value between the %(if:...) and %(then) atoms with the
> +       given string.
>

This seems to imply that it does not ignore whitespace. Ok.

>  In addition to the above, for commit and tag objects, the header
>  field names (`tree`, `parent`, `object`, `type`, and `tag`) can
> diff --git a/ref-filter.c b/ref-filter.c
> index 8392303..44481c3 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -22,6 +22,8 @@ struct align {
>  };
>
>  struct if_then_else {
> +       const char *if_equals,
> +               *not_equals;

Ok so we add both if_equals and not_equals values. Could we re-use the
same string?

>         unsigned int then_atom_seen : 1,
>                 else_atom_seen : 1,
>                 condition_satisfied : 1;
> @@ -49,6 +51,10 @@ static struct used_atom {
>                         enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB } option;
>                         unsigned int nlines;
>                 } contents;
> +               struct {
> +                       const char *if_equals,
> +                               *not_equals;


Same here, why do we need both strings here stored separately? Could
we instead store which state to check and store the string once? I'm
not sure that really buys us any storage.

> +               } if_then_else;
>                 enum { O_FULL, O_SHORT } objectname;
>         } u;
>  } *used_atom;
> @@ -169,6 +175,19 @@ static void align_atom_parser(struct used_atom *atom, const char *arg)
>         string_list_clear(&params, 0);
>  }
>
> +static void if_atom_parser(struct used_atom *atom, const char *arg)
> +{
> +       if (!arg)
> +               return;
> +       else if (skip_prefix(arg, "equals=", &atom->u.if_then_else.if_equals))
> +                ;
> +       else if (skip_prefix(arg, "notequals=", &atom->u.if_then_else.not_equals))
> +               ;

Ok so we can't ever have if_equals or not_equals at the same time.

> +       else
> +               die(_("unrecognized %%(if) argument: %s"), arg);
> +}
> +
> +
>  static struct {
>         const char *name;
>         cmp_type cmp_type;
> @@ -209,7 +228,7 @@ static struct {
>         { "color", FIELD_STR, color_atom_parser },
>         { "align", FIELD_STR, align_atom_parser },
>         { "end" },
> -       { "if" },
> +       { "if", FIELD_STR, if_atom_parser },
>         { "then" },
>         { "else" },
>  };
> @@ -410,6 +429,9 @@ static void if_atom_handler(struct atom_value *atomv, struct ref_formatting_stat
>         struct ref_formatting_stack *new;
>         struct if_then_else *if_then_else = xcalloc(sizeof(struct if_then_else), 1);
>
> +       if_then_else->if_equals = atomv->atom->u.if_then_else.if_equals;
> +       if_then_else->not_equals = atomv->atom->u.if_then_else.not_equals;
> +
>         push_stack_element(&state->stack);
>         new = state->stack;
>         new->at_end = if_then_else_handler;
> @@ -441,10 +463,17 @@ static void then_atom_handler(struct atom_value *atomv, struct ref_formatting_st
>                 die(_("format: %%(then) atom used after %%(else)"));
>         if_then_else->then_atom_seen = 1;
>         /*
> -        * If there exists non-empty string between the 'if' and
> -        * 'then' atom then the 'if' condition is satisfied.
> +        * If the 'equals' or 'notequals' attribute is used then
> +        * perform the required comparison. If not, only non-empty
> +        * strings satisfy the 'if' condition.
>          */
> -       if (cur->output.len && !is_empty(cur->output.buf))
> +       if (if_then_else->if_equals) {
> +               if (!strcmp(if_then_else->if_equals, cur->output.buf))
> +                       if_then_else->condition_satisfied = 1;

Ok so if somehow we end up with both set, if_equals takes precedence.
I think I can be ok with the way we handle this.

> +       } else  if (if_then_else->not_equals) {
> +               if (strcmp(if_then_else->not_equals, cur->output.buf))
> +                       if_then_else->condition_satisfied = 1;
> +       } else if (cur->output.len && !is_empty(cur->output.buf))
>                 if_then_else->condition_satisfied = 1;
>         strbuf_reset(&cur->output);
>  }
> @@ -1137,7 +1166,11 @@ static void populate_value(struct ref_array_item *ref)
>                 } else if (!strcmp(name, "end")) {
>                         v->handler = end_atom_handler;
>                         continue;
> -               } else if (!strcmp(name, "if")) {
> +               } else if (starts_with(name, "if")) {
> +                       const char *s;
> +
> +                       if (skip_prefix(name, "if:", &s))
> +                               v->s = xstrdup(s);
>                         v->handler = if_atom_handler;
>                         continue;
>                 } else if (!strcmp(name, "then")) {
> diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
> index fed3013..a09a1a4 100755
> --- a/t/t6302-for-each-ref-filter.sh
> +++ b/t/t6302-for-each-ref-filter.sh
> @@ -403,4 +403,22 @@ test_expect_success 'ignore spaces in %(if) atom usage' '
>         test_cmp expect actual
>  '
>
> +test_expect_success 'check %(if:equals=<string>)' '
> +       git for-each-ref --format="%(if:equals=master)%(refname:short)%(then)Found master%(else)Not master%(end)" refs/heads/ >actual &&
> +       cat >expect <<-\EOF &&
> +       Found master
> +       Not master
> +       EOF
> +       test_cmp expect actual
> +'
> +
> +test_expect_success 'check %(if:notequals=<string>)' '
> +       git for-each-ref --format="%(if:notequals=master)%(refname:short)%(then)Not master%(else)Found master%(end)" refs/heads/ >actual &&
> +       cat >expect <<-\EOF &&
> +       Found master
> +       Not master
> +       EOF
> +       test_cmp expect actual
> +'
> +
>  test_done
> --
> 2.10.2
>

^ permalink raw reply

* Re: [PATCH v3 nft 2/4] src: add offset attribute for hash expression
From: Pablo Neira Ayuso @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Laura Garcia Liebana; +Cc: netfilter-devel
In-Reply-To: <20161104130109.GA20452@sonyv>

On Fri, Nov 04, 2016 at 02:01:12PM +0100, Laura Garcia Liebana wrote:
> Add support to add an offset to the hash generator, eg.
> 
>  ct mark set hash ip saddr mod 10 offset 100
> 
> This will generate marks with series between 100-109.

Also applied, thanks.

^ permalink raw reply

* Re: [PATCH v3 nft 1/4] src: make hash seed attribute optional
From: Pablo Neira Ayuso @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Laura Garcia Liebana; +Cc: netfilter-devel
In-Reply-To: <20161104125927.GA20394@sonyv>

On Fri, Nov 04, 2016 at 01:59:31PM +0100, Laura Garcia Liebana wrote:
> The hash expression requires a seed attribute to call the jhash
> operation, eg.
> 
>  # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2 \
> 	seed 0xdeadbeef
> 
> With this patch the seed attribute is optional and it's generated by a
> random function from userspace, eg.
> 
>  # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2
> 
> The kernel will take care of generate a random seed.

Applied, thanks Laura.

^ permalink raw reply

* Re: [PATCH 1/4] ath10k: Add support to enable or disable btcoex via nl80211
From: kbuild test robot @ 2016-11-08 23:20 UTC (permalink / raw)
  To: c_traja; +Cc: tamizhchelvam, linux-wireless, kbuild-all, ath10k
In-Reply-To: <1478617354-28146-2-git-send-email-c_traja@qti.qualcomm.com>

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

Hi Tamizh,

[auto build test WARNING on ath6kl/ath-next]
[also build test WARNING on v4.9-rc4 next-20161108]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/c_traja-qti-qualcomm-com/ath10k-Add-support-for-BTCOEX-feature/20161109-043718
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git ath-next
config: xtensa-allmodconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 4.9.0
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=xtensa 

All warnings (new ones prefixed by >>):

   drivers/net/wireless/ath/ath10k/mac.c:7548:2: error: unknown field 'set_btcoex' specified in initializer
     .set_btcoex                     = ath10k_mac_op_set_btcoex,
     ^
>> drivers/net/wireless/ath/ath10k/mac.c:7548:2: warning: initialization from incompatible pointer type
   drivers/net/wireless/ath/ath10k/mac.c:7548:2: warning: (near initialization for 'ath10k_ops.reconfig_complete')

vim +7548 drivers/net/wireless/ath/ath10k/mac.c

  7532		.reconfig_complete		= ath10k_reconfig_complete,
  7533		.get_survey			= ath10k_get_survey,
  7534		.set_bitrate_mask		= ath10k_mac_op_set_bitrate_mask,
  7535		.sta_rc_update			= ath10k_sta_rc_update,
  7536		.get_tsf			= ath10k_get_tsf,
  7537		.set_tsf			= ath10k_set_tsf,
  7538		.ampdu_action			= ath10k_ampdu_action,
  7539		.get_et_sset_count		= ath10k_debug_get_et_sset_count,
  7540		.get_et_stats			= ath10k_debug_get_et_stats,
  7541		.get_et_strings			= ath10k_debug_get_et_strings,
  7542		.add_chanctx			= ath10k_mac_op_add_chanctx,
  7543		.remove_chanctx			= ath10k_mac_op_remove_chanctx,
  7544		.change_chanctx			= ath10k_mac_op_change_chanctx,
  7545		.assign_vif_chanctx		= ath10k_mac_op_assign_vif_chanctx,
  7546		.unassign_vif_chanctx		= ath10k_mac_op_unassign_vif_chanctx,
  7547		.switch_vif_chanctx		= ath10k_mac_op_switch_vif_chanctx,
> 7548		.set_btcoex                     = ath10k_mac_op_set_btcoex,
  7549	
  7550		CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
  7551	
  7552	#ifdef CONFIG_PM
  7553		.suspend			= ath10k_wow_op_suspend,
  7554		.resume				= ath10k_wow_op_resume,
  7555	#endif
  7556	#ifdef CONFIG_MAC80211_DEBUGFS

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 46112 bytes --]

[-- Attachment #3: Type: text/plain, Size: 146 bytes --]

_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k

^ permalink raw reply

* Re: [nft PATCH 1/3] tests: shell: delete useless stderr output in testcase
From: Pablo Neira Ayuso @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Arturo Borrero Gonzalez; +Cc: netfilter-devel
In-Reply-To: <147817467643.6881.13545899574878544844.stgit@nfdev2.cica.es>

Series applied, thanks Arturo.

^ permalink raw reply

* Re: [PATCH] net: ethernet: ti: davinci_cpdma: free memory while channel destroy
From: Grygorii Strashko @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Ivan Khoronzhuk, mugunthanvnm, netdev; +Cc: linux-omap, linux-kernel
In-Reply-To: <1478610965-25288-1-git-send-email-ivan.khoronzhuk@linaro.org>



On 11/08/2016 07:16 AM, Ivan Khoronzhuk wrote:
> While create/destroy channel operation memory is not freed. It was
> supposed that memory is freed while driver remove. But a channel
> can be created and destroyed many times while changing number of
> channels with ethtool.
>
> Based on net-next/master

^?

>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>

Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>

> ---
>  drivers/net/ethernet/ti/davinci_cpdma.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
> index 05afc05..07fc92d 100644
> --- a/drivers/net/ethernet/ti/davinci_cpdma.c
> +++ b/drivers/net/ethernet/ti/davinci_cpdma.c
> @@ -586,7 +586,7 @@ int cpdma_chan_destroy(struct cpdma_chan *chan)
>  		cpdma_chan_stop(chan);
>  	ctlr->channels[chan->chan_num] = NULL;
>  	ctlr->chan_num--;
> -
> +	devm_kfree(ctlr->dev, chan);
>  	cpdma_chan_split_pool(ctlr);
>
>  	spin_unlock_irqrestore(&ctlr->lock, flags);
>

-- 
regards,
-grygorii

^ permalink raw reply

* Re: [PATCH] net: ethernet: ti: davinci_cpdma: free memory while channel destroy
From: Grygorii Strashko @ 2016-11-08 23:22 UTC (permalink / raw)
  To: Ivan Khoronzhuk, mugunthanvnm, netdev; +Cc: linux-omap, linux-kernel
In-Reply-To: <1478610965-25288-1-git-send-email-ivan.khoronzhuk@linaro.org>



On 11/08/2016 07:16 AM, Ivan Khoronzhuk wrote:
> While create/destroy channel operation memory is not freed. It was
> supposed that memory is freed while driver remove. But a channel
> can be created and destroyed many times while changing number of
> channels with ethtool.
>
> Based on net-next/master

^?

>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>

Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>

> ---
>  drivers/net/ethernet/ti/davinci_cpdma.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
> index 05afc05..07fc92d 100644
> --- a/drivers/net/ethernet/ti/davinci_cpdma.c
> +++ b/drivers/net/ethernet/ti/davinci_cpdma.c
> @@ -586,7 +586,7 @@ int cpdma_chan_destroy(struct cpdma_chan *chan)
>  		cpdma_chan_stop(chan);
>  	ctlr->channels[chan->chan_num] = NULL;
>  	ctlr->chan_num--;
> -
> +	devm_kfree(ctlr->dev, chan);
>  	cpdma_chan_split_pool(ctlr);
>
>  	spin_unlock_irqrestore(&ctlr->lock, flags);
>

-- 
regards,
-grygorii

^ permalink raw reply

* Re: [PATCH 1/4] ath10k: Add support to enable or disable btcoex via nl80211
From: kbuild test robot @ 2016-11-08 23:20 UTC (permalink / raw)
  To: c_traja; +Cc: kbuild-all, ath10k, linux-wireless, tamizhchelvam, Tamizh chelvam
In-Reply-To: <1478617354-28146-2-git-send-email-c_traja@qti.qualcomm.com>

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

Hi Tamizh,

[auto build test WARNING on ath6kl/ath-next]
[also build test WARNING on v4.9-rc4 next-20161108]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/c_traja-qti-qualcomm-com/ath10k-Add-support-for-BTCOEX-feature/20161109-043718
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git ath-next
config: xtensa-allmodconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 4.9.0
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=xtensa 

All warnings (new ones prefixed by >>):

   drivers/net/wireless/ath/ath10k/mac.c:7548:2: error: unknown field 'set_btcoex' specified in initializer
     .set_btcoex                     = ath10k_mac_op_set_btcoex,
     ^
>> drivers/net/wireless/ath/ath10k/mac.c:7548:2: warning: initialization from incompatible pointer type
   drivers/net/wireless/ath/ath10k/mac.c:7548:2: warning: (near initialization for 'ath10k_ops.reconfig_complete')

vim +7548 drivers/net/wireless/ath/ath10k/mac.c

  7532		.reconfig_complete		= ath10k_reconfig_complete,
  7533		.get_survey			= ath10k_get_survey,
  7534		.set_bitrate_mask		= ath10k_mac_op_set_bitrate_mask,
  7535		.sta_rc_update			= ath10k_sta_rc_update,
  7536		.get_tsf			= ath10k_get_tsf,
  7537		.set_tsf			= ath10k_set_tsf,
  7538		.ampdu_action			= ath10k_ampdu_action,
  7539		.get_et_sset_count		= ath10k_debug_get_et_sset_count,
  7540		.get_et_stats			= ath10k_debug_get_et_stats,
  7541		.get_et_strings			= ath10k_debug_get_et_strings,
  7542		.add_chanctx			= ath10k_mac_op_add_chanctx,
  7543		.remove_chanctx			= ath10k_mac_op_remove_chanctx,
  7544		.change_chanctx			= ath10k_mac_op_change_chanctx,
  7545		.assign_vif_chanctx		= ath10k_mac_op_assign_vif_chanctx,
  7546		.unassign_vif_chanctx		= ath10k_mac_op_unassign_vif_chanctx,
  7547		.switch_vif_chanctx		= ath10k_mac_op_switch_vif_chanctx,
> 7548		.set_btcoex                     = ath10k_mac_op_set_btcoex,
  7549	
  7550		CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
  7551	
  7552	#ifdef CONFIG_PM
  7553		.suspend			= ath10k_wow_op_suspend,
  7554		.resume				= ath10k_wow_op_resume,
  7555	#endif
  7556	#ifdef CONFIG_MAC80211_DEBUGFS

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 46112 bytes --]

^ permalink raw reply

* [md PATCH 3/3] md: define mddev flags, recovery flags and r1bio state bits using enums
From: NeilBrown @ 2016-11-08 23:21 UTC (permalink / raw)
  To: Shaohua Li; +Cc: linux-raid
In-Reply-To: <147864718560.1076.2148299631932240330.stgit@noble>

This is less error prone than using individual #defines.

Signed-off-by: NeilBrown <neilb@suse.com>
---
 drivers/md/md.h    |   76 +++++++++++++++++++++++++---------------------------
 drivers/md/raid1.h |   18 +++++++-----
 2 files changed, 46 insertions(+), 48 deletions(-)

diff --git a/drivers/md/md.h b/drivers/md/md.h
index 21bd94fad96a..af6b33c30d2d 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -192,6 +192,25 @@ extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
 				int is_new);
 struct md_cluster_info;
 
+enum mddev_flags {
+	MD_CHANGE_DEVS,		/* Some device status has changed */
+	MD_CHANGE_CLEAN,	/* transition to or from 'clean' */
+	MD_CHANGE_PENDING,	/* switch from 'clean' to 'active' in progress */
+	MD_ARRAY_FIRST_USE,	/* First use of array, needs initialization */
+	MD_CLOSING,		/* If set, we are closing the array, do not open
+				 * it then */
+	MD_JOURNAL_CLEAN,	/* A raid with journal is already clean */
+	MD_HAS_JOURNAL,		/* The raid array has journal feature set */
+	MD_RELOAD_SB,		/* Reload the superblock because another node
+				 * updated it.
+				 */
+	MD_CLUSTER_RESYNC_LOCKED, /* cluster raid only, which means node
+				   * already took resync lock, need to
+				   * release the lock */
+};
+#define MD_UPDATE_SB_FLAGS (BIT(MD_CHANGE_DEVS) | \
+			    BIT(MD_CHANGE_CLEAN) | \
+			    BIT(MD_CHANGE_PENDING))	/* If these are set, md_update_sb needed */
 struct mddev {
 	void				*private;
 	struct md_personality		*pers;
@@ -199,21 +218,6 @@ struct mddev {
 	int				md_minor;
 	struct list_head		disks;
 	unsigned long			flags;
-#define MD_CHANGE_DEVS	0	/* Some device status has changed */
-#define MD_CHANGE_CLEAN 1	/* transition to or from 'clean' */
-#define MD_CHANGE_PENDING 2	/* switch from 'clean' to 'active' in progress */
-#define MD_UPDATE_SB_FLAGS (1 | 2 | 4)	/* If these are set, md_update_sb needed */
-#define MD_ARRAY_FIRST_USE 3    /* First use of array, needs initialization */
-#define MD_CLOSING	4	/* If set, we are closing the array, do not open
-				 * it then */
-#define MD_JOURNAL_CLEAN 5	/* A raid with journal is already clean */
-#define MD_HAS_JOURNAL	6	/* The raid array has journal feature set */
-#define MD_RELOAD_SB	7	/* Reload the superblock because another node
-				 * updated it.
-				 */
-#define MD_CLUSTER_RESYNC_LOCKED 8 /* cluster raid only, which means node
-				    * already took resync lock, need to
-				    * release the lock */
 
 	int				suspended;
 	atomic_t			active_io;
@@ -307,31 +311,6 @@ struct mddev {
 	int				parallel_resync;
 
 	int				ok_start_degraded;
-	/* recovery/resync flags
-	 * NEEDED:   we might need to start a resync/recover
-	 * RUNNING:  a thread is running, or about to be started
-	 * SYNC:     actually doing a resync, not a recovery
-	 * RECOVER:  doing recovery, or need to try it.
-	 * INTR:     resync needs to be aborted for some reason
-	 * DONE:     thread is done and is waiting to be reaped
-	 * REQUEST:  user-space has requested a sync (used with SYNC)
-	 * CHECK:    user-space request for check-only, no repair
-	 * RESHAPE:  A reshape is happening
-	 * ERROR:    sync-action interrupted because io-error
-	 *
-	 * If neither SYNC or RESHAPE are set, then it is a recovery.
-	 */
-#define	MD_RECOVERY_RUNNING	0
-#define	MD_RECOVERY_SYNC	1
-#define	MD_RECOVERY_RECOVER	2
-#define	MD_RECOVERY_INTR	3
-#define	MD_RECOVERY_DONE	4
-#define	MD_RECOVERY_NEEDED	5
-#define	MD_RECOVERY_REQUESTED	6
-#define	MD_RECOVERY_CHECK	7
-#define MD_RECOVERY_RESHAPE	8
-#define	MD_RECOVERY_FROZEN	9
-#define	MD_RECOVERY_ERROR	10
 
 	unsigned long			recovery;
 	/* If a RAID personality determines that recovery (of a particular
@@ -445,6 +424,23 @@ struct mddev {
 	unsigned int			good_device_nr;	/* good device num within cluster raid */
 };
 
+enum recovery_flags {
+	/*
+	 * If neither SYNC or RESHAPE are set, then it is a recovery.
+	 */
+	MD_RECOVERY_RUNNING,	/* a thread is running, or about to be started */
+	MD_RECOVERY_SYNC,	/* actually doing a resync, not a recovery */
+	MD_RECOVERY_RECOVER,	/* doing recovery, or need to try it. */
+	MD_RECOVERY_INTR,	/* resync needs to be aborted for some reason */
+	MD_RECOVERY_DONE,	/* thread is done and is waiting to be reaped */
+	MD_RECOVERY_NEEDED,	/* we might need to start a resync/recover */
+	MD_RECOVERY_REQUESTED,	/* user-space has requested a sync (used with SYNC) */
+	MD_RECOVERY_CHECK,	/* user-space request for check-only, no repair */
+	MD_RECOVERY_RESHAPE,	/* A reshape is happening */
+	MD_RECOVERY_FROZEN,	/* User request to abort, and not restart, any action */
+	MD_RECOVERY_ERROR,	/* sync-action interrupted because io-error */
+};
+
 static inline int __must_check mddev_lock(struct mddev *mddev)
 {
 	return mutex_lock_interruptible(&mddev->reconfig_mutex);
diff --git a/drivers/md/raid1.h b/drivers/md/raid1.h
index 61c39b390cd8..5ec19449779d 100644
--- a/drivers/md/raid1.h
+++ b/drivers/md/raid1.h
@@ -161,14 +161,15 @@ struct r1bio {
 };
 
 /* bits for r1bio.state */
-#define	R1BIO_Uptodate	0
-#define	R1BIO_IsSync	1
-#define	R1BIO_Degraded	2
-#define	R1BIO_BehindIO	3
+enum r1bio_state {
+	R1BIO_Uptodate,
+	R1BIO_IsSync,
+	R1BIO_Degraded,
+	R1BIO_BehindIO,
 /* Set ReadError on bios that experience a readerror so that
  * raid1d knows what to do with them.
  */
-#define R1BIO_ReadError 4
+	R1BIO_ReadError,
 /* For write-behind requests, we call bi_end_io when
  * the last non-write-behind device completes, providing
  * any write was successful.  Otherwise we call when
@@ -176,10 +177,11 @@ struct r1bio {
  * with failure when last write completes (and all failed).
  * Record that bi_end_io was called with this flag...
  */
-#define	R1BIO_Returned 6
+	R1BIO_Returned,
 /* If a write for this request means we can clear some
  * known-bad-block records, we set this flag
  */
-#define	R1BIO_MadeGood 7
-#define	R1BIO_WriteError 8
+	R1BIO_MadeGood,
+	R1BIO_WriteError,
+};
 #endif



^ permalink raw reply related

* [md PATCH 1/3] md/raid1: fix: IO can block resync indefinitely
From: NeilBrown @ 2016-11-08 23:21 UTC (permalink / raw)
  To: Shaohua Li; +Cc: linux-raid
In-Reply-To: <147864718560.1076.2148299631932240330.stgit@noble>

While performing a resync/recovery, raid1 divides the
array space into three regions:
 - before the resync
 - at or shortly after the resync point
 - much further ahead of the resync point.

Write requests to the first or third do not need to wait.  Write
requests to the middle region do need to wait if resync requests are
pending.

If there are any active write requests in the middle region, resync
will wait for them.

Due to an accounting error, there is a small range of addresses,
between conf->next_resync and conf->start_next_window, where write
requests will *not* be blocked, but *will* be counted in the middle
region.  This can effectively block resync indefinitely if filesystem
writes happen repeatedly to this region.

As ->next_window_requests is incremented when the sector is before
  conf->start_next_window + NEXT_NORMALIO_DISTANCE
the same boundary should be used for determining when write requests
should wait.

Signed-off-by: NeilBrown <neilb@suse.com>
---
 drivers/md/raid1.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index aac2a05cf8d1..9ac61cd85e5c 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -834,7 +834,7 @@ static bool need_to_wait_for_sync(struct r1conf *conf, struct bio *bio)
 	else if (conf->barrier && bio_data_dir(bio) == WRITE) {
 		if ((conf->mddev->curr_resync_completed
 		     >= bio_end_sector(bio)) ||
-		    (conf->next_resync + NEXT_NORMALIO_DISTANCE
+		    (conf->start_next_window + NEXT_NORMALIO_DISTANCE
 		     <= bio->bi_iter.bi_sector))
 			wait = false;
 		else



^ permalink raw reply related

* [md PATCH 0/3] Three unrelated md patches.
From: NeilBrown @ 2016-11-08 23:21 UTC (permalink / raw)
  To: Shaohua Li; +Cc: linux-raid

The first is a minor bug fix, the other to are just code improvements.
I have some patches to add "failfast" functionality, and I want to get
the small clean-ups out of the way first.

Thanks,
NeilBrown


---

NeilBrown (3):
      md/raid1: fix: IO can block resync indefinitely
      md: remove md_super_wait() call after bitmap_flush()
      md: define mddev flags, recovery flags and r1bio state bits using enums


 drivers/md/md.c    |    1 -
 drivers/md/md.h    |   76 +++++++++++++++++++++++++---------------------------
 drivers/md/raid1.c |    2 +
 drivers/md/raid1.h |   18 +++++++-----
 4 files changed, 47 insertions(+), 50 deletions(-)

--
Signature


^ permalink raw reply

* [md PATCH 2/3] md: remove md_super_wait() call after bitmap_flush()
From: NeilBrown @ 2016-11-08 23:21 UTC (permalink / raw)
  To: Shaohua Li; +Cc: linux-raid
In-Reply-To: <147864718560.1076.2148299631932240330.stgit@noble>

bitmap_flush() finishes with bitmap_update_sb(), and that finishes
with write_page(..., 1), so write_page() will wait for all writes
to complete.  So there is no point calling md_super_wait()
immediately afterwards.

Signed-off-by: NeilBrown <neilb@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 f389d8abe137..1f1c7f007b68 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5472,7 +5472,6 @@ static void __md_stop_writes(struct mddev *mddev)
 	del_timer_sync(&mddev->safemode_timer);
 
 	bitmap_flush(mddev);
-	md_super_wait(mddev);
 
 	if (mddev->ro == 0 &&
 	    ((!mddev->in_sync && !mddev_is_clustered(mddev)) ||



^ permalink raw reply related


This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.