diff options
Diffstat (limited to 'fs/pstore')
| -rw-r--r-- | fs/pstore/inode.c | 1 | ||||
| -rw-r--r-- | fs/pstore/platform.c | 27 | ||||
| -rw-r--r-- | fs/pstore/ram.c | 19 | ||||
| -rw-r--r-- | fs/pstore/ram_core.c | 40 | 
4 files changed, 46 insertions, 41 deletions
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 12823845d32..192297b0090 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -249,6 +249,7 @@ static void parse_options(char *options)  static int pstore_remount(struct super_block *sb, int *flags, char *data)  { +	sync_filesystem(sb);  	parse_options(data);  	return 0; diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index b8e93a40a5d..0a9b72cdfec 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -18,6 +18,8 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ +#define pr_fmt(fmt) "pstore: " fmt +  #include <linux/atomic.h>  #include <linux/types.h>  #include <linux/errno.h> @@ -224,14 +226,12 @@ static void allocate_buf_for_compression(void)  			zlib_inflate_workspacesize());  		stream.workspace = kmalloc(size, GFP_KERNEL);  		if (!stream.workspace) { -			pr_err("pstore: No memory for compression workspace; " -				"skipping compression\n"); +			pr_err("No memory for compression workspace; skipping compression\n");  			kfree(big_oops_buf);  			big_oops_buf = NULL;  		}  	} else { -		pr_err("No memory for uncompressed data; " -			"skipping compression\n"); +		pr_err("No memory for uncompressed data; skipping compression\n");  		stream.workspace = NULL;  	} @@ -443,8 +443,11 @@ int pstore_register(struct pstore_info *psi)  		pstore_get_records(0);  	kmsg_dump_register(&pstore_dumper); -	pstore_register_console(); -	pstore_register_ftrace(); + +	if ((psi->flags & PSTORE_FLAGS_FRAGILE) == 0) { +		pstore_register_console(); +		pstore_register_ftrace(); +	}  	if (pstore_update_ms >= 0) {  		pstore_timer.expires = jiffies + @@ -452,8 +455,7 @@ int pstore_register(struct pstore_info *psi)  		add_timer(&pstore_timer);  	} -	pr_info("pstore: Registered %s as persistent store backend\n", -		psi->name); +	pr_info("Registered %s as persistent store backend\n", psi->name);  	return 0;  } @@ -494,12 +496,13 @@ void pstore_get_records(int quiet)  							big_oops_buf_sz);  			if (unzipped_len > 0) { +				kfree(buf);  				buf = big_oops_buf;  				size = unzipped_len;  				compressed = false;  			} else { -				pr_err("pstore: decompression failed;" -					"returned %d\n", unzipped_len); +				pr_err("decompression failed;returned %d\n", +				       unzipped_len);  				compressed = true;  			}  		} @@ -520,8 +523,8 @@ out:  	mutex_unlock(&psi->read_mutex);  	if (failed) -		printk(KERN_WARNING "pstore: failed to load %d record(s) from '%s'\n", -		       failed, psi->name); +		pr_warn("failed to load %d record(s) from '%s'\n", +			failed, psi->name);  }  static void pstore_dowork(struct work_struct *work) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index fa8cef2cca3..3b5744306ed 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -86,6 +86,7 @@ struct ramoops_context {  	struct persistent_ram_ecc_info ecc_info;  	unsigned int max_dump_cnt;  	unsigned int dump_write_cnt; +	/* _read_cnt need clear on ramoops_pstore_open */  	unsigned int dump_read_cnt;  	unsigned int console_read_cnt;  	unsigned int ftrace_read_cnt; @@ -101,6 +102,7 @@ static int ramoops_pstore_open(struct pstore_info *psi)  	cxt->dump_read_cnt = 0;  	cxt->console_read_cnt = 0; +	cxt->ftrace_read_cnt = 0;  	return 0;  } @@ -117,13 +119,15 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,  		return NULL;  	prz = przs[i]; +	if (!prz) +		return NULL; -	if (update) { -		/* Update old/shadowed buffer. */ +	/* Update old/shadowed buffer. */ +	if (update)  		persistent_ram_save_old(prz); -		if (!persistent_ram_old_size(prz)) -			return NULL; -	} + +	if (!persistent_ram_old_size(prz)) +		return NULL;  	*typep = type;  	*id = i; @@ -316,6 +320,7 @@ static void ramoops_free_przs(struct ramoops_context *cxt)  {  	int i; +	cxt->max_dump_cnt = 0;  	if (!cxt->przs)  		return; @@ -346,7 +351,7 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,  			     GFP_KERNEL);  	if (!cxt->przs) {  		dev_err(dev, "failed to initialize a prz array for dumps\n"); -		return -ENOMEM; +		goto fail_prz;  	}  	for (i = 0; i < cxt->max_dump_cnt; i++) { @@ -428,7 +433,6 @@ static int ramoops_probe(struct platform_device *pdev)  	if (pdata->ftrace_size && !is_power_of_2(pdata->ftrace_size))  		pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size); -	cxt->dump_read_cnt = 0;  	cxt->size = pdata->mem_size;  	cxt->phys_addr = pdata->mem_address;  	cxt->record_size = pdata->record_size; @@ -505,7 +509,6 @@ fail_buf:  	kfree(cxt->pstore.buf);  fail_clear:  	cxt->pstore.bufsize = 0; -	cxt->max_dump_cnt = 0;  fail_cnt:  	kfree(cxt->fprz);  fail_init_fprz: diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index de272d42676..34a1e5aa848 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -12,6 +12,8 @@   *   */ +#define pr_fmt(fmt) "persistent_ram: " fmt +  #include <linux/device.h>  #include <linux/err.h>  #include <linux/errno.h> @@ -54,7 +56,7 @@ static size_t buffer_start_add_atomic(struct persistent_ram_zone *prz, size_t a)  	do {  		old = atomic_read(&prz->buffer->start);  		new = old + a; -		while (unlikely(new > prz->buffer_size)) +		while (unlikely(new >= prz->buffer_size))  			new -= prz->buffer_size;  	} while (atomic_cmpxchg(&prz->buffer->start, old, new) != old); @@ -91,7 +93,7 @@ static size_t buffer_start_add_locked(struct persistent_ram_zone *prz, size_t a)  	old = atomic_read(&prz->buffer->start);  	new = old + a; -	while (unlikely(new > prz->buffer_size)) +	while (unlikely(new >= prz->buffer_size))  		new -= prz->buffer_size;  	atomic_set(&prz->buffer->start, new); @@ -205,12 +207,10 @@ static void persistent_ram_ecc_old(struct persistent_ram_zone *prz)  			size = buffer->data + prz->buffer_size - block;  		numerr = persistent_ram_decode_rs8(prz, block, size, par);  		if (numerr > 0) { -			pr_devel("persistent_ram: error in block %p, %d\n", -			       block, numerr); +			pr_devel("error in block %p, %d\n", block, numerr);  			prz->corrected_bytes += numerr;  		} else if (numerr < 0) { -			pr_devel("persistent_ram: uncorrectable error in block %p\n", -				block); +			pr_devel("uncorrectable error in block %p\n", block);  			prz->bad_blocks++;  		}  		block += prz->ecc_info.block_size; @@ -257,7 +257,7 @@ static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,  	prz->rs_decoder = init_rs(prz->ecc_info.symsize, prz->ecc_info.poly,  				  0, 1, prz->ecc_info.ecc_size);  	if (prz->rs_decoder == NULL) { -		pr_info("persistent_ram: init_rs failed\n"); +		pr_info("init_rs failed\n");  		return -EINVAL;  	} @@ -267,10 +267,10 @@ static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,  	numerr = persistent_ram_decode_rs8(prz, buffer, sizeof(*buffer),  					   prz->par_header);  	if (numerr > 0) { -		pr_info("persistent_ram: error in header, %d\n", numerr); +		pr_info("error in header, %d\n", numerr);  		prz->corrected_bytes += numerr;  	} else if (numerr < 0) { -		pr_info("persistent_ram: uncorrectable error in header\n"); +		pr_info("uncorrectable error in header\n");  		prz->bad_blocks++;  	} @@ -317,7 +317,7 @@ void persistent_ram_save_old(struct persistent_ram_zone *prz)  		prz->old_log = kmalloc(size, GFP_KERNEL);  	}  	if (!prz->old_log) { -		pr_err("persistent_ram: failed to allocate buffer\n"); +		pr_err("failed to allocate buffer\n");  		return;  	} @@ -396,8 +396,8 @@ static void *persistent_ram_vmap(phys_addr_t start, size_t size)  	pages = kmalloc(sizeof(struct page *) * page_count, GFP_KERNEL);  	if (!pages) { -		pr_err("%s: Failed to allocate array for %u pages\n", __func__, -			page_count); +		pr_err("%s: Failed to allocate array for %u pages\n", +		       __func__, page_count);  		return NULL;  	} @@ -462,19 +462,17 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,  	if (prz->buffer->sig == sig) {  		if (buffer_size(prz) > prz->buffer_size ||  		    buffer_start(prz) > buffer_size(prz)) -			pr_info("persistent_ram: found existing invalid buffer," -				" size %zu, start %zu\n", -			       buffer_size(prz), buffer_start(prz)); +			pr_info("found existing invalid buffer, size %zu, start %zu\n", +				buffer_size(prz), buffer_start(prz));  		else { -			pr_debug("persistent_ram: found existing buffer," -				" size %zu, start %zu\n", -			       buffer_size(prz), buffer_start(prz)); +			pr_debug("found existing buffer, size %zu, start %zu\n", +				 buffer_size(prz), buffer_start(prz));  			persistent_ram_save_old(prz);  			return 0;  		}  	} else { -		pr_debug("persistent_ram: no valid data in buffer" -			" (sig = 0x%08x)\n", prz->buffer->sig); +		pr_debug("no valid data in buffer (sig = 0x%08x)\n", +			 prz->buffer->sig);  	}  	prz->buffer->sig = sig; @@ -509,7 +507,7 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,  	prz = kzalloc(sizeof(struct persistent_ram_zone), GFP_KERNEL);  	if (!prz) { -		pr_err("persistent_ram: failed to allocate persistent ram zone\n"); +		pr_err("failed to allocate persistent ram zone\n");  		goto err;  	}  | 
