public inbox for linux-nvme@lists.infradead.org
 help / color / mirror / Atom feed
From: Martin Wilck <mwilck@suse.com>
To: Hannes Reinecke <hare@suse.de>, Keith Busch <kbusch@kernel.org>,
	 linux-nvme@lists.infradead.org
Cc: Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>
Subject: Re: [PATCH 13/35] monitor: disable nvmf-autoconnect udev rules in autoconnect mode
Date: Thu, 04 Feb 2021 10:37:40 +0100	[thread overview]
Message-ID: <bca4cd03f4a9a64d36a746c92eb2afb4d7ce4750.camel@suse.com> (raw)
In-Reply-To: <ff1b9621-c01b-7884-1e8f-44a07ac845c1@suse.de>

On Thu, 2021-02-04 at 08:16 +0100, Hannes Reinecke wrote:
> On 1/26/21 9:33 PM, mwilck@suse.com wrote:
> > From: Martin Wilck <mwilck@suse.com>
> > 
> > If autoconnect is enabled, disable the respective udev rules
> > by symlinking /run/udev/rules.d to /dev/null, in order to avoid
> > the connections being set up by the monitor and the udev workers
> > at the same time. This is probably the preferred mode of operation
> > for the monitor.
> > 
> > Users can override this by copying 70-nvmf-autoconnect.rules
> > from /usr/lib/udev/rules.d to /etc/udev/rules.d (/etc/udev/rules.d
> > takes precedence over /run/udev/rules.d).
> > 
> > If the symlink can't be created for some reason, autoconnect will
> > be disabled. There is  only one exception: If
> > /run/udev/rules.d/70-nvmf-autoconnect.rules already points to
> > /dev/null at startup, autoconnect can be left on, but the symlink
> > isn't removed on exit.
> > 
> > Signed-off-by: Martin Wilck <mwilck@suse.com>
> > ---
> >   monitor.c | 75
> > +++++++++++++++++++++++++++++++++++++++++++++++++++++--
> >   1 file changed, 73 insertions(+), 2 deletions(-)
> > 
> > diff --git a/monitor.c b/monitor.c
> > index ecf3be2..2a906db 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -17,14 +17,18 @@
> >   
> >   #include <stddef.h>
> >   #include <stdio.h>
> > +#include <stdlib.h>
> >   #include <unistd.h>
> >   #include <errno.h>
> >   #include <libudev.h>
> >   #include <signal.h>
> >   #include <time.h>
> > +#include <limits.h>
> >   #include <syslog.h>
> > +#include <sys/stat.h>
> >   #include <sys/epoll.h>
> >   
> > +#include "common.h"
> >   #include "nvme-status.h"
> >   #include "util/argconfig.h"
> >   #include "monitor.h"
> > @@ -33,6 +37,7 @@
> >   
> >   static struct monitor_config {
> >         bool autoconnect;
> > +       bool skip_udev_on_exit;
> >   } mon_cfg;
> >   
> >   static struct udev *udev;
> > @@ -45,6 +50,8 @@ static void close_ptr(int *p)
> >         }
> >   }
> >   
> > +CLEANUP_FUNC(char)
> > +
> >   static void cleanup_monitor(struct udev_monitor **pmon)
> >   {
> >         if (*pmon) {
> > @@ -174,12 +181,64 @@ static int monitor_main_loop(struct
> > udev_monitor *monitor)
> >         return ret;
> >   }
> >   
> > +static const char autoconnect_rules[] = "/run/udev/rules.d/70-
> > nvmf-autoconnect.rules";
> > +
> > +static int monitor_disable_udev_rules(void)
> > +{
> > +       CLEANUP(char, path) = strdup(autoconnect_rules);
> > +       char *s1, *s2;
> > +       int rc;
> > +
> > +       if (!path)
> > +               return -ENOMEM;
> > +
> > +       s2 = strrchr(path, '/');
> > +       for (s1 = s2 - 1; s1 > path && *s1 != '/'; s1--);
> > +
> > +       *s2 = *s1 = '\0';
> > +       rc = mkdir(path, 0755);
> > +       if (rc == 0 || errno == EEXIST) {
> > +               *s1 = '/';
> > +               rc = mkdir(path, 0755);
> > +               if (rc == 0 || errno == EEXIST) {
> > +                       *s2 = '/';
> > +                       rc = symlink("/dev/null", path);
> > +               }
> > +       }
> > +       if (rc) {
> > +               if (errno == EEXIST) {
> > +                       char target[PATH_MAX];
> > +
> > +                       if (readlink(path, target, sizeof(target))
> > != -1 &&
> > +                           !strcmp(target, "/dev/null")) {
> > +                               log(LOG_INFO,
> > +                                   "symlink %s -> /dev/null exists
> > already\n",
> > +                                   autoconnect_rules);
> > +                               return 1;
> > +                       }
> > +               }
> > +               log(LOG_ERR, "error creating %s: %m\n",
> > autoconnect_rules);
> > +       } else
> > +               log(LOG_INFO, "created %s\n", autoconnect_rules);
> > +
> > +       return rc ? (errno ? -errno : -EIO) : 0;
> > +}
> > +
> > +static void monitor_enable_udev_rules(void)
> > +{
> > +       if (unlink(autoconnect_rules) == -1 && errno != ENOENT)
> > +               log(LOG_ERR, "error removing %s: %m\n",
> > autoconnect_rules);
> > +       else
> > +               log(LOG_INFO, "removed %s\n", autoconnect_rules);
> > +}
> > +
> >   static int monitor_parse_opts(const char *desc, int argc, char
> > **argv)
> >   {
> >         bool quiet = false;
> >         bool verbose = false;
> >         bool debug = false;
> > -       int ret;
> > +       int ret = 0;
> > +
> >         OPT_ARGS(opts) = {
> >                 OPT_FLAG("autoconnect",    'A',
> > &mon_cfg.autoconnect, "automatically connect newly discovered
> > controllers"),
> >                 OPT_FLAG("silent",         'S',
> > &quiet,               "log level: silent"),
> > @@ -198,7 +257,17 @@ static int monitor_parse_opts(const char
> > *desc, int argc, char **argv)
> >                 log_level = LOG_INFO;
> >         if (debug)
> >                 log_level = LOG_DEBUG;
> > -
> > +       if (mon_cfg.autoconnect) {
> > +               ret = monitor_disable_udev_rules();
> > +               if (ret < 0) {
> > +                       mon_cfg.autoconnect = false;
> > +                       log(LOG_WARNING, "autoconnect disabled\n");
> > +                       ret = 0;
> > +               } else if (ret > 0) {
> > +                       mon_cfg.skip_udev_on_exit = true;
> > +                       ret = 0;
> > +               }
> > +       }
> >         return ret;
> >   }
> >   
> > @@ -221,6 +290,8 @@ int aen_monitor(const char *desc, int argc,
> > char **argv)
> >                 udev_monitor_unref(monitor);
> >         }
> >         udev = udev_unref(udev);
> > +       if (mon_cfg.autoconnect && !mon_cfg.skip_udev_on_exit)
> > +               monitor_enable_udev_rules();
> >   out:
> >         return nvme_status_to_errno(ret, true);
> >   }
> > 
> What on earth ...
> 
> No way.
> We should _not_ reference individual files or mess with udev rules
> from 
> a program. If a file needs to be modified, modify it.
> But do not try to modify a file from a program context, unless the 
> program itself has created it.

Sagi said the same, I'll drop this. I thought it was acceptable because
I'd be masking a rule from the same package, and preferable because
making the user responsible for it would be cumbersome and error-prone
on the part of the user.

Thanks,
Martin

> 
> Cheers,
> 
> Hannes



_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

  reply	other threads:[~2021-02-04  9:37 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-26 20:32 [PATCH 00/35] RFC: add "nvme monitor" subcommand mwilck
2021-01-26 20:32 ` [PATCH 01/35] nvme-monitor: add new stub mwilck
2021-01-26 20:32 ` [PATCH 02/35] monitor: create udev socket mwilck
2021-01-26 20:32 ` [PATCH 03/35] monitor: initialize signal handling mwilck
2021-01-26 20:32 ` [PATCH 04/35] monitor: add main loop for uevent monitoring mwilck
2021-01-26 20:32 ` [PATCH 05/35] monitor: add uevent filters mwilck
2021-02-04  6:58   ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 06/35] monitor: Create a log() macro mwilck
2021-02-04  7:01   ` Hannes Reinecke
2021-02-04  9:14     ` Martin Wilck
2021-01-26 20:32 ` [PATCH 07/35] fabrics: use " mwilck
2021-02-04  7:02   ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 08/35] monitor: add command line options to control logging mwilck
2021-02-04  7:04   ` Hannes Reinecke
2021-02-04  9:18     ` Martin Wilck
2021-01-26 20:32 ` [PATCH 09/35] nvme_get_ctrl_attr(): constify "path" argument mwilck
2021-02-04  7:05   ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 10/35] fabrics: export do_discover(), build_options() and config mwilck
2021-02-04  7:09   ` Hannes Reinecke
2021-02-04  9:21     ` Martin Wilck
2021-01-26 20:33 ` [PATCH 11/35] monitor: add option -A / --autoconnect mwilck
2021-01-29 18:59   ` Sagi Grimberg
2021-01-29 19:33     ` Martin Wilck
2021-01-29 20:09       ` Sagi Grimberg
2021-02-04  7:13   ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 12/35] monitor: add helpers for __attribute__((cleanup)) mwilck
2021-02-04  7:14   ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 13/35] monitor: disable nvmf-autoconnect udev rules in autoconnect mode mwilck
2021-01-29  1:52   ` Sagi Grimberg
2021-01-29 14:16     ` Martin Wilck
2021-01-29 18:54       ` Sagi Grimberg
2021-02-04  7:16   ` Hannes Reinecke
2021-02-04  9:37     ` Martin Wilck [this message]
2021-01-26 20:33 ` [PATCH 14/35] monitor: implement handling of fc_udev_device mwilck
2021-01-26 20:33 ` [PATCH 15/35] monitor: implement handling of nvme AEN events mwilck
2021-01-26 20:33 ` [PATCH 16/35] monitor: reset children's signal disposition mwilck
2021-01-29  1:54   ` Sagi Grimberg
2021-01-29 14:18     ` Martin Wilck
2021-01-26 20:33 ` [PATCH 17/35] monitor: handle SIGCHLD for terminated child processes mwilck
2021-01-29  1:54   ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 18/35] monitor: add "--persistent/-p" flag mwilck
2021-01-29 19:02   ` Sagi Grimberg
2021-01-29 19:45     ` Martin Wilck
2021-01-26 20:33 ` [PATCH 19/35] fabrics: use "const char *" in struct config mwilck
2021-02-04  7:20   ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 20/35] fabrics: export arg_str(), parse_conn_arg(), and remove_ctrl() mwilck
2021-01-26 20:33 ` [PATCH 21/35] nvme-cli: add "list.h" mwilck
2021-01-26 20:33 ` [PATCH 22/35] conn-db: add simple connection registry mwilck
2021-01-29  1:59   ` Sagi Grimberg
2021-01-29 14:18     ` Martin Wilck
2021-01-26 20:33 ` [PATCH 23/35] monitor: handle restart of pending discoveries mwilck
2021-01-26 20:33 ` [PATCH 24/35] monitor: monitor_discovery(): try to reuse existing controllers mwilck
2021-01-26 20:33 ` [PATCH 25/35] monitor: read existing connections on startup mwilck
2021-01-26 20:33 ` [PATCH 26/35] monitor: implement starting discovery controllers " mwilck
2021-01-29 21:06   ` Sagi Grimberg
2021-01-29 21:13     ` Martin Wilck
2021-01-29 21:18       ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 27/35] monitor: implement cleanup of created discovery controllers mwilck
2021-01-26 20:33 ` [PATCH 28/35] monitor: basic handling of add/remove uevents for nvme controllers mwilck
2021-01-26 20:33 ` [PATCH 29/35] monitor: kill running discovery tasks on exit mwilck
2021-01-26 20:33 ` [PATCH 30/35] monitor: add connection property options from connect-all mwilck
2021-01-26 20:33 ` [PATCH 31/35] completions: add completions for nvme monitor mwilck
2021-01-26 20:33 ` [PATCH 32/35] nvmf-autoconnect: add unit file for nvme-monitor.service mwilck
2021-01-29 19:08   ` Sagi Grimberg
2021-01-29 19:50     ` Martin Wilck
2021-01-26 20:33 ` [PATCH 33/35] nvme-connect-all(1): fix documentation for --quiet/-S mwilck
2021-01-29 19:09   ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 34/35] nvme-monitor(1): add man page for nvme-monitor mwilck
2021-01-26 20:33 ` [PATCH 35/35] monitor: add option --keep/-K mwilck
2021-01-29 19:10   ` Sagi Grimberg
2021-01-29 19:53     ` Martin Wilck
2021-01-29 20:16       ` Sagi Grimberg
2021-01-29 20:30         ` Martin Wilck
2021-01-29 20:45           ` Sagi Grimberg
2021-01-29 20:51             ` Martin Wilck
2021-01-29 20:57               ` Sagi Grimberg
2021-01-29 21:05                 ` Martin Wilck
2021-01-29 21:11                   ` Sagi Grimberg
2021-01-29 21:15                     ` Martin Wilck
2021-01-29 21:21                       ` Sagi Grimberg
2021-02-04  7:34                       ` Hannes Reinecke
2021-02-04  9:41                         ` Martin Wilck
2021-01-29  1:14 ` [PATCH 00/35] RFC: add "nvme monitor" subcommand Sagi Grimberg
2021-01-29 11:18   ` Martin Wilck
2021-01-29 20:08     ` Sagi Grimberg
2021-01-29 20:27       ` Martin Wilck
2021-02-04  7:52         ` Hannes Reinecke
2021-02-22 19:02 ` Enzo Matsumiya
2021-02-22 21:05   ` Martin Wilck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bca4cd03f4a9a64d36a746c92eb2afb4d7ce4750.camel@suse.com \
    --to=mwilck@suse.com \
    --cc=Chaitanya.Kulkarni@wdc.com \
    --cc=hare@suse.de \
    --cc=kbusch@kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox