tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: patch - cgdconfig do_all mode gracefully ignore detached devices



Thanks for the quick chat.  Per suggestions, I'm using open rather
than opendisk.  Ok?

Index: cgdconfig.c
===================================================================
RCS file: /cvsroot/src/sbin/cgdconfig/cgdconfig.c,v
retrieving revision 1.50
diff -b -u -r1.50 cgdconfig.c
--- cgdconfig.c    10 Apr 2019 06:11:37 -0000    1.50
+++ cgdconfig.c    10 Nov 2019 15:56:40 -0000
@@ -125,6 +125,7 @@
 static int     verify_reenter(struct params *);
 static int     verify_mbr(int);
 static int     verify_gpt(int);
+static int     verify_attached(const char * opath);

 __dead static void     usage(void);

@@ -540,6 +541,19 @@
         return -1;
     }

+    /* if called from do_all, then ignore if device is not attached */
+    if (flags == CONFIG_FLAGS_FROMALL) {
+
+        ret = verify_attached(argv[1]);
+
+        /* device unattached */
+        if (ret == 0) {
+            VPRINTF(1, ("skipping %s: device is not attached\n", argv[1]));
+            return 0;
+        }
+        /* pass-through success and errors */
+    }
+
     if ((
       fd = opendisk1(*argv, O_RDWR, cgdname, sizeof(cgdname), 1, prog_open)
         ) != -1) {
@@ -1282,3 +1296,19 @@
     if (setrlimit(RLIMIT_CORE, &rlp) == -1)
         err(EXIT_FAILURE, "Can't disable cores");
 }
+
+static int
+verify_attached(const char * opath)
+{
+    int fd;
+
+    if (fd = open(opath,O_RDWR) == -1) {
+        if (errno == ENXIO) {
+            return 0;
+        }
+        return -1;
+    }
+    close(fd);
+
+    return 1;
+}

On Sun, Nov 10, 2019 at 9:37 AM Jason High <json.high%gmail.com@localhost> wrote:
>
> Thanks for your feedback!  We cannot fail silently in configure as-is
> due to the config/verification flow.  However, if what was meant was
> to check for ENXIO in the verification function, then that works, and
> is a much simpler solution.  In the below diff, we removed the check
> on -U per the issues raised by Robert.  For -C, we simply try to open
> the device path.  On error, if we get ENXIO we return 0.
> Otherwise we let -1 pass through to be handled as expected in the
> flow.  Is this any closer to your liking?  Tested and working as
> expected.  Thanks so much for your review
>
> Index: cgdconfig.c
> ===================================================================
> RCS file: /cvsroot/src/sbin/cgdconfig/cgdconfig.c,v
> retrieving revision 1.50
> diff -b -u -r1.50 cgdconfig.c
> --- cgdconfig.c    10 Apr 2019 06:11:37 -0000    1.50
> +++ cgdconfig.c    10 Nov 2019 15:09:33 -0000
> @@ -125,6 +125,7 @@
>  static int     verify_reenter(struct params *);
>  static int     verify_mbr(int);
>  static int     verify_gpt(int);
> +static int     verify_attached(const char * opath);
>
>  __dead static void     usage(void);
>
> @@ -540,6 +541,19 @@
>          return -1;
>      }
>
> +    /* if called from do_all, then ignore if device is not attached */
> +    if (flags == CONFIG_FLAGS_FROMALL) {
> +
> +        ret = verify_attached(argv[1]);
> +
> +        /* device unattached */
> +        if (ret == 0) {
> +            VPRINTF(1, ("skipping %s: device is not attached\n", argv[1]));
> +            return 0;
> +        }
> +        /* pass-through success and errors */
> +    }
> +
>      if ((
>        fd = opendisk1(*argv, O_RDWR, cgdname, sizeof(cgdname), 1, prog_open)
>          ) != -1) {
> @@ -1282,3 +1296,25 @@
>      if (setrlimit(RLIMIT_CORE, &rlp) == -1)
>          err(EXIT_FAILURE, "Can't disable cores");
>  }
> +
> +static int
> +verify_attached(const char * opath)
> + check if opath is accessible
> +{
> +    int fd;
> +    char path[MAXPATHLEN];
> +
> +    fd = opendisk(opath,O_RDWR,path,sizeof(path),0);
> +
> +    if (fd == -1) {
> +        if (errno == ENXIO) {
> +            return 0;
> +        }
> +        return -1;
> +    }
> +
> +    close(fd);
> +
> +    return 1;
> +}
>
> On Sun, Nov 10, 2019 at 1:42 AM Michael van Elst <mlelstv%serpens.de@localhost> wrote:
> >
> > On Sun, Nov 10, 2019 at 01:21:21AM -0600, Jason High wrote:
> > > For -U, that could work (was actually how we handled it in an earlier
> > > version).  For -C, no.  Our goal is to avoid cgd trying to configure a
> > > device, like those backed by USB drives, on boot when the backing
> > > device isn't attached.
> >
> > Why? Whether you rely on magic (== non-standard interfaces with
> > unspecified semantics) to skip the configuration or the configuration
> > just fails silently shouldn't make a difference.
> >
> >
> > Greetings,
> > --
> >                                 Michael van Elst
> > Internet: mlelstv%serpens.de@localhost
> >                                 "A potential Snark may lurk in every tree."


Home | Main Index | Thread Index | Old Index