From owner-freebsd-arch Sun Dec 9 12:56:49 2001 Delivered-To: freebsd-arch@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by hub.freebsd.org (Postfix) with ESMTP id C494137B419; Sun, 9 Dec 2001 12:56:33 -0800 (PST) Received: (from dillon@localhost) by apollo.backplane.com (8.11.6/8.9.1) id fB9KuXY39015; Sun, 9 Dec 2001 12:56:33 -0800 (PST) (envelope-from dillon) Date: Sun, 9 Dec 2001 12:56:33 -0800 (PST) From: Matthew Dillon Message-Id: <200112092056.fB9KuXY39015@apollo.backplane.com> To: Greg Lehey , Jordan Hubbard , Garance A Drosihn , "Louis A. Mamakos" , Sheldon Hearn , Kirk McKusick , freebsd-arch@FreeBSD.org Subject: Auto-resize-on-delete patch References: <49294.1007846108@winston.freebsd.org> <200112082211.fB8MBGm18685@apollo.backplane.com> <20011209165725.D83634@monorchid.lemis.com> Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG This patch is relatve to -current. Note: This patch also contains changes required to test with the "md" device which will not be in the final committed patch. I haven't tested it much yet, but it appears to work visually. This patch will collapse a 'D'eleted partition's space into the previous partition. For example, removing /var/tmp collapses that space into /var, removing /home collapses that space into /usr. This patch only collapses space into an auto-created partition. It will not extend a manually created partition. I still have some work to do... I need to add a NEWFS flag to libdisk so the code only extends partitions which are marked for NEWFSing (at the moment limiting it to auto-created partitions is good enough for testing purposes). -Matt Index: lib/libdisk/chunk.c =================================================================== RCS file: /home/ncvs/src/lib/libdisk/chunk.c,v retrieving revision 1.28 diff -u -r1.28 chunk.c --- lib/libdisk/chunk.c 2001/09/30 21:16:57 1.28 +++ lib/libdisk/chunk.c 2001/12/09 20:48:57 @@ -363,6 +363,7 @@ { struct chunk *c1=0, *c2, *c3; chunk_e type = c->type; + long offset = c->offset; if(type == whole) return 1; @@ -398,9 +399,18 @@ } return 1; scan: + /* + * Collapse multiple unused elements together, and attempt + * to extend the previous chunk into the freed chunk. + */ for(c2 = c1->part; c2; c2 = c2->next) { - if (c2->type != unused) - continue; + if (c2->type != unused) { + if (c2->offset + c2->size != offset || + (c2->flags & CHUNK_AUTO_SIZE) == 0) { + continue; + } + /* else extend into free area */ + } if (!c2->next) continue; if (c2->next->type != unused) Index: lib/libdisk/disk.c =================================================================== RCS file: /home/ncvs/src/lib/libdisk/disk.c,v retrieving revision 1.72 diff -u -r1.72 disk.c --- lib/libdisk/disk.c 2001/10/15 07:25:29 1.72 +++ lib/libdisk/disk.c 2001/12/09 20:48:16 @@ -478,9 +478,9 @@ #endif #ifdef PC98 -static char * device_list[] = {"wd", "aacd", "ad", "da", "afd", "fla", "idad", "mlxd", "amrd", "twed", "ar", "fd", 0}; +static char * device_list[] = {"wd", "aacd", "ad", "da", "afd", "fla", "idad", "mlxd", "amrd", "twed", "ar", "fd", "md", 0}; #else -static char * device_list[] = {"aacd", "ad", "da", "afd", "fla", "idad", "mlxd", "amrd", "twed", "ar", "fd", 0}; +static char * device_list[] = {"aacd", "ad", "da", "afd", "fla", "idad", "mlxd", "amrd", "twed", "ar", "fd", "md", 0}; #endif char ** Index: lib/libdisk/libdisk.h =================================================================== RCS file: /home/ncvs/src/lib/libdisk/libdisk.h,v retrieving revision 1.39 diff -u -r1.39 libdisk.h --- lib/libdisk/libdisk.h 2001/05/13 20:08:54 1.39 +++ lib/libdisk/libdisk.h 2001/12/09 20:36:35 @@ -69,21 +69,6 @@ chunk_e type; int subtype; u_long flags; -# define CHUNK_BSD_COMPAT 2 - /* this chunk is in the BSD-compatibility, and has a - * short name too, ie wd0s4f -> wd0f - */ -# define CHUNK_ALIGN 8 - /* This chunk should be aligned */ -# define CHUNK_IS_ROOT 16 - /* This 'part' is a rootfs, allocate 'a' */ -# define CHUNK_ACTIVE 32 - /* This is the active slice in the MBR */ -# define CHUNK_FORCE_ALL 64 - /* Force a dedicated disk for FreeBSD, bypassing - * all BIOS geometry considerations - */ - void (*private_free)(void*); void *(*private_clone)(void*); void *private_data; @@ -93,6 +78,28 @@ * and freeing will just forget it. */ }; + +/* + * flags: + * + * BSD_COMPAT - This chunk is in the BSD-compatibility, and has + * a short name too, ie wd0s4f -> wd0f + * ALIGN - This chunk should be aligned + * IS_ROOT - This 'part' is a rootfs, allocate 'a' + * ACTIVE - This is the active slice in the MBR + * FORCE_ALL - Force a dedicated disk for FreeBSD, bypassing + * all BIOS geometry considerations + * AUTO_SIZE - This chunk was auto-sized and can fill-out a + * following chunk if the following chunk is deleted. + */ + +#define CHUNK_BSD_COMPAT 0x0002 +#define CHUNK_ALIGN 0x0008 +#define CHUNK_IS_ROOT 0x0010 +#define CHUNK_ACTIVE 0x0020 +#define CHUNK_FORCE_ALL 0x0040 +#define CHUNK_AUTO_SIZE 0x0080 + extern const char *chunk_n[]; Index: usr.sbin/sysinstall/devices.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/sysinstall/devices.c,v retrieving revision 1.137 diff -u -r1.137 devices.c --- usr.sbin/sysinstall/devices.c 30 Sep 2001 00:43:32 -0000 1.137 +++ usr.sbin/sysinstall/devices.c 9 Dec 2001 20:51:21 -0000 @@ -439,9 +439,11 @@ Chunk *c1; Disk *d; +#if 0 /* Ignore memory disks */ if (!strncmp(names[i], "md", 2)) continue; +#endif d = Open_Disk(names[i]); if (!d) { Index: usr.sbin/sysinstall/label.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/sysinstall/label.c,v retrieving revision 1.111 diff -u -r1.111 label.c --- usr.sbin/sysinstall/label.c 9 Dec 2001 09:47:09 -0000 1.111 +++ usr.sbin/sysinstall/label.c 9 Dec 2001 20:51:22 -0000 @@ -1183,8 +1183,9 @@ if (!rootdev) { sz = requested_part_size(VAR_ROOT_SIZE, ROOT_NOMINAL_SIZE, ROOT_DEFAULT_SIZE, perc); - root_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, label_chunk_info[here].c, - sz, part, FS_BSDFFS, CHUNK_IS_ROOT); + root_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, + label_chunk_info[here].c, sz, part, + FS_BSDFFS, CHUNK_IS_ROOT | CHUNK_AUTO_SIZE); if (!root_chunk) { *req = 1; msg = "Unable to create the root partition. Too big?"; @@ -1212,8 +1213,9 @@ nom = (int)(physmem / 512) / 2; sz = nom + (def - nom) * perc / 100; } - swap_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, label_chunk_info[here].c, - sz, part, FS_SWAP, 0); + swap_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, + label_chunk_info[here].c, sz, part, + FS_SWAP, CHUNK_AUTO_SIZE); if (!swap_chunk) { *req = 1; msg = "Unable to create the swap partition. Too big?"; @@ -1226,8 +1228,9 @@ if (!vardev) { sz = requested_part_size(VAR_VAR_SIZE, VAR_NOMINAL_SIZE, VAR_DEFAULT_SIZE, perc); - var_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, label_chunk_info[here].c, - sz, part, FS_BSDFFS, 0); + var_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, + label_chunk_info[here].c, sz, part, + FS_BSDFFS, CHUNK_AUTO_SIZE); if (!var_chunk) { *req = 1; msg = "Not enough free space for /var - you will need to\n" @@ -1241,8 +1244,9 @@ if (!vartmpdev && !variable_get(VAR_NO_VARTMP)) { sz = requested_part_size(VAR_VARTMP_SIZE, VARTMP_NOMINAL_SIZE, VARTMP_DEFAULT_SIZE, perc); - vartmp_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, label_chunk_info[here].c, - sz, part, FS_BSDFFS, 0); + vartmp_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, + label_chunk_info[here].c, sz, part, + FS_BSDFFS, CHUNK_AUTO_SIZE); if (!vartmp_chunk) { *req = 1; msg = "Not enough free space for /var/tmp - you will need to\n" @@ -1266,8 +1270,8 @@ } usr_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, - label_chunk_info[here].c, - sz, part, FS_BSDFFS, 0); + label_chunk_info[here].c, sz, part, + FS_BSDFFS, CHUNK_AUTO_SIZE); if (!usr_chunk) { msg = "Unable to create the /usr partition. Not enough space?\n" "You will need to partition your disk manually with a custom install!"; @@ -1291,8 +1295,8 @@ } home_chunk = Create_Chunk_DWIM(label_chunk_info[here].c->disk, - label_chunk_info[here].c, - sz, part, FS_BSDFFS, 0); + label_chunk_info[here].c, sz, part, + FS_BSDFFS, CHUNK_AUTO_SIZE); if (!home_chunk) { msg = "Unable to create the /home partition. Not enough space?\n" "You will need to partition your disk manually with a custom install!"; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message