summaryrefslogtreecommitdiffstats
path: root/lib/libdisk/create_chunk.c
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 /lib/libdisk/create_chunk.c
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
Diffstat (limited to 'lib/libdisk/create_chunk.c')
-rw-r--r--lib/libdisk/create_chunk.c20
1 files changed, 19 insertions, 1 deletions
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;
OpenPOWER on IntegriCloud