亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? clntlock.c

?? Linux中關于遠程文件鎖定的支持的源代碼
?? C
字號:
/* * linux/fs/lockd/clntlock.c * * Lock handling for the client side NLM implementation * * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> */#include <linux/module.h>#include <linux/types.h>#include <linux/time.h>#include <linux/nfs_fs.h>#include <linux/sunrpc/clnt.h>#include <linux/sunrpc/svc.h>#include <linux/lockd/lockd.h>#include <linux/smp_lock.h>#include <linux/kthread.h>#define NLMDBG_FACILITY		NLMDBG_CLIENT/* * Local function prototypes */static int			reclaimer(void *ptr);/* * The following functions handle blocking and granting from the * client perspective. *//* * This is the representation of a blocked client lock. */struct nlm_wait {	struct list_head	b_list;		/* linked list */	wait_queue_head_t	b_wait;		/* where to wait on */	struct nlm_host *	b_host;	struct file_lock *	b_lock;		/* local file lock */	unsigned short		b_reclaim;	/* got to reclaim lock */	__be32			b_status;	/* grant callback status */};static LIST_HEAD(nlm_blocked);/** * nlmclnt_init - Set up per-NFS mount point lockd data structures * @nlm_init: pointer to arguments structure * * Returns pointer to an appropriate nlm_host struct, * or an ERR_PTR value. */struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init){	struct nlm_host *host;	u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4;	int status;	status = lockd_up();	if (status < 0)		return ERR_PTR(status);	host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen,				   nlm_init->protocol, nlm_version,				   nlm_init->hostname, nlm_init->noresvport);	if (host == NULL) {		lockd_down();		return ERR_PTR(-ENOLCK);	}	return host;}EXPORT_SYMBOL_GPL(nlmclnt_init);/** * nlmclnt_done - Release resources allocated by nlmclnt_init() * @host: nlm_host structure reserved by nlmclnt_init() * */void nlmclnt_done(struct nlm_host *host){	nlm_release_host(host);	lockd_down();}EXPORT_SYMBOL_GPL(nlmclnt_done);/* * Queue up a lock for blocking so that the GRANTED request can see it */struct nlm_wait *nlmclnt_prepare_block(struct nlm_host *host, struct file_lock *fl){	struct nlm_wait *block;	block = kmalloc(sizeof(*block), GFP_KERNEL);	if (block != NULL) {		block->b_host = host;		block->b_lock = fl;		init_waitqueue_head(&block->b_wait);		block->b_status = nlm_lck_blocked;		list_add(&block->b_list, &nlm_blocked);	}	return block;}void nlmclnt_finish_block(struct nlm_wait *block){	if (block == NULL)		return;	list_del(&block->b_list);	kfree(block);}/* * Block on a lock */int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout){	long ret;	/* A borken server might ask us to block even if we didn't	 * request it. Just say no!	 */	if (block == NULL)		return -EAGAIN;	/* Go to sleep waiting for GRANT callback. Some servers seem	 * to lose callbacks, however, so we're going to poll from	 * time to time just to make sure.	 *	 * For now, the retry frequency is pretty high; normally 	 * a 1 minute timeout would do. See the comment before	 * nlmclnt_lock for an explanation.	 */	ret = wait_event_interruptible_timeout(block->b_wait,			block->b_status != nlm_lck_blocked,			timeout);	if (ret < 0)		return -ERESTARTSYS;	req->a_res.status = block->b_status;	return 0;}#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)static const struct in6_addr *nlmclnt_map_v4addr(const struct sockaddr *sap,						 struct in6_addr *addr_mapped){	const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;	switch (sap->sa_family) {	case AF_INET6:		return &((const struct sockaddr_in6 *)sap)->sin6_addr;	case AF_INET:		ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, addr_mapped);		return addr_mapped;	}	return NULL;}/* * If lockd is using a PF_INET6 listener, all incoming requests appear * to come from AF_INET6 remotes.  The address of AF_INET remotes are * mapped to AF_INET6 automatically by the network layer.  In case the * user passed an AF_INET server address at mount time, ensure both * addresses are AF_INET6 before comparing them. */static int nlmclnt_cmp_addr(const struct nlm_host *host,			    const struct sockaddr *sap){	const struct in6_addr *addr1;	const struct in6_addr *addr2;	struct in6_addr addr1_mapped;	struct in6_addr addr2_mapped;	addr1 = nlmclnt_map_v4addr(nlm_addr(host), &addr1_mapped);	if (likely(addr1 != NULL)) {		addr2 = nlmclnt_map_v4addr(sap, &addr2_mapped);		if (likely(addr2 != NULL))			return ipv6_addr_equal(addr1, addr2);	}	return 0;}#else	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */static int nlmclnt_cmp_addr(const struct nlm_host *host,			    const struct sockaddr *sap){	return nlm_cmp_addr(nlm_addr(host), sap);}#endif	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) *//* * The server lockd has called us back to tell us the lock was granted */__be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock){	const struct file_lock *fl = &lock->fl;	const struct nfs_fh *fh = &lock->fh;	struct nlm_wait	*block;	__be32 res = nlm_lck_denied;	/*	 * Look up blocked request based on arguments. 	 * Warning: must not use cookie to match it!	 */	list_for_each_entry(block, &nlm_blocked, b_list) {		struct file_lock *fl_blocked = block->b_lock;		if (fl_blocked->fl_start != fl->fl_start)			continue;		if (fl_blocked->fl_end != fl->fl_end)			continue;		/*		 * Careful! The NLM server will return the 32-bit "pid" that		 * we put on the wire: in this case the lockowner "pid".		 */		if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)			continue;		if (!nlmclnt_cmp_addr(block->b_host, addr))			continue;		if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)			continue;		/* Alright, we found a lock. Set the return status		 * and wake up the caller		 */		block->b_status = nlm_granted;		wake_up(&block->b_wait);		res = nlm_granted;	}	return res;}/* * The following procedures deal with the recovery of locks after a * server crash. *//* * Reclaim all locks on server host. We do this by spawning a separate * reclaimer thread. */voidnlmclnt_recovery(struct nlm_host *host){	struct task_struct *task;	if (!host->h_reclaiming++) {		nlm_get_host(host);		task = kthread_run(reclaimer, host, "%s-reclaim", host->h_name);		if (IS_ERR(task))			printk(KERN_ERR "lockd: unable to spawn reclaimer "				"thread. Locks for %s won't be reclaimed! "				"(%ld)\n", host->h_name, PTR_ERR(task));	}}static intreclaimer(void *ptr){	struct nlm_host	  *host = (struct nlm_host *) ptr;	struct nlm_wait	  *block;	struct file_lock *fl, *next;	u32 nsmstate;	allow_signal(SIGKILL);	down_write(&host->h_rwsem);	/* This one ensures that our parent doesn't terminate while the	 * reclaim is in progress */	lock_kernel();	lockd_up();	/* note: this cannot fail as lockd is already running */	dprintk("lockd: reclaiming locks for host %s\n", host->h_name);restart:	nsmstate = host->h_nsmstate;	/* Force a portmap getport - the peer's lockd will	 * most likely end up on a different port.	 */	host->h_nextrebind = jiffies;	nlm_rebind_host(host);	/* First, reclaim all locks that have been granted. */	list_splice_init(&host->h_granted, &host->h_reclaim);	list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) {		list_del_init(&fl->fl_u.nfs_fl.list);		/*		 * sending this thread a SIGKILL will result in any unreclaimed		 * locks being removed from the h_granted list. This means that		 * the kernel will not attempt to reclaim them again if a new		 * reclaimer thread is spawned for this host.		 */		if (signalled())			continue;		if (nlmclnt_reclaim(host, fl) != 0)			continue;		list_add_tail(&fl->fl_u.nfs_fl.list, &host->h_granted);		if (host->h_nsmstate != nsmstate) {			/* Argh! The server rebooted again! */			goto restart;		}	}	host->h_reclaiming = 0;	up_write(&host->h_rwsem);	dprintk("NLM: done reclaiming locks for host %s\n", host->h_name);	/* Now, wake up all processes that sleep on a blocked lock */	list_for_each_entry(block, &nlm_blocked, b_list) {		if (block->b_host == host) {			block->b_status = nlm_lck_denied_grace_period;			wake_up(&block->b_wait);		}	}	/* Release host handle after use */	nlm_release_host(host);	lockd_down();	unlock_kernel();	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女一区二区视频| 成人av免费在线| 亚洲欧美日韩综合aⅴ视频| 91麻豆精品国产自产在线| 成人激情小说乱人伦| 韩国av一区二区三区四区| 亚洲天堂网中文字| 国产欧美日韩久久| 欧美大片在线观看一区| 欧美色中文字幕| 欧美主播一区二区三区美女| 不卡大黄网站免费看| 国产乱码精品一区二区三 | 在线亚洲一区二区| 国产精品香蕉一区二区三区| 黑人巨大精品欧美一区| 免费观看久久久4p| 日韩精品色哟哟| 蜜桃av噜噜一区| 视频在线在亚洲| 免费av成人在线| 久久国产乱子精品免费女| 一区二区三区在线观看国产 | 欧美猛男超大videosgay| 成人激情黄色小说| 99这里只有精品| 日本精品视频一区二区| 91在线丨porny丨国产| 一本色道久久综合亚洲91| 色综合久久综合网欧美综合网| 成人ar影院免费观看视频| 成人av动漫在线| 在线看一区二区| 色婷婷久久99综合精品jk白丝| 欧美吞精做爰啪啪高潮| 日韩欧美自拍偷拍| 久久久一区二区三区| 亚洲国产精品传媒在线观看| 亚洲婷婷国产精品电影人久久| 亚洲欧洲av色图| 亚洲国产精品一区二区久久| 美美哒免费高清在线观看视频一区二区| 免费在线观看日韩欧美| 国产精品系列在线播放| 色噜噜狠狠成人网p站| 欧美日韩免费视频| 国产日韩欧美精品综合| 亚洲一区二区三区自拍| 日韩成人午夜电影| 粉嫩久久99精品久久久久久夜| 日本精品视频一区二区| 91麻豆精品国产91久久久使用方法 | 亚洲欧洲精品天堂一级| 免费人成网站在线观看欧美高清| 成人综合婷婷国产精品久久| 国产老肥熟一区二区三区| 欧美在线免费播放| 国产午夜精品一区二区三区嫩草 | 91黄视频在线观看| 久久尤物电影视频在线观看| 国产精品对白交换视频| 美女视频黄 久久| 91玉足脚交白嫩脚丫在线播放| 欧美va亚洲va香蕉在线| 亚洲第一福利一区| 成人免费视频视频| 久久精品国产精品青草| 欧美在线观看18| 亚洲欧美在线aaa| 亚洲国产欧美在线| 色综合久久综合网97色综合| 国产精品人妖ts系列视频| 欧美成人精品3d动漫h| 亚洲制服丝袜在线| 精品视频123区在线观看| 91麻豆6部合集magnet| 日韩亚洲欧美在线| 成人一区二区三区在线观看| 久久久久久久久久久久电影| 日韩av一级片| 欧美伦理视频网站| 洋洋av久久久久久久一区| 成人精品视频一区| 国产精品视频线看| 国内精品伊人久久久久av影院| 欧美视频一区二区| 免费高清在线一区| 欧美一区二区三区的| 热久久免费视频| 国产目拍亚洲精品99久久精品| 成人精品免费看| 日本一区二区不卡视频| 色综合天天综合在线视频| 午夜精品久久久久久| 色婷婷久久一区二区三区麻豆| 亚洲一二三区在线观看| 日韩欧美一级二级三级久久久| 理论片日本一区| 亚洲国产高清在线观看视频| 久久精品久久精品| 中文字幕成人av| 91精品国产综合久久蜜臀| 99视频国产精品| 日本不卡一二三区黄网| 精品国产成人在线影院| 91丝袜呻吟高潮美腿白嫩在线观看| 一区二区免费看| 欧美精品精品一区| 成人午夜在线免费| 日韩成人免费电影| 国产精品第一页第二页第三页| 欧美视频一区二区三区四区| 国产精品一区二区在线播放| 亚洲综合成人在线| 日韩一级欧美一级| 色天使色偷偷av一区二区| 精品一区免费av| 亚洲精品国久久99热| 久久综合久久综合亚洲| 欧美色欧美亚洲另类二区| 成熟亚洲日本毛茸茸凸凹| 一区二区三区在线视频观看| 久久尤物电影视频在线观看| 在线一区二区三区四区| 国产一区二区在线免费观看| 亚洲v日本v欧美v久久精品| 亚洲欧美在线高清| 亚洲欧美偷拍卡通变态| 国产日本欧美一区二区| 国产日产精品1区| 国产精品欧美久久久久一区二区 | 91香蕉视频在线| 国产成人精品一区二区三区网站观看| 亚洲视频一区在线| 国产精品区一区二区三区| 欧美大片国产精品| 欧美精品第1页| 91蝌蚪porny成人天涯| 成人午夜视频福利| 国产电影一区在线| 亚洲品质自拍视频网站| 久久久亚洲精华液精华液精华液| 欧美一区二区女人| 5566中文字幕一区二区电影| 中文字幕一区二区三区四区| 日本一区二区高清| 中文字幕精品一区二区精品绿巨人 | 极品美女销魂一区二区三区免费| 亚洲成精国产精品女| 亚洲成av人片观看| 天堂蜜桃91精品| 亚洲一区自拍偷拍| 亚洲成人免费影院| 午夜精品久久久久影视| 亚洲国产精品久久一线不卡| 综合久久久久久| 亚洲国产精品一区二区久久恐怖片| 午夜久久久久久久久| 亚洲一区二区3| 日本少妇一区二区| 欧美成人女星排名| 国产精品视频一二三区| 国产午夜精品一区二区| ...av二区三区久久精品| 亚洲尤物在线视频观看| 五月激情六月综合| 久久久久久久久久久久久久久99 | 99精品久久免费看蜜臀剧情介绍| 国产91精品在线观看| 成人在线视频首页| 欧美性xxxxxxxx| 日韩欧美成人一区| 国产亚洲一区二区三区在线观看 | 国产又黄又大久久| 91原创在线视频| 亚洲一区二区免费视频| 韩国成人在线视频| 色婷婷久久久久swag精品 | 欧美一级高清片| 成人免费在线播放视频| 久久久久久99久久久精品网站| 亚洲三级在线看| 精品亚洲免费视频| 欧美性大战久久| 亚洲影视资源网| 欧美aaaaaa午夜精品| av欧美精品.com| 欧美日韩高清在线播放| 欧美激情一区二区三区蜜桃视频 | 欧美怡红院视频| 精品成人一区二区三区四区| 91在线观看污| 精品国产电影一区二区| 香蕉乱码成人久久天堂爱免费| 免播放器亚洲一区| 欧美日本一道本| 一区二区三区成人在线视频| 国产精品综合在线视频| 一本到不卡免费一区二区| 国产日韩精品一区二区三区|