static void last_kmsg_work_function(struct work_struct *dat) { #define SWR_SYS_RST_STA (1<<13) #define WDT_SYS_RST_STA (1<<12) char *buffer; struct file *fp; struct file *fp_proc; mm_segment_t old_fs; ssize_t result; printk(KERN_INFO "dump last_kmsg starting\n"); buffer=kmalloc(SZ_1M, GFP_KERNEL); if(!buffer){ printk(KERN_ERR "last_kmsg_work_function:alloc buffer fail!\n"); return; } if (last_kmsg_log_filename() < 0){ printk(KERN_ERR "%s folder doesn't exist, and create fail !\n", DATA_LOGS); kfree(buffer); return ; } last_kmsg_get_time(); strcat(rd_log_file, rd_kernel_time); if (boot_reason==WDT_SYS_RST_STA) strcat(rd_log_file,".log_wdt"); else if (boot_reason==SWR_SYS_RST_STA && is_panic()) strcat(rd_log_file,".log_panic"); #ifdef CONFIG_DEBUG_SLAB else if (boot_reason==SWR_SYS_RST_STA ) strcat(rd_log_file,".log_reboot"); else strcat(rd_log_file,".log_hwreset"); #endif old_fs = get_fs(); set_fs(KERNEL_DS); fp_proc = filp_open("/proc/last_kmsg" , O_APPEND | O_RDWR | O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); if (PTR_ERR(fp_proc) == -ENOENT){ printk(KERN_INFO "last_kmsg_work_function:last_kmsg is empty!\n"); set_fs(old_fs); kfree(buffer); return ; } fp = filp_open(rd_log_file , O_APPEND | O_RDWR | O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); if (PTR_ERR(fp) == -ENOENT){ filp_close(fp_proc,NULL); set_fs(old_fs); kfree(buffer); return ; } result=vfs_read(fp_proc, buffer, SZ_1M, &fp_proc->f_pos); if( result < 0 ){ printk(KERN_INFO "last_kmsg_work_function:read last_kmsg fail!\n"); }else{ result=vfs_write(fp, buffer, result, &fp->f_pos); if( result < 0 ) printk(KERN_INFO "last_kmsg_work_function:write last_kmsg fail!\n"); } filp_close(fp_proc,NULL); filp_close(fp,NULL); set_fs(old_fs); kfree(buffer); printk(KERN_INFO "last_kmsg file: %s\n", rd_log_file); return; }
static void last_kmsg_work_function(struct work_struct *dat) { char *buffer; struct file *fp; struct file *fp_proc; struct file *fp_mounts; mm_segment_t old_fs; ssize_t result; //************************************** //mmcblk0p8 just for t30 branch //************************************** char mount_point[32] = "mmcblk0p8"; #define PMC_RST_STATUS_WDT (1) #define PMC_RST_STATUS_SW (3) printk(KERN_INFO "dump last_kmsg starting\n"); buffer=kmalloc(SZ_1M, GFP_KERNEL); memset(buffer, 0, SZ_1M); if(!buffer){ printk(KERN_INFO "last_kmsg_work_function:alloc buffer fail!\n"); return; } if (last_kmsg_log_filename() < 0){ printk(KERN_INFO "%s folder doesn't exist, and create fail !\n", DATA_LOGS); kfree(buffer); return ; } old_fs = get_fs(); set_fs(KERNEL_DS); while(1) { fp_mounts = filp_open("/proc/mounts" , O_RDONLY, 0); if (PTR_ERR(fp_mounts) == -ENOENT) { printk(KERN_INFO "last_kmsg_work_function:open /proc/mounts fail!\n"); msleep(1000); } else { vfs_read(fp_mounts, buffer, SZ_1M, &fp_mounts->f_pos); if(!strstr(buffer, mount_point)) { printk(KERN_INFO "last_kmsg_work_function:mmcblk0p8 was not mounted yet!\n"); filp_close(fp_mounts,NULL); msleep(1000); } else { break; } } } memset(buffer, 0, SZ_1M); last_kmsg_get_time(); strcat(rd_log_file, rd_kernel_time); if (boot_reason==PMC_RST_STATUS_WDT) { strcat(rd_log_file,".log_wdt"); } else if (boot_reason==PMC_RST_STATUS_SW ) { strcat(rd_log_file,".log_SwReboot"); } else { strcat(rd_log_file,".log_normal"); } fp_proc = filp_open("/proc/last_kmsg" , O_RDONLY, 0); if (PTR_ERR(fp_proc) == -ENOENT) { printk(KERN_INFO "last_kmsg_work_function:last_kmsg is empty!\n"); filp_close(fp_mounts,NULL); set_fs(old_fs); kfree(buffer); return ; } fp = filp_open(rd_log_file , O_APPEND | O_RDWR | O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); if (PTR_ERR(fp) == -ENOENT) { printk(KERN_INFO "last_kmsg_work_function:open log file fail!\n"); filp_close(fp_mounts,NULL); filp_close(fp_proc,NULL); set_fs(old_fs); kfree(buffer); return ; } result=vfs_read(fp_proc, buffer, SZ_1M, &fp_proc->f_pos); if( result < 0 ) { printk(KERN_INFO "last_kmsg_work_function:read last_kmsg fail!\n"); } else { result=vfs_write(fp, buffer, result, &fp->f_pos); if( result < 0 ) printk(KERN_INFO "last_kmsg_work_function:write last_kmsg fail!\n"); } filp_close(fp_mounts,NULL); filp_close(fp_proc,NULL); filp_close(fp,NULL); set_fs(old_fs); kfree(buffer); printk(KERN_INFO "last_kmsg file: %s\n", rd_log_file); return; }