Author: mav
Date: Thu Mar 26 08:36:08 2015
New Revision: 280678
URL: https://svnweb.freebsd.org/changeset/base/280678

Log:
  MFC r279913: Fix couple BIO_DELETE bugs in geom_mirror.
  
  Do not report GEOM::candelete if none of providers support BIO_DELETE.
  If consumer still requests BIO_DELETE, report error instead of hanging.

Modified:
  stable/10/sys/geom/mirror/g_mirror.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/10/sys/geom/mirror/g_mirror.c        Thu Mar 26 07:28:32 2015        
(r280677)
+++ stable/10/sys/geom/mirror/g_mirror.c        Thu Mar 26 08:36:08 2015        
(r280678)
@@ -1027,6 +1027,23 @@ g_mirror_sync_done(struct bio *bp)
 }
 
 static void
+g_mirror_candelete(struct bio *bp)
+{
+       struct g_mirror_softc *sc;
+       struct g_mirror_disk *disk;
+       int *val;
+
+       sc = bp->bio_to->geom->softc;
+       LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+               if (disk->d_flags & G_MIRROR_DISK_FLAG_CANDELETE)
+                       break;
+       }
+       val = (int *)bp->bio_data;
+       *val = (disk != NULL);
+       g_io_deliver(bp, 0);
+}
+
+static void
 g_mirror_kernel_dump(struct bio *bp)
 {
        struct g_mirror_softc *sc;
@@ -1120,9 +1137,10 @@ g_mirror_start(struct bio *bp)
                g_mirror_flush(sc, bp);
                return;
        case BIO_GETATTR:
-               if (g_handleattr_int(bp, "GEOM::candelete", 1))
+               if (!strcmp(bp->bio_attribute, "GEOM::candelete")) {
+                       g_mirror_candelete(bp);
                        return;
-               else if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) {
+               } else if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) {
                        g_mirror_kernel_dump(bp);
                        return;
                }
@@ -1686,6 +1704,10 @@ g_mirror_register_request(struct bio *bp
                            ("Consumer %s not opened (r%dw%de%d).",
                            cp->provider->name, cp->acr, cp->acw, cp->ace));
                }
+               if (bioq_first(&queue) == NULL) {
+                       g_io_deliver(bp, EOPNOTSUPP);
+                       return;
+               }
                while ((cbp = bioq_takefirst(&queue)) != NULL) {
                        G_MIRROR_LOGREQ(3, cbp, "Sending request.");
                        cp = cbp->bio_caller1;
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to