⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lvm-fs.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 2 页
字号:
}static int _proc_read_global(char *page, char **start, off_t pos, int count,			     int *eof, void *data) {#define  LVM_PROC_BUF   ( i == 0 ? dummy_buf : &buf[sz])	int c, i, l, p, v, vg_counter, pv_counter, lv_counter, lv_open_counter,		lv_open_total, pe_t_bytes, hash_table_bytes, lv_block_exception_t_bytes, seconds;	static off_t sz;	off_t sz_last;	static char *buf = NULL;	static char dummy_buf[160];	/* sized for 2 lines */	vg_t *vg_ptr;	lv_t *lv_ptr;	pv_t *pv_ptr;#ifdef DEBUG_LVM_PROC_GET_INFO	printk(KERN_DEBUG	       "%s - lvm_proc_get_global_info CALLED  pos: %lu  count: %d\n",	       lvm_name, pos, count);#endif	if(pos != 0 && buf != NULL)		goto out;	sz_last = vg_counter = pv_counter = lv_counter = lv_open_counter = \		lv_open_total = pe_t_bytes = hash_table_bytes = \		lv_block_exception_t_bytes = 0;	/* get some statistics */	for (v = 0; v < ABS_MAX_VG; v++) {		if ((vg_ptr = vg[v]) != NULL) {			vg_counter++;			pv_counter += vg_ptr->pv_cur;			lv_counter += vg_ptr->lv_cur;			if (vg_ptr->lv_cur > 0) {				for (l = 0; l < vg[v]->lv_max; l++) {					if ((lv_ptr = vg_ptr->lv[l]) != NULL) {						pe_t_bytes += lv_ptr->lv_allocated_le;						hash_table_bytes += lv_ptr->lv_snapshot_hash_table_size;						if (lv_ptr->lv_block_exception != NULL)							lv_block_exception_t_bytes += lv_ptr->lv_remap_end;						if (lv_ptr->lv_open > 0) {							lv_open_counter++;							lv_open_total += lv_ptr->lv_open;						}					}				}			}		}	}	pe_t_bytes *= sizeof(pe_t);	lv_block_exception_t_bytes *= sizeof(lv_block_exception_t);	if (buf != NULL) {		P_KFREE("%s -- vfree %d\n", lvm_name, __LINE__);		lock_kernel();		vfree(buf);		unlock_kernel();		buf = NULL;	}	/* 2 times: first to get size to allocate buffer,	   2nd to fill the malloced buffer */	for (i = 0; i < 2; i++) {		sz = 0;		sz += sprintf(LVM_PROC_BUF,			      "LVM "#ifdef MODULE			      "module"#else			      "driver"#endif			      " %s\n\n"			      "Total:  %d VG%s  %d PV%s  %d LV%s ",			      lvm_version,			      vg_counter, vg_counter == 1 ? "" : "s",			      pv_counter, pv_counter == 1 ? "" : "s",			      lv_counter, lv_counter == 1 ? "" : "s");		sz += sprintf(LVM_PROC_BUF,			      "(%d LV%s open",			      lv_open_counter,			      lv_open_counter == 1 ? "" : "s");		if (lv_open_total > 0)			sz += sprintf(LVM_PROC_BUF,				      " %d times)\n",				      lv_open_total);		else			sz += sprintf(LVM_PROC_BUF, ")");		sz += sprintf(LVM_PROC_BUF,			      "\nGlobal: %lu bytes malloced   IOP version: %d   ",			      vg_counter * sizeof(vg_t) +			      pv_counter * sizeof(pv_t) +			      lv_counter * sizeof(lv_t) +			      pe_t_bytes + hash_table_bytes + lv_block_exception_t_bytes + sz_last,			      lvm_iop_version);		seconds = CURRENT_TIME - loadtime;		if (seconds < 0)			loadtime = CURRENT_TIME + seconds;		if (seconds / 86400 > 0) {			sz += sprintf(LVM_PROC_BUF, "%d day%s ",				      seconds / 86400,				      seconds / 86400 == 0 ||				      seconds / 86400 > 1 ? "s" : "");		}		sz += sprintf(LVM_PROC_BUF, "%d:%02d:%02d active\n",			      (seconds % 86400) / 3600,			      (seconds % 3600) / 60,			      seconds % 60);		if (vg_counter > 0) {			for (v = 0; v < ABS_MAX_VG; v++) {				/* volume group */				if ((vg_ptr = vg[v]) != NULL) {					sz += _vg_info(vg_ptr, LVM_PROC_BUF);					/* physical volumes */					sz += sprintf(LVM_PROC_BUF,						      "\n  PV%s ",						      vg_ptr->pv_cur == 1 ? ": " : "s:");					c = 0;					for (p = 0; p < vg_ptr->pv_max; p++) {						if ((pv_ptr = vg_ptr->pv[p]) != NULL) {							sz += _pv_info(pv_ptr, LVM_PROC_BUF);							c++;							if (c < vg_ptr->pv_cur)								sz += sprintf(LVM_PROC_BUF,									      "\n       ");						}					}					/* logical volumes */					sz += sprintf(LVM_PROC_BUF,						      "\n    LV%s ",						      vg_ptr->lv_cur == 1 ? ": " : "s:");					c = 0;					for (l = 0; l < vg_ptr->lv_max; l++) {						if ((lv_ptr = vg_ptr->lv[l]) != NULL) {							sz += _lv_info(vg_ptr, lv_ptr, LVM_PROC_BUF);							c++;							if (c < vg_ptr->lv_cur)								sz += sprintf(LVM_PROC_BUF,									      "\n         ");						}					}					if (vg_ptr->lv_cur == 0) sz += sprintf(LVM_PROC_BUF, "none");					sz += sprintf(LVM_PROC_BUF, "\n");				}			}		}		if (buf == NULL) {			lock_kernel();			buf = vmalloc(sz);			unlock_kernel();			if (buf == NULL) {				sz = 0;				return sprintf(page, "%s - vmalloc error at line %d\n",					       lvm_name, __LINE__);			}		}		sz_last = sz;	} out:	if (pos > sz - 1) {		lock_kernel();		vfree(buf);		unlock_kernel();		buf = NULL;		return 0;	}	*start = &buf[pos];	if (sz - pos < count)		return sz - pos;	else		return count;#undef LVM_PROC_BUF}/* * provide VG info for proc filesystem use (global) */static int _vg_info(vg_t *vg_ptr, char *buf) {	int sz = 0;	char inactive_flag = ' ';	if (!(vg_ptr->vg_status & VG_ACTIVE)) inactive_flag = 'I';	sz = sprintf(buf,		     "\nVG: %c%s  [%d PV, %d LV/%d open] "		     " PE Size: %d KB\n"		     "  Usage [KB/PE]: %d /%d total  "		     "%d /%d used  %d /%d free",		     inactive_flag,		     vg_ptr->vg_name,		     vg_ptr->pv_cur,		     vg_ptr->lv_cur,		     vg_ptr->lv_open,	     	     vg_ptr->pe_size >> 1,		     vg_ptr->pe_size * vg_ptr->pe_total >> 1,		     vg_ptr->pe_total,		     vg_ptr->pe_allocated * vg_ptr->pe_size >> 1,	     	     vg_ptr->pe_allocated,		     (vg_ptr->pe_total - vg_ptr->pe_allocated) *	     	     vg_ptr->pe_size >> 1,		     vg_ptr->pe_total - vg_ptr->pe_allocated);	return sz;}/* * provide LV info for proc filesystem use (global) */static int _lv_info(vg_t *vg_ptr, lv_t *lv_ptr, char *buf) {	int sz = 0;	char inactive_flag = 'A', allocation_flag = ' ',		stripes_flag = ' ', rw_flag = ' ', *basename;	if (!(lv_ptr->lv_status & LV_ACTIVE))		inactive_flag = 'I';	rw_flag = 'R';	if (lv_ptr->lv_access & LV_WRITE)		rw_flag = 'W';	allocation_flag = 'D';	if (lv_ptr->lv_allocation & LV_CONTIGUOUS)		allocation_flag = 'C';	stripes_flag = 'L';	if (lv_ptr->lv_stripes > 1)		stripes_flag = 'S';	sz += sprintf(buf+sz,		      "[%c%c%c%c",		      inactive_flag,	 rw_flag,		      allocation_flag,		      stripes_flag);	if (lv_ptr->lv_stripes > 1)		sz += sprintf(buf+sz, "%-2d",			      lv_ptr->lv_stripes);	else		sz += sprintf(buf+sz, "  ");	/* FIXME: use _basename */	basename = strrchr(lv_ptr->lv_name, '/');	if ( basename == 0) basename = lv_ptr->lv_name;	else                basename++;	sz += sprintf(buf+sz, "] %-25s", basename);	if (strlen(basename) > 25)		sz += sprintf(buf+sz,			      "\n                              ");	sz += sprintf(buf+sz, "%9d /%-6d   ",		      lv_ptr->lv_size >> 1,		      lv_ptr->lv_size / vg_ptr->pe_size);	if (lv_ptr->lv_open == 0)		sz += sprintf(buf+sz, "close");	else		sz += sprintf(buf+sz, "%dx open",			      lv_ptr->lv_open);	return sz;}/* * provide PV info for proc filesystem use (global) */static int _pv_info(pv_t *pv, char *buf) {	int sz = 0;	char inactive_flag = 'A', allocation_flag = ' ';	char *pv_name = NULL;	if (!(pv->pv_status & PV_ACTIVE))		inactive_flag = 'I';	allocation_flag = 'A';	if (!(pv->pv_allocatable & PV_ALLOCATABLE))		allocation_flag = 'N';	pv_name = strchr(pv->pv_name+1,'/');	if ( pv_name == 0) pv_name = pv->pv_name;	else               pv_name++;	sz = sprintf(buf,		     "[%c%c] %-21s %8d /%-6d  "		     "%8d /%-6d  %8d /%-6d",		     inactive_flag,		     allocation_flag,		     pv_name,		     pv->pe_total * pv->pe_size >> 1,		     pv->pe_total,		     pv->pe_allocated * pv->pe_size >> 1,		     pv->pe_allocated,		     (pv->pe_total - pv->pe_allocated) *		     pv->pe_size >> 1,		     pv->pe_total - pv->pe_allocated);	return sz;}static void _show_uuid(const char *src, char *b, char *e) {	int i;	e--;	for(i = 0; *src && (b != e); i++) {		if(i && !(i & 0x3))			*b++ = '-';		*b++ = *src++;	}	*b = '\0';}MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -