proc.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 858 行 · 第 1/2 页

C
858
字号
		return -ENOMEM;	p = create_proc_entry("servers", 0, cell->proc_dir);	if (!p)		goto error_proc;	p->proc_fops = &afs_proc_cell_servers_fops;	p->owner = THIS_MODULE;	p->data = cell;	p = create_proc_entry("vlservers", 0, cell->proc_dir);	if (!p)		goto error_servers;	p->proc_fops = &afs_proc_cell_vlservers_fops;	p->owner = THIS_MODULE;	p->data = cell;	p = create_proc_entry("volumes", 0, cell->proc_dir);	if (!p)		goto error_vlservers;	p->proc_fops = &afs_proc_cell_volumes_fops;	p->owner = THIS_MODULE;	p->data = cell;	_leave(" = 0");	return 0; error_vlservers:	remove_proc_entry("vlservers", cell->proc_dir); error_servers:	remove_proc_entry("servers", cell->proc_dir); error_proc:	remove_proc_entry(cell->name, proc_afs);	_leave(" = -ENOMEM");	return -ENOMEM;} /* end afs_proc_cell_setup() *//*****************************************************************************//* * remove /proc/fs/afs/<cell>/ */void afs_proc_cell_remove(struct afs_cell *cell){	_enter("");	remove_proc_entry("volumes", cell->proc_dir);	remove_proc_entry("vlservers", cell->proc_dir);	remove_proc_entry("servers", cell->proc_dir);	remove_proc_entry(cell->name, proc_afs);	_leave("");} /* end afs_proc_cell_remove() *//*****************************************************************************//* * open "/proc/fs/afs/<cell>/volumes" which provides a summary of extant cells */static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file){	struct afs_cell *cell;	struct seq_file *m;	int ret;	cell = afs_get_cell_maybe((struct afs_cell **) &PDE(inode)->data);	if (!cell)		return -ENOENT;	ret = seq_open(file, &afs_proc_cell_volumes_ops);	if (ret < 0)		return ret;	m = file->private_data;	m->private = cell;	return 0;} /* end afs_proc_cell_volumes_open() *//*****************************************************************************//* * close the file and release the ref to the cell */static int afs_proc_cell_volumes_release(struct inode *inode, struct file *file){	struct afs_cell *cell = PDE(inode)->data;	int ret;	ret = seq_release(inode,file);	afs_put_cell(cell);	return ret;} /* end afs_proc_cell_volumes_release() *//*****************************************************************************//* * set up the iterator to start reading from the cells list and return the * first item */static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos){	struct list_head *_p;	struct afs_cell *cell = m->private;	loff_t pos = *_pos;	_enter("cell=%p pos=%Ld", cell, *_pos);	/* lock the list against modification */	down_read(&cell->vl_sem);	/* allow for the header line */	if (!pos)		return (void *) 1;	pos--;	/* find the n'th element in the list */	list_for_each(_p, &cell->vl_list)		if (!pos--)			break;	return _p != &cell->vl_list ? _p : NULL;} /* end afs_proc_cell_volumes_start() *//*****************************************************************************//* * move to next cell in cells list */static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v,					loff_t *_pos){	struct list_head *_p;	struct afs_cell *cell = p->private;	_enter("cell=%p pos=%Ld", cell, *_pos);	(*_pos)++;	_p = v;	_p = v == (void *) 1 ? cell->vl_list.next : _p->next;	return _p != &cell->vl_list ? _p : NULL;} /* end afs_proc_cell_volumes_next() *//*****************************************************************************//* * clean up after reading from the cells list */static void afs_proc_cell_volumes_stop(struct seq_file *p, void *v){	struct afs_cell *cell = p->private;	up_read(&cell->vl_sem);} /* end afs_proc_cell_volumes_stop() *//*****************************************************************************//* * display a header line followed by a load of volume lines */static int afs_proc_cell_volumes_show(struct seq_file *m, void *v){	struct afs_vlocation *vlocation =		list_entry(v, struct afs_vlocation, link);	/* display header on line 1 */	if (v == (void *) 1) {		seq_puts(m, "USE VLID[0]  VLID[1]  VLID[2]  NAME\n");		return 0;	}	/* display one cell per line on subsequent lines */	seq_printf(m, "%3d %08x %08x %08x %s\n",		   atomic_read(&vlocation->usage),		   vlocation->vldb.vid[0],		   vlocation->vldb.vid[1],		   vlocation->vldb.vid[2],		   vlocation->vldb.name		   );	return 0;} /* end afs_proc_cell_volumes_show() *//*****************************************************************************//* * open "/proc/fs/afs/<cell>/vlservers" which provides a list of volume * location server */static int afs_proc_cell_vlservers_open(struct inode *inode, struct file *file){	struct afs_cell *cell;	struct seq_file *m;	int ret;	cell = afs_get_cell_maybe((struct afs_cell**)&PDE(inode)->data);	if (!cell)		return -ENOENT;	ret = seq_open(file,&afs_proc_cell_vlservers_ops);	if (ret<0)		return ret;	m = file->private_data;	m->private = cell;	return 0;} /* end afs_proc_cell_vlservers_open() *//*****************************************************************************//* * close the file and release the ref to the cell */static int afs_proc_cell_vlservers_release(struct inode *inode,					   struct file *file){	struct afs_cell *cell = PDE(inode)->data;	int ret;	ret = seq_release(inode,file);	afs_put_cell(cell);	return ret;} /* end afs_proc_cell_vlservers_release() *//*****************************************************************************//* * set up the iterator to start reading from the cells list and return the * first item */static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos){	struct afs_cell *cell = m->private;	loff_t pos = *_pos;	_enter("cell=%p pos=%Ld", cell, *_pos);	/* lock the list against modification */	down_read(&cell->vl_sem);	/* allow for the header line */	if (!pos)		return (void *) 1;	pos--;	if (pos >= cell->vl_naddrs)		return NULL;	return &cell->vl_addrs[pos];} /* end afs_proc_cell_vlservers_start() *//*****************************************************************************//* * move to next cell in cells list */static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v,					  loff_t *_pos){	struct afs_cell *cell = p->private;	loff_t pos;	_enter("cell=%p{nad=%u} pos=%Ld", cell, cell->vl_naddrs, *_pos);	pos = *_pos;	(*_pos)++;	if (pos >= cell->vl_naddrs)		return NULL;	return &cell->vl_addrs[pos];} /* end afs_proc_cell_vlservers_next() *//*****************************************************************************//* * clean up after reading from the cells list */static void afs_proc_cell_vlservers_stop(struct seq_file *p, void *v){	struct afs_cell *cell = p->private;	up_read(&cell->vl_sem);} /* end afs_proc_cell_vlservers_stop() *//*****************************************************************************//* * display a header line followed by a load of volume lines */static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v){	struct in_addr *addr = v;	/* display header on line 1 */	if (v == (struct in_addr *) 1) {		seq_puts(m, "ADDRESS\n");		return 0;	}	/* display one cell per line on subsequent lines */	seq_printf(m, "%u.%u.%u.%u\n", NIPQUAD(addr->s_addr));	return 0;} /* end afs_proc_cell_vlservers_show() *//*****************************************************************************//* * open "/proc/fs/afs/<cell>/servers" which provides a summary of active * servers */static int afs_proc_cell_servers_open(struct inode *inode, struct file *file){	struct afs_cell *cell;	struct seq_file *m;	int ret;	cell = afs_get_cell_maybe((struct afs_cell **) &PDE(inode)->data);	if (!cell)		return -ENOENT;	ret = seq_open(file, &afs_proc_cell_servers_ops);	if (ret < 0)		return ret;	m = file->private_data;	m->private = cell;	return 0;} /* end afs_proc_cell_servers_open() *//*****************************************************************************//* * close the file and release the ref to the cell */static int afs_proc_cell_servers_release(struct inode *inode,					 struct file *file){	struct afs_cell *cell = PDE(inode)->data;	int ret;	ret = seq_release(inode, file);	afs_put_cell(cell);	return ret;} /* end afs_proc_cell_servers_release() *//*****************************************************************************//* * set up the iterator to start reading from the cells list and return the * first item */static void *afs_proc_cell_servers_start(struct seq_file *m, loff_t *_pos){	struct list_head *_p;	struct afs_cell *cell = m->private;	loff_t pos = *_pos;	_enter("cell=%p pos=%Ld", cell, *_pos);	/* lock the list against modification */	read_lock(&cell->sv_lock);	/* allow for the header line */	if (!pos)		return (void *) 1;	pos--;	/* find the n'th element in the list */	list_for_each(_p, &cell->sv_list)		if (!pos--)			break;	return _p != &cell->sv_list ? _p : NULL;} /* end afs_proc_cell_servers_start() *//*****************************************************************************//* * move to next cell in cells list */static void *afs_proc_cell_servers_next(struct seq_file *p, void *v,					loff_t *_pos){	struct list_head *_p;	struct afs_cell *cell = p->private;	_enter("cell=%p pos=%Ld", cell, *_pos);	(*_pos)++;	_p = v;	_p = v == (void *) 1 ? cell->sv_list.next : _p->next;	return _p != &cell->sv_list ? _p : NULL;} /* end afs_proc_cell_servers_next() *//*****************************************************************************//* * clean up after reading from the cells list */static void afs_proc_cell_servers_stop(struct seq_file *p, void *v){	struct afs_cell *cell = p->private;	read_unlock(&cell->sv_lock);} /* end afs_proc_cell_servers_stop() *//*****************************************************************************//* * display a header line followed by a load of volume lines */static int afs_proc_cell_servers_show(struct seq_file *m, void *v){	struct afs_server *server = list_entry(v, struct afs_server, link);	char ipaddr[20];	/* display header on line 1 */	if (v == (void *) 1) {		seq_puts(m, "USE ADDR            STATE\n");		return 0;	}	/* display one cell per line on subsequent lines */	sprintf(ipaddr, "%u.%u.%u.%u", NIPQUAD(server->addr));	seq_printf(m, "%3d %-15.15s %5d\n",		   atomic_read(&server->usage),		   ipaddr,		   server->fs_state		   );	return 0;} /* end afs_proc_cell_servers_show() */

⌨️ 快捷键说明

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