All of lore.kernel.org
 help / color / mirror / Atom feed
From: benh@kernel.crashing.org
To: linuxppc-dev@ozlabs.org
Cc: jkensito@us.ibm.com
Subject: [PATCH 09/13] powerpc/nvram: Change nvram_setup_partition() to use new helper
Date: Tue, 30 Nov 2010 16:47:39 +1100	[thread overview]
Message-ID: <1291096063-14386-9-git-send-email-benh@kernel.crashing.org> (raw)
In-Reply-To: <1291096063-14386-1-git-send-email-benh@kernel.crashing.org>

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

This changes the function to use nvram_find_partition() instead
of doing the lookup "by hand". It also makes some of the logic
clearer and prints out more useful diagnostic information.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/nvram_64.c |   71 ++++++++++++++++++----------------------
 1 files changed, 32 insertions(+), 39 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 01e6844..76f546b 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -469,9 +469,8 @@ loff_t nvram_find_partition(const char *name, int sig, int *out_size)
  */
 static int __init nvram_setup_partition(void)
 {
-	struct list_head * p;
-	struct nvram_partition * part;
-	int rc;
+	loff_t p;
+	int size;
 
 	/* For now, we don't do any of this on pmac, until I
 	 * have figured out if it's worth killing some unused stuffs
@@ -481,48 +480,42 @@ static int __init nvram_setup_partition(void)
 	if (machine_is(powermac))
 		return -ENOSPC;
 
-	/* see if we have an OS partition that meets our needs.
-	   will try getting the max we need.  If not we'll delete
-	   partitions and try again. */
-	list_for_each(p, &nvram_part->partition) {
-		part = list_entry(p, struct nvram_partition, partition);
-		if (part->header.signature != NVRAM_SIG_OS)
-			continue;
-
-		if (strcmp(part->header.name, "ppc64,linux"))
-			continue;
-
-		if ((part->header.length - 1) * NVRAM_BLOCK_LEN >= NVRAM_MIN_REQ) {
-			/* found our partition */
-			nvram_error_log_index = part->index + NVRAM_HEADER_LEN;
-			nvram_error_log_size = ((part->header.length - 1) *
-						NVRAM_BLOCK_LEN) - sizeof(struct err_log_info);
-			return 0;
-		}
+	p = nvram_find_partition("ppc64,linux", NVRAM_SIG_OS, &size);
 
-		/* Found one but it's too small, remove it */
+	/* Found one but too small, remove it */
+	if (p && size < NVRAM_MIN_REQ) {
+		pr_info("nvram: Found too small ppc64,linux partition"
+			",removing it...");
 		nvram_remove_partition("ppc64,linux", NVRAM_SIG_OS);
+		p = 0;
 	}
-	
-	/* try creating a partition with the free space we have */
-	rc = nvram_create_partition("ppc64,linux", NVRAM_SIG_OS,
-				       NVRAM_MAX_REQ, NVRAM_MIN_REQ);
-	if (rc < 0) {
-		/* need to free up some space, remove any "OS" partition */
-		nvram_remove_partition(NULL, NVRAM_SIG_OS);
-	
-		/* Try again */
-		rc = nvram_create_partition("ppc64,linux", NVRAM_SIG_OS,
-					    NVRAM_MAX_REQ, NVRAM_MIN_REQ);
-		if (rc < 0) {
-			pr_err("nvram_create_partition: Could not find"
-			       " enough space in NVRAM for partition\n");
-			return rc;
+
+	/* Create one if we didn't find */
+	if (!p) {
+		p = nvram_create_partition("ppc64,linux", NVRAM_SIG_OS,
+					   NVRAM_MAX_REQ, NVRAM_MIN_REQ);
+		/* No room for it, try to get rid of any OS partition
+		 * and try again
+		 */
+		if (p == -ENOSPC) {
+			pr_info("nvram: No room to create ppc64,linux"
+				" partition, deleting all OS partitions...");
+			nvram_remove_partition(NULL, NVRAM_SIG_OS);
+			p = nvram_create_partition("ppc64,linux", NVRAM_SIG_OS,
+						   NVRAM_MAX_REQ, NVRAM_MIN_REQ);
 		}
 	}
+
+	if (p <= 0) {
+		pr_err("nvram: Failed to find or create ppc64,linux"
+		       " partition, err %d\n", (int)p);
+		return 0;
+	}
+
+	nvram_error_log_index = p;
+	nvram_error_log_size = nvram_get_partition_size(p) -
+		sizeof(struct err_log_info);
 	
-	nvram_error_log_index = rc;	
-	nvram_error_log_size = nvram_get_partition_size(rc) - sizeof(struct err_log_info);	
 	return 0;
 }
 
-- 
1.7.1

  parent reply	other threads:[~2010-11-30  5:47 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-30  5:47 [PATCH 01/13] powerpc/nvram: Move things out of asm/nvram.h benh
2010-11-30  5:47 ` [PATCH 02/13] powerpc/nvram: More flexible nvram_create_partition() benh
2010-11-30  5:47 ` [PATCH 03/13] powerpc/nvram: nvram_create_partitions() now uses bytes benh
2010-11-30  5:47 ` [PATCH 04/13] powerpc/nvram: Ensure that the partition header/block size is right benh
2010-11-30  5:47 ` [PATCH 05/13] powerpc/nvram: Completely clear a new partition benh
2010-11-30  5:47 ` [PATCH 06/13] powerpc/nvram: Shuffle code around in nvram_create_partition() benh
2010-11-30  5:47 ` [PATCH 07/13] powerpc/nvram: Improve partition removal benh
2010-11-30  5:47 ` [PATCH 08/13] powerpc/nvram: Add nvram_find_partition() benh
2010-11-30  5:47 ` benh [this message]
2010-11-30  5:47 ` [PATCH 10/13] powerpc/nvram: Move the log partition stuff to pseries benh
2010-11-30  5:47 ` [PATCH 11/13] powerpc/nvram: Rename ppc64, linux partition to ibm, rtas-log benh
2010-11-30  5:47 ` [PATCH 12/13] powerpc/nvram: Fix NVRAM partition list setup benh
2010-11-30  5:47 ` [PATCH 13/13] powerpc/nvram: Handle partition names >= 12 chars benh
2010-12-01  7:24 ` [PATCH 01/13] powerpc/nvram: Move things out of asm/nvram.h Jim Keniston

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1291096063-14386-9-git-send-email-benh@kernel.crashing.org \
    --to=benh@kernel.crashing.org \
    --cc=jkensito@us.ibm.com \
    --cc=linuxppc-dev@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.