- 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:
parent
a13340a8e4
commit
53465bf736
@ -18,7 +18,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <err.h>
|
||||
#include "libdisk.h"
|
||||
|
||||
static struct chunk *
|
||||
struct chunk *
|
||||
New_Chunk(void)
|
||||
{
|
||||
struct 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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user