Author: imp
Date: Tue Nov 18 17:06:40 2014
New Revision: 274661
URL: https://svnweb.freebsd.org/changeset/base/274661

Log:
  Implement the historic DIOCGDINFO ioctl for gpart on BSD
  partitions. Several utilities still use this interface and require
  additional information since gpart was activated than before. This
  allows fsck of a UFS partition without having to specify it is UFS,
  per historic behavior.

Modified:
  head/sys/conf/files
  head/sys/geom/part/g_part.c
  head/sys/geom/part/g_part_bsd.c
  head/sys/geom/part/g_part_if.m
  head/sys/modules/geom/geom_part/geom_part_bsd/Makefile

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Tue Nov 18 16:31:00 2014        (r274660)
+++ head/sys/conf/files Tue Nov 18 17:06:40 2014        (r274661)
@@ -2773,7 +2773,7 @@ geom/eli/pkcs5v2.c                optional geom_eli
 geom/gate/g_gate.c             optional geom_gate
 geom/geom_aes.c                        optional geom_aes
 geom/geom_bsd.c                        optional geom_bsd
-geom/geom_bsd_enc.c            optional geom_bsd
+geom/geom_bsd_enc.c            optional geom_bsd | geom_part_bsd
 geom/geom_ccd.c                        optional ccd | geom_ccd
 geom/geom_ctl.c                        standard
 geom/geom_dev.c                        standard

Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c Tue Nov 18 16:31:00 2014        (r274660)
+++ head/sys/geom/part/g_part.c Tue Nov 18 17:06:40 2014        (r274661)
@@ -143,6 +143,7 @@ static g_orphan_t g_part_orphan;
 static g_spoiled_t g_part_spoiled;
 static g_start_t g_part_start;
 static g_resize_t g_part_resize;
+static g_ioctl_t g_part_ioctl;
 
 static struct g_class g_part_class = {
        .name = "PART",
@@ -159,7 +160,8 @@ static struct g_class g_part_class = {
        .orphan = g_part_orphan,
        .spoiled = g_part_spoiled,
        .start = g_part_start,
-       .resize = g_part_resize
+       .resize = g_part_resize,
+       .ioctl = g_part_ioctl,
 };
 
 DECLARE_GEOM_CLASS(g_part_class, g_part);
@@ -2059,6 +2061,25 @@ g_part_dumpconf(struct sbuf *sb, const c
        }
 }
 
