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

📄 nfsiod.c

📁 elinux jffs初始版本 具体了解JFFS的文件系统!
💻 C
字号:
/* * linux/fs/nfs/nfsiod.c * * Async NFS RPC call support. * * When a process wants to place an asynchronous RPC call, it reserves * an nfsiod slot, fills in all necessary fields including the callback * handler field, and enqueues the request. * * This will wake up nfsiod, which calls nfs_rpc_doio to collect the * reply. It then dispatches the result to the caller via the callback * function, including result value and request pointer. It then re-inserts * itself into the free list. * * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> */#include <linux/sched.h>#include <linux/nfs_fs.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/rpcsock.h>#include <linux/nfsiod.h>static struct nfsiod_req *	free_list = NULL;static int			active = 0;#undef DEBUG_NFSIOD#ifdef DEBUG_NFSIOD#define dprintk(args...)	printk(## args)#else#define dprintk(args...)	/* nothing */#endif/* * Reserve an nfsiod slot and initialize the request struct */struct nfsiod_req *nfsiod_reserve(struct nfs_server *server){	struct nfsiod_req	*req;	if (!(req = free_list)) {		dprintk("BIO: nfsiod_reserve: no free nfsiods\n");		return NULL;	}	free_list = req->rq_next;	memset(&req->rq_rpcreq, 0, sizeof(struct rpc_ioreq));	if (rpc_reserve(server->rsock, &req->rq_rpcreq, 1) < 0) {		dprintk("BIO: nfsiod_reserve failed to reserve RPC slot\n");		req->rq_next = free_list;		free_list = req;		return NULL;	}	req->rq_server = server;	return req;}voidnfsiod_release(struct nfsiod_req *req){	dprintk("BIO: nfsiod_release called\n");	rpc_release(req->rq_server->rsock, &req->rq_rpcreq);	memset(&req->rq_rpcreq, 0, sizeof(struct rpc_ioreq));	req->rq_next = free_list;	free_list = req;}/* * Transmit a request and put it on nfsiod's list of pending requests. */voidnfsiod_enqueue(struct nfsiod_req *req){	dprintk("BIO: enqueuing request %p\n", &req->rq_rpcreq);	wake_up(&req->rq_wait);	schedule();}/* * This is the main nfsiod loop. */intnfsiod(void){	struct nfsiod_req	request, *req = &request;	int			result;	dprintk("BIO: nfsiod %d starting\n", current->pid);	while (1) {		/* Insert request into free list */		memset(req, 0, sizeof(*req));		req->rq_next = free_list;		free_list = req;		/* Wait until user enqueues request */		dprintk("BIO: before: now %d nfsiod's active\n", active);		dprintk("BIO: nfsiod %d waiting\n", current->pid);		interruptible_sleep_on(&req->rq_wait);		if (current->signal & ~current->blocked)			break;		if (!req->rq_rpcreq.rq_slot)			continue;		dprintk("BIO: nfsiod %d woken up; calling nfs_rpc_doio.\n",				current->pid);		active++;		dprintk("BIO: before: now %d nfsiod's active\n", active);		do {			result = nfs_rpc_doio(req->rq_server,						&req->rq_rpcreq, 1);		} while (!req->rq_callback(result, req));		active--;	}	return 0;}

⌨️ 快捷键说明

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