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 + -
显示快捷键?