From 871480933a1c28f8a9fed4c4d34d06c439a7a422 Mon Sep 17 00:00:00 2001 From: Srikant Patnaik Date: Sun, 11 Jan 2015 12:28:04 +0530 Subject: Moved, renamed, and deleted files The original directory structure was scattered and unorganized. Changes are basically to make it look like kernel structure. --- ANDROID_3.4.5/fs/pstore/Kconfig | 13 -- ANDROID_3.4.5/fs/pstore/Makefile | 7 - ANDROID_3.4.5/fs/pstore/inode.c | 319 ------------------------------------- ANDROID_3.4.5/fs/pstore/internal.h | 6 - ANDROID_3.4.5/fs/pstore/platform.c | 261 ------------------------------ 5 files changed, 606 deletions(-) delete mode 100644 ANDROID_3.4.5/fs/pstore/Kconfig delete mode 100644 ANDROID_3.4.5/fs/pstore/Makefile delete mode 100644 ANDROID_3.4.5/fs/pstore/inode.c delete mode 100644 ANDROID_3.4.5/fs/pstore/internal.h delete mode 100644 ANDROID_3.4.5/fs/pstore/platform.c (limited to 'ANDROID_3.4.5/fs/pstore') diff --git a/ANDROID_3.4.5/fs/pstore/Kconfig b/ANDROID_3.4.5/fs/pstore/Kconfig deleted file mode 100644 index 8007ae7c..00000000 --- a/ANDROID_3.4.5/fs/pstore/Kconfig +++ /dev/null @@ -1,13 +0,0 @@ -config PSTORE - bool "Persistent store support" - default n - help - This option enables generic access to platform level - persistent storage via "pstore" filesystem that can - be mounted as /dev/pstore. Only useful if you have - a platform level driver that registers with pstore to - provide the data, so you probably should just go say "Y" - (or "M") to a platform specific persistent store driver - (e.g. ACPI_APEI on X86) which will select this for you. - If you don't have a platform persistent store driver, - say N. diff --git a/ANDROID_3.4.5/fs/pstore/Makefile b/ANDROID_3.4.5/fs/pstore/Makefile deleted file mode 100644 index 760f4bce..00000000 --- a/ANDROID_3.4.5/fs/pstore/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# -# Makefile for the linux pstorefs routines. -# - -obj-y += pstore.o - -pstore-objs += inode.o platform.o diff --git a/ANDROID_3.4.5/fs/pstore/inode.c b/ANDROID_3.4.5/fs/pstore/inode.c deleted file mode 100644 index 19507889..00000000 --- a/ANDROID_3.4.5/fs/pstore/inode.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Persistent Storage - ramfs parts. - * - * Copyright (C) 2010 Intel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" - -#define PSTORE_NAMELEN 64 - -static DEFINE_SPINLOCK(allpstore_lock); -static LIST_HEAD(allpstore); - -struct pstore_private { - struct list_head list; - struct pstore_info *psi; - enum pstore_type_id type; - u64 id; - ssize_t size; - char data[]; -}; - -static ssize_t pstore_file_read(struct file *file, char __user *userbuf, - size_t count, loff_t *ppos) -{ - struct pstore_private *ps = file->private_data; - - return simple_read_from_buffer(userbuf, count, ppos, ps->data, ps->size); -} - -static const struct file_operations pstore_file_operations = { - .open = simple_open, - .read = pstore_file_read, - .llseek = default_llseek, -}; - -/* - * When a file is unlinked from our file system we call the - * platform driver to erase the record from persistent store. - */ -static int pstore_unlink(struct inode *dir, struct dentry *dentry) -{ - struct pstore_private *p = dentry->d_inode->i_private; - - if (p->psi->erase) - p->psi->erase(p->type, p->id, p->psi); - - return simple_unlink(dir, dentry); -} - -static void pstore_evict_inode(struct inode *inode) -{ - struct pstore_private *p = inode->i_private; - unsigned long flags; - - end_writeback(inode); - if (p) { - spin_lock_irqsave(&allpstore_lock, flags); - list_del(&p->list); - spin_unlock_irqrestore(&allpstore_lock, flags); - kfree(p); - } -} - -static const struct inode_operations pstore_dir_inode_operations = { - .lookup = simple_lookup, - .unlink = pstore_unlink, -}; - -static struct inode *pstore_get_inode(struct super_block *sb) -{ - struct inode *inode = new_inode(sb); - if (inode) { - inode->i_ino = get_next_ino(); - inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - } - return inode; -} - -enum { - Opt_kmsg_bytes, Opt_err -}; - -static const match_table_t tokens = { - {Opt_kmsg_bytes, "kmsg_bytes=%u"}, - {Opt_err, NULL} -}; - -static void parse_options(char *options) -{ - char *p; - substring_t args[MAX_OPT_ARGS]; - int option; - - if (!options) - return; - - while ((p = strsep(&options, ",")) != NULL) { - int token; - - if (!*p) - continue; - - token = match_token(p, tokens, args); - switch (token) { - case Opt_kmsg_bytes: - if (!match_int(&args[0], &option)) - pstore_set_kmsg_bytes(option); - break; - } - } -} - -static int pstore_remount(struct super_block *sb, int *flags, char *data) -{ - parse_options(data); - - return 0; -} - -static const struct super_operations pstore_ops = { - .statfs = simple_statfs, - .drop_inode = generic_delete_inode, - .evict_inode = pstore_evict_inode, - .remount_fs = pstore_remount, - .show_options = generic_show_options, -}; - -static struct super_block *pstore_sb; - -int pstore_is_mounted(void) -{ - return pstore_sb != NULL; -} - -/* - * Make a regular file in the root directory of our file system. - * Load it up with "size" bytes of data from "buf". - * Set the mtime & ctime to the date that this record was originally stored. - */ -int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, - char *data, size_t size, struct timespec time, - struct pstore_info *psi) -{ - struct dentry *root = pstore_sb->s_root; - struct dentry *dentry; - struct inode *inode; - int rc = 0; - char name[PSTORE_NAMELEN]; - struct pstore_private *private, *pos; - unsigned long flags; - - spin_lock_irqsave(&allpstore_lock, flags); - list_for_each_entry(pos, &allpstore, list) { - if (pos->type == type && - pos->id == id && - pos->psi == psi) { - rc = -EEXIST; - break; - } - } - spin_unlock_irqrestore(&allpstore_lock, flags); - if (rc) - return rc; - - rc = -ENOMEM; - inode = pstore_get_inode(pstore_sb); - if (!inode) - goto fail; - inode->i_mode = S_IFREG | 0444; - inode->i_fop = &pstore_file_operations; - private = kmalloc(sizeof *private + size, GFP_KERNEL); - if (!private) - goto fail_alloc; - private->type = type; - private->id = id; - private->psi = psi; - - switch (type) { - case PSTORE_TYPE_DMESG: - sprintf(name, "dmesg-%s-%lld", psname, id); - break; - case PSTORE_TYPE_MCE: - sprintf(name, "mce-%s-%lld", psname, id); - break; - case PSTORE_TYPE_UNKNOWN: - sprintf(name, "unknown-%s-%lld", psname, id); - break; - default: - sprintf(name, "type%d-%s-%lld", type, psname, id); - break; - } - - mutex_lock(&root->d_inode->i_mutex); - - rc = -ENOSPC; - dentry = d_alloc_name(root, name); - if (IS_ERR(dentry)) - goto fail_lockedalloc; - - memcpy(private->data, data, size); - inode->i_size = private->size = size; - - inode->i_private = private; - - if (time.tv_sec) - inode->i_mtime = inode->i_ctime = time; - - d_add(dentry, inode); - - spin_lock_irqsave(&allpstore_lock, flags); - list_add(&private->list, &allpstore); - spin_unlock_irqrestore(&allpstore_lock, flags); - - mutex_unlock(&root->d_inode->i_mutex); - - return 0; - -fail_lockedalloc: - mutex_unlock(&root->d_inode->i_mutex); - kfree(private); -fail_alloc: - iput(inode); - -fail: - return rc; -} - -int pstore_fill_super(struct super_block *sb, void *data, int silent) -{ - struct inode *inode; - - save_mount_options(sb, data); - - pstore_sb = sb; - - sb->s_maxbytes = MAX_LFS_FILESIZE; - sb->s_blocksize = PAGE_CACHE_SIZE; - sb->s_blocksize_bits = PAGE_CACHE_SHIFT; - sb->s_magic = PSTOREFS_MAGIC; - sb->s_op = &pstore_ops; - sb->s_time_gran = 1; - - parse_options(data); - - inode = pstore_get_inode(sb); - if (inode) { - inode->i_mode = S_IFDIR | 0755; - inode->i_op = &pstore_dir_inode_operations; - inode->i_fop = &simple_dir_operations; - inc_nlink(inode); - } - sb->s_root = d_make_root(inode); - if (!sb->s_root) - return -ENOMEM; - - pstore_get_records(0); - - return 0; -} - -static struct dentry *pstore_mount(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) -{ - return mount_single(fs_type, flags, data, pstore_fill_super); -} - -static void pstore_kill_sb(struct super_block *sb) -{ - kill_litter_super(sb); - pstore_sb = NULL; -} - -static struct file_system_type pstore_fs_type = { - .name = "pstore", - .mount = pstore_mount, - .kill_sb = pstore_kill_sb, -}; - -static int __init init_pstore_fs(void) -{ - return register_filesystem(&pstore_fs_type); -} -module_init(init_pstore_fs) - -MODULE_AUTHOR("Tony Luck "); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/fs/pstore/internal.h b/ANDROID_3.4.5/fs/pstore/internal.h deleted file mode 100644 index 3bde461c..00000000 --- a/ANDROID_3.4.5/fs/pstore/internal.h +++ /dev/null @@ -1,6 +0,0 @@ -extern void pstore_set_kmsg_bytes(int); -extern void pstore_get_records(int); -extern int pstore_mkfile(enum pstore_type_id, char *psname, u64 id, - char *data, size_t size, - struct timespec time, struct pstore_info *psi); -extern int pstore_is_mounted(void); diff --git a/ANDROID_3.4.5/fs/pstore/platform.c b/ANDROID_3.4.5/fs/pstore/platform.c deleted file mode 100644 index 82c585f7..00000000 --- a/ANDROID_3.4.5/fs/pstore/platform.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Persistent Storage - platform driver interface parts. - * - * Copyright (C) 2010 Intel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "internal.h" - -/* - * We defer making "oops" entries appear in pstore - see - * whether the system is actually still running well enough - * to let someone see the entry - */ -#define PSTORE_INTERVAL (60 * HZ) - -static int pstore_new_entry; - -static void pstore_timefunc(unsigned long); -static DEFINE_TIMER(pstore_timer, pstore_timefunc, 0, 0); - -static void pstore_dowork(struct work_struct *); -static DECLARE_WORK(pstore_work, pstore_dowork); - -/* - * pstore_lock just protects "psinfo" during - * calls to pstore_register() - */ -static DEFINE_SPINLOCK(pstore_lock); -static struct pstore_info *psinfo; - -static char *backend; - -/* How much of the console log to snapshot */ -static unsigned long kmsg_bytes = 10240; - -void pstore_set_kmsg_bytes(int bytes) -{ - kmsg_bytes = bytes; -} - -/* Tag each group of saved records with a sequence number */ -static int oopscount; - -static const char *get_reason_str(enum kmsg_dump_reason reason) -{ - switch (reason) { - case KMSG_DUMP_PANIC: - return "Panic"; - case KMSG_DUMP_OOPS: - return "Oops"; - case KMSG_DUMP_EMERG: - return "Emergency"; - case KMSG_DUMP_RESTART: - return "Restart"; - case KMSG_DUMP_HALT: - return "Halt"; - case KMSG_DUMP_POWEROFF: - return "Poweroff"; - default: - return "Unknown"; - } -} - -/* - * callback from kmsg_dump. (s2,l2) has the most recently - * written bytes, older bytes are in (s1,l1). Save as much - * as we can from the end of the buffer. - */ -static void pstore_dump(struct kmsg_dumper *dumper, - enum kmsg_dump_reason reason, - const char *s1, unsigned long l1, - const char *s2, unsigned long l2) -{ - unsigned long s1_start, s2_start; - unsigned long l1_cpy, l2_cpy; - unsigned long size, total = 0; - char *dst; - const char *why; - u64 id; - int hsize, ret; - unsigned int part = 1; - unsigned long flags = 0; - int is_locked = 0; - - why = get_reason_str(reason); - - if (in_nmi()) { - is_locked = spin_trylock(&psinfo->buf_lock); - if (!is_locked) - pr_err("pstore dump routine blocked in NMI, may corrupt error record\n"); - } else - spin_lock_irqsave(&psinfo->buf_lock, flags); - oopscount++; - while (total < kmsg_bytes) { - dst = psinfo->buf; - hsize = sprintf(dst, "%s#%d Part%d\n", why, oopscount, part); - size = psinfo->bufsize - hsize; - dst += hsize; - - l2_cpy = min(l2, size); - l1_cpy = min(l1, size - l2_cpy); - - if (l1_cpy + l2_cpy == 0) - break; - - s2_start = l2 - l2_cpy; - s1_start = l1 - l1_cpy; - - memcpy(dst, s1 + s1_start, l1_cpy); - memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); - - ret = psinfo->write(PSTORE_TYPE_DMESG, reason, &id, part, - hsize + l1_cpy + l2_cpy, psinfo); - if (ret == 0 && reason == KMSG_DUMP_OOPS && pstore_is_mounted()) - pstore_new_entry = 1; - l1 -= l1_cpy; - l2 -= l2_cpy; - total += l1_cpy + l2_cpy; - part++; - } - if (in_nmi()) { - if (is_locked) - spin_unlock(&psinfo->buf_lock); - } else - spin_unlock_irqrestore(&psinfo->buf_lock, flags); -} - -static struct kmsg_dumper pstore_dumper = { - .dump = pstore_dump, -}; - -/* - * platform specific persistent storage driver registers with - * us here. If pstore is already mounted, call the platform - * read function right away to populate the file system. If not - * then the pstore mount code will call us later to fill out - * the file system. - * - * Register with kmsg_dump to save last part of console log on panic. - */ -int pstore_register(struct pstore_info *psi) -{ - struct module *owner = psi->owner; - - spin_lock(&pstore_lock); - if (psinfo) { - spin_unlock(&pstore_lock); - return -EBUSY; - } - - if (backend && strcmp(backend, psi->name)) { - spin_unlock(&pstore_lock); - return -EINVAL; - } - - psinfo = psi; - mutex_init(&psinfo->read_mutex); - spin_unlock(&pstore_lock); - - if (owner && !try_module_get(owner)) { - psinfo = NULL; - return -EINVAL; - } - - if (pstore_is_mounted()) - pstore_get_records(0); - - kmsg_dump_register(&pstore_dumper); - - pstore_timer.expires = jiffies + PSTORE_INTERVAL; - add_timer(&pstore_timer); - - return 0; -} -EXPORT_SYMBOL_GPL(pstore_register); - -/* - * Read all the records from the persistent store. Create - * files in our filesystem. Don't warn about -EEXIST errors - * when we are re-scanning the backing store looking to add new - * error records. - */ -void pstore_get_records(int quiet) -{ - struct pstore_info *psi = psinfo; - char *buf = NULL; - ssize_t size; - u64 id; - enum pstore_type_id type; - struct timespec time; - int failed = 0, rc; - - if (!psi) - return; - - mutex_lock(&psi->read_mutex); - if (psi->open && psi->open(psi)) - goto out; - - while ((size = psi->read(&id, &type, &time, &buf, psi)) > 0) { - rc = pstore_mkfile(type, psi->name, id, buf, (size_t)size, - time, psi); - kfree(buf); - buf = NULL; - if (rc && (rc != -EEXIST || !quiet)) - failed++; - } - if (psi->close) - psi->close(psi); -out: - mutex_unlock(&psi->read_mutex); - - if (failed) - printk(KERN_WARNING "pstore: failed to load %d record(s) from '%s'\n", - failed, psi->name); -} - -static void pstore_dowork(struct work_struct *work) -{ - pstore_get_records(1); -} - -static void pstore_timefunc(unsigned long dummy) -{ - if (pstore_new_entry) { - pstore_new_entry = 0; - schedule_work(&pstore_work); - } - - mod_timer(&pstore_timer, jiffies + PSTORE_INTERVAL); -} - -module_param(backend, charp, 0444); -MODULE_PARM_DESC(backend, "Pstore backend to use"); -- cgit