svn commit: r239707 - releng/9.1/sys/geom
Warner Losh
imp at FreeBSD.org
Sun Aug 26 05:11:54 UTC 2012
Author: imp
Date: Sun Aug 26 05:11:52 2012
New Revision: 239707
URL: http://svn.freebsd.org/changeset/base/239707
Log:
MFS: r239148
r239148 | imp | 2012-08-08 14:21:33 -0600 (Wed, 08 Aug 2012) | 8 lines
Make the addition of the d_gone binary compatible. This allows
storage drivers compiled for 9.0 to work on 9.1 and preserves the ABI
for disks.
Reviewed by: scottl, ken
Approved by: re@ (kensmith)
MFS after: releng/9.1 gets sorted
This change fixes the binary compatibility problems with additions to
the disk(9) API. Disk drivers compiled against 9.0 will not work on
9.1-RC1, but should start working after this change or in 9.1-RC2 and
later. Disk drivers should not be linked against 9.1-RC1 for
distribution, except specifically for testing on RC1. This was
planned for RC1, but it was delayed due to circumstancs beyond my
control.
Approved by: re@ (kensmith)
Modified:
releng/9.1/sys/geom/geom_disk.c
releng/9.1/sys/geom/geom_disk.h
Directory Properties:
releng/9.1/sys/ (props changed)
Modified: releng/9.1/sys/geom/geom_disk.c
==============================================================================
--- releng/9.1/sys/geom/geom_disk.c Sun Aug 26 04:39:20 2012 (r239706)
+++ releng/9.1/sys/geom/geom_disk.c Sun Aug 26 05:11:52 2012 (r239707)
@@ -509,7 +509,14 @@ g_disk_providergone(struct g_provider *p
dp = sc->dp;
- if (dp->d_gone != NULL)
+ /*
+ * FreeBSD 9 started with VERSION_01 of the struct disk structure.
+ * However, g_gone was added in the middle of the branch. To
+ * cope with version being missing from struct disk, we set a flag
+ * in g_disk_create for VERSION_01 and avoid touching the d_gone
+ * field for old consumers.
+ */
+ if (!(dp->d_flags & DISKFLAG_LACKS_GONE) && dp->d_gone != NULL)
dp->d_gone(dp);
}
@@ -577,7 +584,7 @@ disk_alloc()
void
disk_create(struct disk *dp, int version)
{
- if (version != DISK_VERSION_02) {
+ if (version != DISK_VERSION_02 && version != DISK_VERSION_01) {
printf("WARNING: Attempt to add disk %s%d %s",
dp->d_name, dp->d_unit,
" using incompatible ABI version of disk(9)\n");
@@ -585,6 +592,8 @@ disk_create(struct disk *dp, int version
dp->d_name, dp->d_unit);
return;
}
+ if (version == DISK_VERSION_01)
+ dp->d_flags |= DISKFLAG_LACKS_GONE;
KASSERT(dp->d_strategy != NULL, ("disk_create need d_strategy"));
KASSERT(dp->d_name != NULL, ("disk_create need d_name"));
KASSERT(*dp->d_name != 0, ("disk_create need d_name"));
Modified: releng/9.1/sys/geom/geom_disk.h
==============================================================================
--- releng/9.1/sys/geom/geom_disk.h Sun Aug 26 04:39:20 2012 (r239706)
+++ releng/9.1/sys/geom/geom_disk.h Sun Aug 26 05:11:52 2012 (r239707)
@@ -78,7 +78,6 @@ struct disk {
disk_ioctl_t *d_ioctl;
dumper_t *d_dump;
disk_getattr_t *d_getattr;
- disk_gone_t *d_gone;
/* Info fields from driver to geom_disk.c. Valid when open */
u_int d_sectorsize;
@@ -97,12 +96,16 @@ struct disk {
/* Fields private to the driver */
void *d_drv1;
+
+ /* new fields in stable - don't use if DISKFLAG_LACKS_GONE is set */
+ disk_gone_t *d_gone;
};
#define DISKFLAG_NEEDSGIANT 0x1
#define DISKFLAG_OPEN 0x2
#define DISKFLAG_CANDELETE 0x4
#define DISKFLAG_CANFLUSHCACHE 0x8
+#define DISKFLAG_LACKS_GONE 0x10
struct disk *disk_alloc(void);
void disk_create(struct disk *disk, int version);
More information about the svn-src-all
mailing list