summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-01-10 19:25:38 +0000
committerjhb <jhb@FreeBSD.org>2003-01-10 19:25:38 +0000
commit533d214b966f695a9fa4dee381b20aa03e6b4a91 (patch)
tree68409884412a822f295542088b024e0d863a89ab
parent48b15bd431779863408d2bd33e7f0c8192bfe6de (diff)
downloadFreeBSD-src-533d214b966f695a9fa4dee381b20aa03e6b4a91.zip
FreeBSD-src-533d214b966f695a9fa4dee381b20aa03e6b4a91.tar.gz
- Make New_Disk() non-static so it can be used in Create_Chunk_DWIM().
- In Create_Chunk_DWIM(), if there is a freebsd chunk that has no children chunks, then trying to add a child part chunk will fail even though there is free space. Handle this special case by adding an unused chunk the full size of the freebsd chunk as a child of the freebsd chunk before adding the new part chunk. This situation can happen when changing the type of an existing slice to be a FreeBSD slice type or when installing onto a blank disk on Alpha (which has no slices.) Reviewed by: phk MFC after: 2 days
-rw-r--r--lib/libdisk/chunk.c2
-rw-r--r--lib/libdisk/create_chunk.c20
-rw-r--r--lib/libdisk/libdisk.h2
3 files changed, 21 insertions, 3 deletions
diff --git a/lib/libdisk/chunk.c b/lib/libdisk/chunk.c
index ee15a49..25c3646 100644
--- a/lib/libdisk/chunk.c
+++ b/lib/libdisk/chunk.c
@@ -18,7 +18,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include "libdisk.h"
-static struct chunk *
+struct chunk *
New_Chunk(void)
{
struct chunk *c;
diff --git a/lib/libdisk/create_chunk.c b/lib/libdisk/create_chunk.c
index dfccb9d..8ce9057 100644
--- a/lib/libdisk/create_chunk.c
+++ b/lib/libdisk/create_chunk.c
@@ -33,6 +33,8 @@ __FBSDID("$FreeBSD$");
#include <pwd.h>
#include "libdisk.h"
+struct chunk *New_Chunk(void);
+
static int
Fixup_FreeBSD_Names(struct disk *d, struct chunk *c)
{
@@ -215,7 +217,7 @@ Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type,
}
struct chunk *
-Create_Chunk_DWIM(struct disk *d, const struct chunk *parent , u_long size,
+Create_Chunk_DWIM(struct disk *d, struct chunk *parent, u_long size,
chunk_e type, int subtype, u_long flags)
{
int i;
@@ -224,6 +226,22 @@ Create_Chunk_DWIM(struct disk *d, const struct chunk *parent , u_long size,
if (!parent)
parent = d->chunks;
+
+ if (parent->type == freebsd && type == part && parent->part == NULL) {
+ c1 = New_Chunk();
+ if (c1 == NULL)
+ return (NULL);
+ c1->disk = parent->disk;
+ c1->offset = parent->offset;
+ c1->size = parent->size;
+ c1->end = parent->offset + parent->size - 1;
+ c1->type = unused;
+ if (parent->sname != NULL)
+ c1->sname = strdup(parent->sname);
+ c1->name = strdup("-");
+ parent->part = c1;
+ }
+
for (c1 = parent->part; c1; c1 = c1->next) {
if (c1->type != unused)
continue;
diff --git a/lib/libdisk/libdisk.h b/lib/libdisk/libdisk.h
index fd7b4a5..ade39d7 100644
--- a/lib/libdisk/libdisk.h
+++ b/lib/libdisk/libdisk.h
@@ -258,7 +258,7 @@ Prev_Track_Aligned(const struct disk *, u_long);
/* Check if offset is aligned on a track according to the bios geometry */
struct chunk *
-Create_Chunk_DWIM(struct disk *, const struct chunk *, u_long, chunk_e, int,
+Create_Chunk_DWIM(struct disk *, struct chunk *, u_long, chunk_e, int,
u_long);
/*
* This one creates a partition inside the given parent of the given
OpenPOWER on IntegriCloud