mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-31 16:57:10 +00:00
Get rid of g_slice_addslice() and use g_slice_config() instead.
Tested with: i386 + src/tools/regression/geom
This commit is contained in:
parent
6b8fc51d28
commit
a1d5f791fa
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=107956
@ -227,7 +227,7 @@ g_gpt_taste(struct g_class *mp, struct g_provider *pp, int insist)
|
|||||||
ps = (!memcmp(&ent->ent_type, &freebsd, sizeof(freebsd)))
|
ps = (!memcmp(&ent->ent_type, &freebsd, sizeof(freebsd)))
|
||||||
? 's' : 'p';
|
? 's' : 'p';
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
(void)g_slice_addslice(gp, i,
|
(void)g_slice_config(gp, i, G_SLICE_CONFIG_SET,
|
||||||
ent->ent_lba_start * secsz,
|
ent->ent_lba_start * secsz,
|
||||||
(1 + ent->ent_lba_end - ent->ent_lba_start) * secsz,
|
(1 + ent->ent_lba_end - ent->ent_lba_start) * secsz,
|
||||||
secsz,
|
secsz,
|
||||||
@ -244,15 +244,12 @@ g_gpt_taste(struct g_class *mp, struct g_provider *pp, int insist)
|
|||||||
g_free(mbr);
|
g_free(mbr);
|
||||||
|
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
error = g_access_rel(cp, -1, 0, 0);
|
g_access_rel(cp, -1, 0, 0);
|
||||||
|
if (LIST_EMPTY(&gp->provider)) {
|
||||||
if (npart > 0) {
|
g_std_spoiled(cp);
|
||||||
LIST_FOREACH(pp, &gp->provider, provider)
|
return (NULL);
|
||||||
g_error_provider(pp, 0);
|
|
||||||
return (gp);
|
|
||||||
}
|
}
|
||||||
g_std_spoiled(cp);
|
return (gp);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct g_class g_gpt_class = {
|
static struct g_class g_gpt_class = {
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <sys/errno.h>
|
||||||
#ifndef _KERNEL
|
#ifndef _KERNEL
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -57,6 +58,18 @@
|
|||||||
#define MBR_CLASS_NAME "MBR"
|
#define MBR_CLASS_NAME "MBR"
|
||||||
#define MBREXT_CLASS_NAME "MBREXT"
|
#define MBREXT_CLASS_NAME "MBREXT"
|
||||||
|
|
||||||
|
static struct dos_partition historical_bogus_partition_table[NDOSPART] = {
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0x80, 0, 1, 0, DOSPTYP_386BSD, 255, 255, 255, 0, 50000, },
|
||||||
|
};
|
||||||
|
static struct dos_partition historical_bogus_partition_table_fixed[NDOSPART] = {
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
||||||
|
{ 0x80, 0, 1, 0, DOSPTYP_386BSD, 254, 255, 255, 0, 50000, },
|
||||||
|
};
|
||||||
static void
|
static void
|
||||||
g_dec_dos_partition(u_char *ptr, struct dos_partition *d)
|
g_dec_dos_partition(u_char *ptr, struct dos_partition *d)
|
||||||
{
|
{
|
||||||
@ -96,6 +109,62 @@ struct g_mbr_softc {
|
|||||||
struct dos_partition dospart[NDOSPART];
|
struct dos_partition dospart[NDOSPART];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
g_mbr_modify(struct g_geom *gp, struct g_mbr_softc *ms, struct dos_partition *dp)
|
||||||
|
{
|
||||||
|
int i, error;
|
||||||
|
off_t l[NDOSPART];
|
||||||
|
|
||||||
|
g_topology_assert();
|
||||||
|
|
||||||
|
if ((!bcmp(dp, historical_bogus_partition_table,
|
||||||
|
sizeof historical_bogus_partition_table)) ||
|
||||||
|
(!bcmp(dp, historical_bogus_partition_table_fixed,
|
||||||
|
sizeof historical_bogus_partition_table_fixed))) {
|
||||||
|
/*
|
||||||
|
* We will not allow people to write these from "the inside",
|
||||||
|
* Since properly selfdestructing takes too much code. If
|
||||||
|
* people really want to do this, they cannot have any
|
||||||
|
* providers of this geom open, and in that case they can just
|
||||||
|
* as easily overwrite the MBR in the parent device.
|
||||||
|
*/
|
||||||
|
return(EBUSY);
|
||||||
|
}
|
||||||
|
for (i = 0; i < NDOSPART; i++) {
|
||||||
|
/*
|
||||||
|
* A Protective MBR (PMBR) has a single partition of
|
||||||
|
* type 0xEE spanning the whole disk. Such a MBR
|
||||||
|
* protects a GPT on the disk from MBR tools that
|
||||||
|
* don't know anything about GPT. We're interpreting
|
||||||
|
* it a bit more loosely: any partition of type 0xEE
|
||||||
|
* is to be skipped as it doesn't contain any data
|
||||||
|
* that we should care about. We still allow other
|
||||||
|
* partitions to be present in the MBR. A PMBR will
|
||||||
|
* be handled correctly anyway.
|
||||||
|
*/
|
||||||
|
if (dp[i].dp_typ == 0xee)
|
||||||
|
l[i] = 0;
|
||||||
|
else if (dp[i].dp_flag != 0 && dp[i].dp_flag != 0x80)
|
||||||
|
l[i] = 0;
|
||||||
|
else if (dp[i].dp_typ == 0)
|
||||||
|
l[i] = 0;
|
||||||
|
else
|
||||||
|
l[i] = (off_t)dp[i].dp_size << 9ULL;
|
||||||
|
error = g_slice_config(gp, i, G_SLICE_CONFIG_CHECK,
|
||||||
|
(off_t)dp[i].dp_start << 9ULL, l[i], 512,
|
||||||
|
"%ss%d", gp->name, 1 + i);
|
||||||
|
if (error)
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
for (i = 0; i < NDOSPART; i++) {
|
||||||
|
ms->type[i] = dp[i].dp_typ;
|
||||||
|
g_slice_config(gp, i, G_SLICE_CONFIG_SET,
|
||||||
|
(off_t)dp[i].dp_start << 9ULL, l[i], 512,
|
||||||
|
"%ss%d", gp->name, 1 + i);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
g_mbr_start(struct bio *bp)
|
g_mbr_start(struct bio *bp)
|
||||||
{
|
{
|
||||||
@ -139,18 +208,6 @@ g_mbr_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g_
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct dos_partition historical_bogus_partition_table[NDOSPART] = {
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0x80, 0, 1, 0, DOSPTYP_386BSD, 255, 255, 255, 0, 50000, },
|
|
||||||
};
|
|
||||||
static struct dos_partition historical_bogus_partition_table_fixed[NDOSPART] = {
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
|
|
||||||
{ 0x80, 0, 1, 0, DOSPTYP_386BSD, 254, 255, 255, 0, 50000, },
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
g_mbr_print(int i, struct dos_partition *dp)
|
g_mbr_print(int i, struct dos_partition *dp)
|
||||||
@ -168,8 +225,7 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
|
|||||||
{
|
{
|
||||||
struct g_geom *gp;
|
struct g_geom *gp;
|
||||||
struct g_consumer *cp;
|
struct g_consumer *cp;
|
||||||
struct g_provider *pp2;
|
int error, i;
|
||||||
int error, i, npart;
|
|
||||||
struct dos_partition dp[NDOSPART];
|
struct dos_partition dp[NDOSPART];
|
||||||
struct g_mbr_softc *ms;
|
struct g_mbr_softc *ms;
|
||||||
struct g_slicer *gsp;
|
struct g_slicer *gsp;
|
||||||
@ -184,7 +240,6 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
|
|||||||
gsp = gp->softc;
|
gsp = gp->softc;
|
||||||
g_topology_unlock();
|
g_topology_unlock();
|
||||||
gp->dumpconf = g_mbr_dumpconf;
|
gp->dumpconf = g_mbr_dumpconf;
|
||||||
npart = 0;
|
|
||||||
while (1) { /* a trick to allow us to use break */
|
while (1) { /* a trick to allow us to use break */
|
||||||
if (gp->rank != 2 && insist == 0)
|
if (gp->rank != 2 && insist == 0)
|
||||||
break;
|
break;
|
||||||
@ -219,55 +274,18 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
|
|||||||
printf("Ignoring known bogus MBR #1\n");
|
printf("Ignoring known bogus MBR #1\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
npart = 0;
|
g_mbr_modify(gp, ms, dp);
|
||||||
for (i = 0; i < NDOSPART; i++) {
|
|
||||||
/*
|
|
||||||
* A Protective MBR (PMBR) has a single partition of
|
|
||||||
* type 0xEE spanning the whole disk. Such a MBR
|
|
||||||
* protects a GPT on the disk from MBR tools that
|
|
||||||
* don't know anything about GPT. We're interpreting
|
|
||||||
* it a bit more loosely: any partition of type 0xEE
|
|
||||||
* is to be skipped as it doesn't contain any data
|
|
||||||
* that we should care about. We still allow other
|
|
||||||
* partitions to be present in the MBR. A PMBR will
|
|
||||||
* be handled correctly anyway.
|
|
||||||
*/
|
|
||||||
if (dp[i].dp_typ == 0xee)
|
|
||||||
continue;
|
|
||||||
if (dp[i].dp_flag != 0 && dp[i].dp_flag != 0x80)
|
|
||||||
continue;
|
|
||||||
if (dp[i].dp_typ == 0)
|
|
||||||
continue;
|
|
||||||
if (dp[i].dp_size == 0)
|
|
||||||
continue;
|
|
||||||
if (bootverbose) {
|
|
||||||
printf("MBR Slice %d on %s:\n", i + 1, gp->name);
|
|
||||||
g_mbr_print(i, dp + i);
|
|
||||||
}
|
|
||||||
npart++;
|
|
||||||
ms->type[i] = dp[i].dp_typ;
|
|
||||||
g_topology_lock();
|
|
||||||
pp2 = g_slice_addslice(gp, i,
|
|
||||||
(off_t)dp[i].dp_start << 9ULL,
|
|
||||||
(off_t)dp[i].dp_size << 9ULL,
|
|
||||||
sectorsize,
|
|
||||||
"%ss%d", gp->name, i + 1);
|
|
||||||
g_topology_unlock();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
error = g_access_rel(cp, -1, 0, 0);
|
g_access_rel(cp, -1, 0, 0);
|
||||||
if (npart > 0) {
|
if (LIST_EMPTY(&gp->provider)) {
|
||||||
LIST_FOREACH(pp, &gp->provider, provider)
|
g_std_spoiled(cp);
|
||||||
g_error_provider(pp, 0);
|
return (NULL);
|
||||||
return (gp);
|
|
||||||
}
|
}
|
||||||
g_std_spoiled(cp);
|
return (gp);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct g_class g_mbr_class = {
|
static struct g_class g_mbr_class = {
|
||||||
MBR_CLASS_NAME,
|
MBR_CLASS_NAME,
|
||||||
g_mbr_taste,
|
g_mbr_taste,
|
||||||
@ -326,7 +344,6 @@ g_mbrext_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
|
|||||||
{
|
{
|
||||||
struct g_geom *gp;
|
struct g_geom *gp;
|
||||||
struct g_consumer *cp;
|
struct g_consumer *cp;
|
||||||
struct g_provider *pp2;
|
|
||||||
int error, i, slice;
|
int error, i, slice;
|
||||||
struct g_mbrext_softc *ms;
|
struct g_mbrext_softc *ms;
|
||||||
off_t off;
|
off_t off;
|
||||||
@ -374,8 +391,7 @@ g_mbrext_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
|
|||||||
g_mbr_print(1, dp + 1);
|
g_mbr_print(1, dp + 1);
|
||||||
if ((dp[0].dp_flag & 0x7f) == 0 &&
|
if ((dp[0].dp_flag & 0x7f) == 0 &&
|
||||||
dp[0].dp_size != 0 && dp[0].dp_typ != 0) {
|
dp[0].dp_size != 0 && dp[0].dp_typ != 0) {
|
||||||
g_topology_lock();
|
g_slice_config(gp, slice, G_SLICE_CONFIG_SET,
|
||||||
pp2 = g_slice_addslice(gp, slice,
|
|
||||||
(((off_t)dp[0].dp_start) << 9ULL) + off,
|
(((off_t)dp[0].dp_start) << 9ULL) + off,
|
||||||
((off_t)dp[0].dp_size) << 9ULL,
|
((off_t)dp[0].dp_size) << 9ULL,
|
||||||
sectorsize,
|
sectorsize,
|
||||||
@ -387,7 +403,6 @@ g_mbrext_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
|
|||||||
g_topology_unlock();
|
g_topology_unlock();
|
||||||
ms->type[slice] = dp[0].dp_typ;
|
ms->type[slice] = dp[0].dp_typ;
|
||||||
slice++;
|
slice++;
|
||||||
g_error_provider(pp2, 0);
|
|
||||||
}
|
}
|
||||||
if (dp[1].dp_flag != 0)
|
if (dp[1].dp_flag != 0)
|
||||||
break;
|
break;
|
||||||
@ -400,16 +415,12 @@ g_mbrext_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
error = g_access_rel(cp, -1, 0, 0);
|
g_access_rel(cp, -1, 0, 0);
|
||||||
if (slice > 0) {
|
if (LIST_EMPTY(&gp->provider)) {
|
||||||
/* XXX: add magic spaces */
|
g_std_spoiled(cp);
|
||||||
return (gp);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
return (gp);
|
||||||
g_topology_assert();
|
|
||||||
g_std_spoiled(cp);
|
|
||||||
g_topology_assert();
|
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -152,7 +152,6 @@ g_pc98_taste(struct g_class *mp, struct g_provider *pp, int flags)
|
|||||||
{
|
{
|
||||||
struct g_geom *gp;
|
struct g_geom *gp;
|
||||||
struct g_consumer *cp;
|
struct g_consumer *cp;
|
||||||
struct g_provider *pp2;
|
|
||||||
int error, i, npart;
|
int error, i, npart;
|
||||||
struct g_pc98_softc *ms;
|
struct g_pc98_softc *ms;
|
||||||
struct g_slicer *gsp;
|
struct g_slicer *gsp;
|
||||||
@ -237,7 +236,7 @@ g_pc98_taste(struct g_class *mp, struct g_provider *pp, int flags)
|
|||||||
ms->type[i] = (ms->dp[i].dp_sid << 8) |
|
ms->type[i] = (ms->dp[i].dp_sid << 8) |
|
||||||
ms->dp[i].dp_mid;
|
ms->dp[i].dp_mid;
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
pp2 = g_slice_addslice(gp, i,
|
g_slice_config(gp, i, G_SLICE_CONFIG_SET,
|
||||||
ms->dp[i].dp_scyl * spercyl,
|
ms->dp[i].dp_scyl * spercyl,
|
||||||
(ms->dp[i].dp_ecyl - ms->dp[i].dp_scyl + 1) *
|
(ms->dp[i].dp_ecyl - ms->dp[i].dp_scyl + 1) *
|
||||||
spercyl,
|
spercyl,
|
||||||
@ -248,14 +247,12 @@ g_pc98_taste(struct g_class *mp, struct g_provider *pp, int flags)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
error = g_access_rel(cp, -1, 0, 0);
|
g_access_rel(cp, -1, 0, 0);
|
||||||
if (npart > 0) {
|
if (LIST_EMPTY(&gp->provider)) {
|
||||||
LIST_FOREACH(pp, &gp->provider, provider)
|
g_std_spoiled(cp);
|
||||||
g_error_provider(pp, 0);
|
return (NULL);
|
||||||
return (gp);
|
|
||||||
}
|
}
|
||||||
g_std_spoiled(cp);
|
return (gp);
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct g_class g_pc98_class = {
|
static struct g_class g_pc98_class = {
|
||||||
|
@ -384,38 +384,6 @@ g_slice_conf_hot(struct g_geom *gp, u_int idx, off_t offset, off_t length)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct g_provider *
|
|
||||||
g_slice_addslice(struct g_geom *gp, int idx, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
struct g_provider *pp;
|
|
||||||
struct g_slicer *gsp;
|
|
||||||
va_list ap;
|
|
||||||
struct sbuf *sb;
|
|
||||||
|
|
||||||
g_trace(G_T_TOPOLOGY, "g_slice_addslice()");
|
|
||||||
g_topology_assert();
|
|
||||||
gsp = gp->softc;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND);
|
|
||||||
sbuf_vprintf(sb, fmt, ap);
|
|
||||||
sbuf_finish(sb);
|
|
||||||
pp = g_new_providerf(gp, sbuf_data(sb));
|
|
||||||
|
|
||||||
pp->index = idx;
|
|
||||||
gsp->slices[idx].length = length;
|
|
||||||
gsp->slices[idx].offset = offset;
|
|
||||||
gsp->slices[idx].provider = pp;
|
|
||||||
gsp->slices[idx].sectorsize = sectorsize;
|
|
||||||
pp->mediasize = gsp->slices[idx].length;
|
|
||||||
pp->sectorsize = gsp->slices[idx].sectorsize;
|
|
||||||
sbuf_delete(sb);
|
|
||||||
if (bootverbose)
|
|
||||||
printf("GEOM: Add %s, start %jd length %jd end %jd\n",
|
|
||||||
pp->name, (intmax_t)offset, (intmax_t)length,
|
|
||||||
(intmax_t)(offset + length - 1));
|
|
||||||
return(pp);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct g_geom *
|
struct g_geom *
|
||||||
g_slice_new(struct g_class *mp, u_int slices, struct g_provider *pp, struct g_consumer **cpp, void *extrap, int extra, g_slice_start_t *start)
|
g_slice_new(struct g_class *mp, u_int slices, struct g_provider *pp, struct g_consumer **cpp, void *extrap, int extra, g_slice_start_t *start)
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,6 @@ struct g_slicer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
g_dumpconf_t g_slice_dumpconf;
|
g_dumpconf_t g_slice_dumpconf;
|
||||||
struct g_provider * g_slice_addslice(struct g_geom *gp, int idx, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...);
|
|
||||||
int g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...);
|
int g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...);
|
||||||
#define G_SLICE_CONFIG_CHECK 0
|
#define G_SLICE_CONFIG_CHECK 0
|
||||||
#define G_SLICE_CONFIG_SET 1
|
#define G_SLICE_CONFIG_SET 1
|
||||||
|
@ -97,7 +97,6 @@ g_sunlabel_taste(struct g_class *mp, struct g_provider *pp, int flags)
|
|||||||
{
|
{
|
||||||
struct g_geom *gp;
|
struct g_geom *gp;
|
||||||
struct g_consumer *cp;
|
struct g_consumer *cp;
|
||||||
struct g_provider *pp2;
|
|
||||||
int error, i, npart;
|
int error, i, npart;
|
||||||
u_char *buf;
|
u_char *buf;
|
||||||
struct g_sunlabel_softc *ms;
|
struct g_sunlabel_softc *ms;
|
||||||
@ -174,22 +173,22 @@ g_sunlabel_taste(struct g_class *mp, struct g_provider *pp, int flags)
|
|||||||
continue;
|
continue;
|
||||||
npart++;
|
npart++;
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
pp2 = g_slice_addslice(gp, i,
|
g_slice_config(gp, i, G_SLICE_CONFIG_SET,
|
||||||
((off_t)v * csize) << 9ULL,
|
((off_t)v * csize) << 9ULL,
|
||||||
((off_t)u) << 9ULL,
|
((off_t)u) << 9ULL,
|
||||||
sectorsize,
|
sectorsize,
|
||||||
"%s%c", pp->name, 'a' + i);
|
"%s%c", pp->name, 'a' + i);
|
||||||
g_topology_unlock();
|
g_topology_unlock();
|
||||||
g_error_provider(pp2, 0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_topology_lock();
|
g_topology_lock();
|
||||||
error = g_access_rel(cp, -1, 0, 0);
|
g_access_rel(cp, -1, 0, 0);
|
||||||
if (npart > 0)
|
if (LIST_EMPTY(&gp->provider)) {
|
||||||
return (gp);
|
g_std_spoiled(cp);
|
||||||
g_std_spoiled(cp);
|
return (NULL);
|
||||||
return (NULL);
|
}
|
||||||
|
return (gp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct g_class g_sunlabel_class = {
|
static struct g_class g_sunlabel_class = {
|
||||||
|
Loading…
Reference in New Issue
Block a user