Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Mar 2001 20:50:04 -0800 (PST)
From:      Seth Kingsley <sethk@osd.bsdi.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/24435: Changing slice type causes Auto-partition to not work
Message-ID:  <200103230450.f2N4o4v77364@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/24435; it has been noted by GNATS.

From: Seth Kingsley <sethk@osd.bsdi.com>
To: freebsd-gnats-submit@FreeBSD.org, rwatson@FreeBSD.org
Cc:  
Subject: Re: bin/24435: Changing slice type causes Auto-partition to not work
Date: Thu, 22 Mar 2001 20:48:05 -0800

 This has to do with libdisk(3) not creating an 'unused' partition for
 slice types other than 'freebsd'. This patch to libdisk checks for the
 existance of the 'unused' partition and creates one if need be:
 
 Index: chunk.c
 ===================================================================
 RCS file: /ncvs/src/lib/libdisk/chunk.c,v
 retrieving revision 1.24
 diff -u -r1.24 chunk.c
 --- chunk.c	2001/03/18 21:30:10	1.24
 +++ chunk.c	2001/03/23 04:42:56
 @@ -109,6 +109,32 @@
  	return c2;
  }
  
 +/*
 + * Check to see if this slice has no partitions. If it does not, create
 + * an empty one spanning the entire slice. This can happen when an
 + * existing slice of a different type is changed into a 'freebsd' slice.
 + */
 +void
 +Check_Unused(struct chunk *cp)
 +{
 +	struct chunk	*ncp = new_chunk();
 +
 +	if (cp->part)
 +	    return;
 +	if (!ncp) barfout(1,"malloc failed");
 +	memset(ncp,0,sizeof *ncp);
 +	ncp->disk = cp->disk;
 +	ncp->offset = cp->offset;
 +	ncp->size = cp->size;
 +	ncp->end = cp->end;
 +	ncp->type = unused;
 +#ifdef PC98
 +	ncp->sname = strdup(cp->sname);
 +#endif /* PC98 */
 +	ncp->name = strdup("-");
 +	cp->part = ncp;
 +}
 +
  int
  #ifdef PC98
  Insert_Chunk(struct chunk *c2, u_long offset, u_long size, const char *name,
 @@ -263,6 +289,8 @@
  		c1 = Find_Mother_Chunk(d->chunks,offset,end,freebsd);
  	if(!c1)
  		return __LINE__;
 +	if(type == part)
 +		Check_Unused(c1);
  	for(c2=c1->part;c2;c2=c2->next) {
  		if (c2->type != unused)
  			continue;
 Index: create_chunk.c
 ===================================================================
 RCS file: /ncvs/src/lib/libdisk/create_chunk.c,v
 retrieving revision 1.55
 diff -u -r1.55 create_chunk.c
 --- create_chunk.c	2001/03/18 21:30:10	1.55
 +++ create_chunk.c	2001/03/23 04:45:41
 @@ -240,6 +240,7 @@
      
      if (!parent)
  	parent = d->chunks;
 +    Check_Unused(parent);
      for (c1=parent->part; c1 ; c1 = c1->next) {
  	if (c1->type != unused) continue;
  	if (c1->size < size) continue;
 Index: libdisk.h
 ===================================================================
 RCS file: /ncvs/src/lib/libdisk/libdisk.h,v
 retrieving revision 1.37
 diff -u -r1.37 libdisk.h
 --- libdisk.h	2001/03/18 21:30:10	1.37
 +++ libdisk.h	2001/03/23 04:44:47
 @@ -265,6 +265,7 @@
  void Debug_Chunk(struct chunk *);
  void Free_Chunk(struct chunk *);
  struct chunk * Clone_Chunk(struct chunk *);
 +void Check_Unused(struct chunk *);
  #ifdef PC98
  int Add_Chunk(struct disk *, long, u_long, const char *, chunk_e, int, u_long, const char *);
  #else
 
 -- 
 || Seth Kingsley || BSDi/Open Source Division || sethk@osd.bsdi.com ||

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103230450.f2N4o4v77364>