From patchwork Fri Jul 9 05:03:36 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Blanchard X-Patchwork-Id: 58329 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id A5DFAB709E for ; Fri, 9 Jul 2010 15:10:51 +1000 (EST) Received: by ozlabs.org (Postfix, from userid 1010) id 8CC18B6F1A; Fri, 9 Jul 2010 15:10:50 +1000 (EST) Message-Id: <20100709050341.900073477@samba.org> User-Agent: quilt/0.48-1 Date: Fri, 09 Jul 2010 15:03:36 +1000 From: Anton Blanchard To: yaboot-devel@lists.ozlabs.org Subject: [patch 06/14] Use ino_size if available References: <20100709050330.507659708@samba.org> Content-Disposition: inline; filename=use_ino_size X-BeenThere: yaboot-devel@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Technical and development discussion regarding yaboot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: yaboot-devel-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Errors-To: yaboot-devel-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org If ino_size is available and returns > 0, then use it to allocate the initrd. This allows us to claim it in one chunk and avoid all the issues around requiring back to back claims to be contiguous. Signed-off-by: Anton Blanchard Index: yaboot/second/yaboot.c =================================================================== --- yaboot.orig/second/yaboot.c 2010-07-09 14:36:47.000000000 +1000 +++ yaboot/second/yaboot.c 2010-07-09 14:45:03.000000000 +1000 @@ -1101,25 +1101,33 @@ yaboot_text_ui(void) } else { #define INITRD_CHUNKSIZE 0x100000 - initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, INITRD_CHUNKSIZE, 0); + unsigned int len = INITRD_CHUNKSIZE; + + /* We add a bit to the actual size so the loop below doesn't think + * there is more to load. + */ + if (file.fs->ino_size && file.fs->ino_size(&file) > 0) + len = file.fs->ino_size(&file) + 0x1000; + + initrd_base = prom_claim_chunk(loadinfo.base+loadinfo.memsize, len, 0); if (initrd_base == (void *)-1) { prom_printf("Claim failed for initrd memory\n"); initrd_base = 0; } else { - initrd_size = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_base); + initrd_size = file.fs->read(&file, len, initrd_base); if (initrd_size == 0) initrd_base = 0; initrd_read = initrd_size; initrd_more = initrd_base; - while (initrd_read == INITRD_CHUNKSIZE ) { /* need to read more? */ - initrd_want = (void *)((unsigned long)initrd_more+INITRD_CHUNKSIZE); - initrd_more = prom_claim(initrd_want, INITRD_CHUNKSIZE, 0); + while (initrd_read == len ) { /* need to read more? */ + initrd_want = (void *)((unsigned long)initrd_more+len); + initrd_more = prom_claim(initrd_want, len, 0); if (initrd_more != initrd_want) { prom_printf("Claim failed for initrd memory at %p rc=%p\n",initrd_want,initrd_more); prom_pause(); break; } - initrd_read = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_more); + initrd_read = file.fs->read(&file, len, initrd_more); DEBUG_F(" block at %p rc=%lu\n",initrd_more,initrd_read); initrd_size += initrd_read; }