Beispiel #1
0
static int __init pseries_nvram_init_log_partitions(void)
{
	int rc;

	/* Scan nvram for partitions */
	nvram_scan_partitions();

	rc = nvram_init_os_partition(&rtas_log_partition);
	nvram_init_oops_partition(rc == 0);
	return 0;
}
Beispiel #2
0
/* pseries_nvram_init_log_partition
 *
 * This will setup the partition we need for buffering the
 * error logs and cleanup partitions if needed.
 *
 * The general strategy is the following:
 * 1.) If there is log partition large enough then use it.
 * 2.) If there is none large enough, search
 * for a free partition that is large enough.
 * 3.) If there is not a free partition large enough remove
 * _all_ OS partitions and consolidate the space.
 * 4.) Will first try getting a chunk that will satisfy the maximum
 * error log size (NVRAM_MAX_REQ).
 * 5.) If the max chunk cannot be allocated then try finding a chunk
 * that will satisfy the minum needed (NVRAM_MIN_REQ).
 */
static int __init pseries_nvram_init_log_partition(void)
{
	loff_t p;
	int size;

	/* Scan nvram for partitions */
	nvram_scan_partitions();

	/* Lookg for ours */
	p = nvram_find_partition(NVRAM_LOG_PART_NAME, NVRAM_SIG_OS, &size);

	/* Found one but too small, remove it */
	if (p && size < NVRAM_MIN_REQ) {
		pr_info("nvram: Found too small "NVRAM_LOG_PART_NAME" partition"
			",removing it...");
		nvram_remove_partition(NVRAM_LOG_PART_NAME, NVRAM_SIG_OS);
		p = 0;
	}

	/* Create one if we didn't find */
	if (!p) {
		p = nvram_create_partition(NVRAM_LOG_PART_NAME, 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 "NVRAM_LOG_PART_NAME
				" partition, deleting all OS partitions...");
			nvram_remove_partition(NULL, NVRAM_SIG_OS);
			p = nvram_create_partition(NVRAM_LOG_PART_NAME,
						   NVRAM_SIG_OS, NVRAM_MAX_REQ,
						   NVRAM_MIN_REQ);
		}
	}

	if (p <= 0) {
		pr_err("nvram: Failed to find or create "NVRAM_LOG_PART_NAME
		       " 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);

	return 0;
}