[Midnightbsd-cvs] src [10016] trunk/sys/geom/part/g_part_ebr.c: freebsd 10 stable
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun May 27 17:58:22 EDT 2018
Revision: 10016
http://svnweb.midnightbsd.org/src/?rev=10016
Author: laffer1
Date: 2018-05-27 17:58:21 -0400 (Sun, 27 May 2018)
Log Message:
-----------
freebsd 10 stable
Modified Paths:
--------------
trunk/sys/geom/part/g_part_ebr.c
Modified: trunk/sys/geom/part/g_part_ebr.c
===================================================================
--- trunk/sys/geom/part/g_part_ebr.c 2018-05-27 21:50:38 UTC (rev 10015)
+++ trunk/sys/geom/part/g_part_ebr.c 2018-05-27 21:58:21 UTC (rev 10016)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2007-2009 Marcel Moolenaar
* All rights reserved.
@@ -27,7 +28,7 @@
#include "opt_geom.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/sys/geom/part/g_part_ebr.c 265912 2014-05-12 12:04:44Z ae $");
#include <sys/param.h>
#include <sys/bio.h>
@@ -93,6 +94,8 @@
static const char *g_part_ebr_type(struct g_part_table *, struct g_part_entry *,
char *, size_t);
static int g_part_ebr_write(struct g_part_table *, struct g_consumer *);
+static int g_part_ebr_resize(struct g_part_table *, struct g_part_entry *,
+ struct g_part_parms *);
static kobj_method_t g_part_ebr_methods[] = {
KOBJMETHOD(g_part_add, g_part_ebr_add),
@@ -108,6 +111,7 @@
KOBJMETHOD(g_part_precheck, g_part_ebr_precheck),
KOBJMETHOD(g_part_probe, g_part_ebr_probe),
KOBJMETHOD(g_part_read, g_part_ebr_read),
+ KOBJMETHOD(g_part_resize, g_part_ebr_resize),
KOBJMETHOD(g_part_setunset, g_part_ebr_setunset),
KOBJMETHOD(g_part_type, g_part_ebr_type),
KOBJMETHOD(g_part_write, g_part_ebr_write),
@@ -217,47 +221,54 @@
}
static int
+ebr_align(struct g_part_table *basetable, uint32_t *start, uint32_t *size)
+{
+ uint32_t sectors;
+
+ sectors = basetable->gpt_sectors;
+ if (*size < 2 * sectors)
+ return (EINVAL);
+ if (*start % sectors) {
+ *size += (*start % sectors) - sectors;
+ *start -= (*start % sectors) - sectors;
+ }
+ if (*size % sectors)
+ *size -= (*size % sectors);
+ if (*size < 2 * sectors)
+ return (EINVAL);
+ return (0);
+}
+
+
+static int
g_part_ebr_add(struct g_part_table *basetable, struct g_part_entry *baseentry,
struct g_part_parms *gpp)
{
- struct g_geom *gp;
struct g_provider *pp;
struct g_part_ebr_entry *entry;
- uint32_t start, size, sectors;
+ uint32_t start, size;
if (gpp->gpp_parms & G_PART_PARM_LABEL)
return (EINVAL);
- gp = basetable->gpt_gp;
- pp = LIST_FIRST(&gp->consumer)->provider;
- sectors = basetable->gpt_sectors;
-
+ pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
entry = (struct g_part_ebr_entry *)baseentry;
-
start = gpp->gpp_start;
size = gpp->gpp_size;
- if (size < 2 * sectors)
+ if (ebr_align(basetable, &start, &size) != 0)
return (EINVAL);
- if (start % sectors) {
- size = size - sectors + (start % sectors);
- start = start - (start % sectors) + sectors;
- }
- if (size % sectors)
- size = size - (size % sectors);
- if (size < 2 * sectors)
- return (EINVAL);
-
if (baseentry->gpe_deleted)
bzero(&entry->ent, sizeof(entry->ent));
KASSERT(baseentry->gpe_start <= start, ("%s", __func__));
KASSERT(baseentry->gpe_end >= start + size - 1, ("%s", __func__));
- baseentry->gpe_index = (start / sectors) + 1;
- baseentry->gpe_offset = (off_t)(start + sectors) * pp->sectorsize;
+ baseentry->gpe_index = (start / basetable->gpt_sectors) + 1;
+ baseentry->gpe_offset =
+ (off_t)(start + basetable->gpt_sectors) * pp->sectorsize;
baseentry->gpe_start = start;
baseentry->gpe_end = start + size - 1;
- entry->ent.dp_start = sectors;
- entry->ent.dp_size = size - sectors;
+ entry->ent.dp_start = basetable->gpt_sectors;
+ entry->ent.dp_size = size - basetable->gpt_sectors;
ebr_set_chs(basetable, entry->ent.dp_start, &entry->ent.dp_scyl,
&entry->ent.dp_shd, &entry->ent.dp_ssect);
ebr_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl,
@@ -377,6 +388,20 @@
return (0);
}
+static int
+g_part_ebr_resize(struct g_part_table *basetable,
+ struct g_part_entry *baseentry, struct g_part_parms *gpp)
+{
+ struct g_provider *pp;
+
+ if (baseentry != NULL)
+ return (EOPNOTSUPP);
+ pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
+ basetable->gpt_last = MIN(pp->mediasize / pp->sectorsize,
+ UINT32_MAX) - 1;
+ return (0);
+}
+
static const char *
g_part_ebr_name(struct g_part_table *table, struct g_part_entry *entry,
char *buf, size_t bufsz)
@@ -540,6 +565,8 @@
struct g_part_ebr_entry *entry;
int changed;
+ if (baseentry == NULL)
+ return (ENODEV);
if (strcasecmp(attrib, "active") != 0)
return (EINVAL);
More information about the Midnightbsd-cvs
mailing list