- 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
This commit is contained in:
John Baldwin 2003-01-10 19:25:38 +00:00
parent a13340a8e4
commit 53465bf736
3 changed files with 21 additions and 3 deletions

View File

@ -18,7 +18,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include "libdisk.h"
static struct chunk *
struct chunk *
New_Chunk(void)
{
struct chunk *c;

View File

@ -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;

View File

@ -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