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; }
/* 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; }