+/*-
+ * This start routine is only called for non-trivial requests, all the
+ * trivial ones are handled autonomously by the slice code.
+ * For requests we handle here, we must call the g_io_deliver() on the
+ * bio, and return non-zero to indicate to the slice code that we did so.
+ * This code executes in the "DOWN" I/O path, this means:
+ *    * No sleeping.
+ *    * Don't grab the topology lock.
+ *    * Don't call biowait, g_getattr(), g_setattr() or g_read_data()
+ */
+static int
+g_part_ioctl(struct g_provider *pp, u_long cmd, void *data, int fflag, struct 
thread *td)
+{
+       struct g_part_table *table;
+
+       table = pp->geom->softc;
+       return G_PART_IOCTL(table, pp, cmd, data, fflag, td);
+}
+
 static void
 g_part_resize(struct g_consumer *cp)
 {

Modified: head/sys/geom/part/g_part_bsd.c
==============================================================================
--- head/sys/geom/part/g_part_bsd.c     Tue Nov 18 16:31:00 2014        
(r274660)
+++ head/sys/geom/part/g_part_bsd.c     Tue Nov 18 17:06:40 2014        
(r274661)
@@ -83,6 +83,8 @@ static const char *g_part_bsd_type(struc
 static int g_part_bsd_write(struct g_part_table *, struct g_consumer *);
 static int g_part_bsd_resize(struct g_part_table *, struct g_part_entry *,
     struct g_part_parms *);
+static int g_part_bsd_ioctl(struct g_part_table *, struct g_provider *,
+    u_long cmd, void *data, int fflag, struct thread *td);
 
 static kobj_method_t g_part_bsd_methods[] = {
        KOBJMETHOD(g_part_add,          g_part_bsd_add),
@@ -98,6 +100,7 @@ static kobj_method_t g_part_bsd_methods[
        KOBJMETHOD(g_part_read,         g_part_bsd_read),
        KOBJMETHOD(g_part_type,         g_part_bsd_type),
        KOBJMETHOD(g_part_write,        g_part_bsd_write),
+       KOBJMETHOD(g_part_ioctl,        g_part_bsd_ioctl),
        { 0, 0 }
 };
 
@@ -494,6 +497,38 @@ g_part_bsd_type(struct g_part_table *bas
        return (buf);
 }
 
+/*-
+ * This start routine is only called for non-trivial requests, all the
+ * trivial ones are handled autonomously by the slice code.
+ * For requests we handle here, we must call the g_io_deliver() on the
+ * bio, and return non-zero to indicate to the slice code that we did so.
+ * This code executes in the "DOWN" I/O path, this means:
+ *    * No sleeping.
+ *    * Don't grab the topology lock.
+ *    * Don't call biowait, g_getattr(), g_setattr() or g_read_data()
+ */
+static int
+g_part_bsd_ioctl(struct g_part_table *basetable, struct g_provider *pp,
+    u_long cmd, void *data, int fflag, struct thread *td)
+{
+
+       switch (cmd)
+       {
+       case DIOCGDINFO:
+       {
+               struct g_part_bsd_table *table;
+               u_char *p;
+
+               table = (struct g_part_bsd_table *)basetable;
+               p = table->bbarea + pp->sectorsize;
+               return (bsd_disklabel_le_dec(p, data, MAXPARTITIONS));
+       }
+       default:
+               return (ENOIOCTL);
+
+       }
+}
+
 static int
 g_part_bsd_write(struct g_part_table *basetable, struct g_consumer *cp)
 {

Modified: head/sys/geom/part/g_part_if.m
==============================================================================
--- head/sys/geom/part/g_part_if.m      Tue Nov 18 16:31:00 2014        
(r274660)
+++ head/sys/geom/part/g_part_if.m      Tue Nov 18 17:06:40 2014        
(r274661)
@@ -71,6 +71,14 @@ CODE {
        {
                return (ENOSYS);
        }
+
+       static int
+       default_ioctl(struct g_part_table *table __unused, struct g_provider 
*pp __unused,
+           u_long cmd __unused, void *data __unused, int fflag __unused,
+           struct thread *td __unused)
+       {
+               return (ENOIOCTL);
+       }
 };
 
 # add() - scheme specific processing for the add verb.
@@ -120,6 +128,16 @@ METHOD void fullname {
        const char *pfx;
 } DEFAULT default_fullname;
 
+# ioctl() - implement historic ioctls, perhaps.
+METHOD int ioctl {
+       struct g_part_table *table;
+       struct g_provider *pp;
+       u_long cmd;
+       void *data;
+       int fflag;
+       struct thread *td;
+} DEFAULT default_ioctl;
+
 # modify() - scheme specific processing for the modify verb.
 METHOD int modify {
        struct g_part_table *table;

Modified: head/sys/modules/geom/geom_part/geom_part_bsd/Makefile
==============================================================================
--- head/sys/modules/geom/geom_part/geom_part_bsd/Makefile      Tue Nov 18 
16:31:00 2014        (r274660)
+++ head/sys/modules/geom/geom_part/geom_part_bsd/Makefile      Tue Nov 18 
17:06:40 2014        (r274661)
@@ -1,9 +1,9 @@
 # $FreeBSD$
 
-.PATH: ${.CURDIR}/../../../../geom/part
+.PATH: ${.CURDIR}/../../../../geom/part ${.CURDIR}/../../../../geom
 
 KMOD=  geom_part_bsd
-SRCS=  g_part_bsd.c
+SRCS=  g_part_bsd.c geom_bsd_enc.c
 
 SRCS+= bus_if.h device_if.h g_part_if.h
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to