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

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

?? clntproc.c

?? Linux中關于遠程文件鎖定的支持的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	switch (req->a_res.status) {		case nlm_granted:			fl->fl_type = F_UNLCK;			break;		case nlm_lck_denied:			/*			 * Report the conflicting lock back to the application.			 */			fl->fl_start = req->a_res.lock.fl.fl_start;			fl->fl_end = req->a_res.lock.fl.fl_end;			fl->fl_type = req->a_res.lock.fl.fl_type;			fl->fl_pid = 0;			break;		default:			status = nlm_stat_to_errno(req->a_res.status);	}out:	nlm_release_call(req);	return status;}static void nlmclnt_locks_copy_lock(struct file_lock *new, struct file_lock *fl){	new->fl_u.nfs_fl.state = fl->fl_u.nfs_fl.state;	new->fl_u.nfs_fl.owner = nlm_get_lockowner(fl->fl_u.nfs_fl.owner);	list_add_tail(&new->fl_u.nfs_fl.list, &fl->fl_u.nfs_fl.owner->host->h_granted);}static void nlmclnt_locks_release_private(struct file_lock *fl){	list_del(&fl->fl_u.nfs_fl.list);	nlm_put_lockowner(fl->fl_u.nfs_fl.owner);}static struct file_lock_operations nlmclnt_lock_ops = {	.fl_copy_lock = nlmclnt_locks_copy_lock,	.fl_release_private = nlmclnt_locks_release_private,};static void nlmclnt_locks_init_private(struct file_lock *fl, struct nlm_host *host){	BUG_ON(fl->fl_ops != NULL);	fl->fl_u.nfs_fl.state = 0;	fl->fl_u.nfs_fl.owner = nlm_find_lockowner(host, fl->fl_owner);	INIT_LIST_HEAD(&fl->fl_u.nfs_fl.list);	fl->fl_ops = &nlmclnt_lock_ops;}static int do_vfs_lock(struct file_lock *fl){	int res = 0;	switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {		case FL_POSIX:			res = posix_lock_file_wait(fl->fl_file, fl);			break;		case FL_FLOCK:			res = flock_lock_file_wait(fl->fl_file, fl);			break;		default:			BUG();	}	return res;}/* * LOCK: Try to create a lock * *			Programmer Harassment Alert * * When given a blocking lock request in a sync RPC call, the HPUX lockd * will faithfully return LCK_BLOCKED but never cares to notify us when * the lock could be granted. This way, our local process could hang * around forever waiting for the callback. * *  Solution A:	Implement busy-waiting *  Solution B: Use the async version of the call (NLM_LOCK_{MSG,RES}) * * For now I am implementing solution A, because I hate the idea of * re-implementing lockd for a third time in two months. The async * calls shouldn't be too hard to do, however. * * This is one of the lovely things about standards in the NFS area: * they're so soft and squishy you can't really blame HP for doing this. */static intnlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl){	struct rpc_cred *cred = nfs_file_cred(fl->fl_file);	struct nlm_host	*host = req->a_host;	struct nlm_res	*resp = &req->a_res;	struct nlm_wait *block = NULL;	unsigned char fl_flags = fl->fl_flags;	unsigned char fl_type;	int status = -ENOLCK;	if (nsm_monitor(host) < 0)		goto out;	fl->fl_flags |= FL_ACCESS;	status = do_vfs_lock(fl);	fl->fl_flags = fl_flags;	if (status < 0)		goto out;	block = nlmclnt_prepare_block(host, fl);again:	/*	 * Initialise resp->status to a valid non-zero value,	 * since 0 == nlm_lck_granted	 */	resp->status = nlm_lck_blocked;	for(;;) {		/* Reboot protection */		fl->fl_u.nfs_fl.state = host->h_state;		status = nlmclnt_call(cred, req, NLMPROC_LOCK);		if (status < 0)			break;		/* Did a reclaimer thread notify us of a server reboot? */		if (resp->status ==  nlm_lck_denied_grace_period)			continue;		if (resp->status != nlm_lck_blocked)			break;		/* Wait on an NLM blocking lock */		status = nlmclnt_block(block, req, NLMCLNT_POLL_TIMEOUT);		if (status < 0)			break;		if (resp->status != nlm_lck_blocked)			break;	}	/* if we were interrupted while blocking, then cancel the lock request	 * and exit	 */	if (resp->status == nlm_lck_blocked) {		if (!req->a_args.block)			goto out_unlock;		if (nlmclnt_cancel(host, req->a_args.block, fl) == 0)			goto out_unblock;	}	if (resp->status == nlm_granted) {		down_read(&host->h_rwsem);		/* Check whether or not the server has rebooted */		if (fl->fl_u.nfs_fl.state != host->h_state) {			up_read(&host->h_rwsem);			goto again;		}		/* Ensure the resulting lock will get added to granted list */		fl->fl_flags |= FL_SLEEP;		if (do_vfs_lock(fl) < 0)			printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__);		up_read(&host->h_rwsem);		fl->fl_flags = fl_flags;		status = 0;	}	if (status < 0)		goto out_unlock;	/*	 * EAGAIN doesn't make sense for sleeping locks, and in some	 * cases NLM_LCK_DENIED is returned for a permanent error.  So	 * turn it into an ENOLCK.	 */	if (resp->status == nlm_lck_denied && (fl_flags & FL_SLEEP))		status = -ENOLCK;	else		status = nlm_stat_to_errno(resp->status);out_unblock:	nlmclnt_finish_block(block);out:	nlm_release_call(req);	return status;out_unlock:	/* Fatal error: ensure that we remove the lock altogether */	dprintk("lockd: lock attempt ended in fatal error.\n"		"       Attempting to unlock.\n");	nlmclnt_finish_block(block);	fl_type = fl->fl_type;	fl->fl_type = F_UNLCK;	down_read(&host->h_rwsem);	do_vfs_lock(fl);	up_read(&host->h_rwsem);	fl->fl_type = fl_type;	fl->fl_flags = fl_flags;	nlmclnt_async_call(cred, req, NLMPROC_UNLOCK, &nlmclnt_unlock_ops);	return status;}/* * RECLAIM: Try to reclaim a lock */intnlmclnt_reclaim(struct nlm_host *host, struct file_lock *fl){	struct nlm_rqst reqst, *req;	int		status;	req = &reqst;	memset(req, 0, sizeof(*req));	locks_init_lock(&req->a_args.lock.fl);	locks_init_lock(&req->a_res.lock.fl);	req->a_host  = host;	req->a_flags = 0;	/* Set up the argument struct */	nlmclnt_setlockargs(req, fl);	req->a_args.reclaim = 1;	status = nlmclnt_call(nfs_file_cred(fl->fl_file), req, NLMPROC_LOCK);	if (status >= 0 && req->a_res.status == nlm_granted)		return 0;	printk(KERN_WARNING "lockd: failed to reclaim lock for pid %d "				"(errno %d, status %d)\n", fl->fl_pid,				status, ntohl(req->a_res.status));	/*	 * FIXME: This is a serious failure. We can	 *	 *  a.	Ignore the problem	 *  b.	Send the owning process some signal (Linux doesn't have	 *	SIGLOST, though...)	 *  c.	Retry the operation	 *	 * Until someone comes up with a simple implementation	 * for b or c, I'll choose option a.	 */	return -ENOLCK;}/* * UNLOCK: remove an existing lock */static intnlmclnt_unlock(struct nlm_rqst *req, struct file_lock *fl){	struct nlm_host	*host = req->a_host;	struct nlm_res	*resp = &req->a_res;	int status;	unsigned char fl_flags = fl->fl_flags;	/*	 * Note: the server is supposed to either grant us the unlock	 * request, or to deny it with NLM_LCK_DENIED_GRACE_PERIOD. In either	 * case, we want to unlock.	 */	fl->fl_flags |= FL_EXISTS;	down_read(&host->h_rwsem);	status = do_vfs_lock(fl);	up_read(&host->h_rwsem);	fl->fl_flags = fl_flags;	if (status == -ENOENT) {		status = 0;		goto out;	}	atomic_inc(&req->a_count);	status = nlmclnt_async_call(nfs_file_cred(fl->fl_file), req,			NLMPROC_UNLOCK, &nlmclnt_unlock_ops);	if (status < 0)		goto out;	if (resp->status == nlm_granted)		goto out;	if (resp->status != nlm_lck_denied_nolocks)		printk("lockd: unexpected unlock status: %d\n", resp->status);	/* What to do now? I'm out of my depth... */	status = -ENOLCK;out:	nlm_release_call(req);	return status;}static void nlmclnt_unlock_callback(struct rpc_task *task, void *data){	struct nlm_rqst	*req = data;	u32 status = ntohl(req->a_res.status);	if (RPC_ASSASSINATED(task))		goto die;	if (task->tk_status < 0) {		dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status);		goto retry_rebind;	}	if (status == NLM_LCK_DENIED_GRACE_PERIOD) {		rpc_delay(task, NLMCLNT_GRACE_WAIT);		goto retry_unlock;	}	if (status != NLM_LCK_GRANTED)		printk(KERN_WARNING "lockd: unexpected unlock status: %d\n", status);die:	return; retry_rebind:	lock_kernel();	nlm_rebind_host(req->a_host);	unlock_kernel(); retry_unlock:	rpc_restart_call(task);}static const struct rpc_call_ops nlmclnt_unlock_ops = {	.rpc_call_done = nlmclnt_unlock_callback,	.rpc_release = nlmclnt_rpc_release,};/* * Cancel a blocked lock request. * We always use an async RPC call for this in order not to hang a * process that has been Ctrl-C'ed. */static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl){	struct nlm_rqst	*req;	int status;	dprintk("lockd: blocking lock attempt was interrupted by a signal.\n"		"       Attempting to cancel lock.\n");	req = nlm_alloc_call(nlm_get_host(host));	if (!req)		return -ENOMEM;	req->a_flags = RPC_TASK_ASYNC;	nlmclnt_setlockargs(req, fl);	req->a_args.block = block;	atomic_inc(&req->a_count);	status = nlmclnt_async_call(nfs_file_cred(fl->fl_file), req,			NLMPROC_CANCEL, &nlmclnt_cancel_ops);	if (status == 0 && req->a_res.status == nlm_lck_denied)		status = -ENOLCK;	nlm_release_call(req);	return status;}static void nlmclnt_cancel_callback(struct rpc_task *task, void *data){	struct nlm_rqst	*req = data;	u32 status = ntohl(req->a_res.status);	if (RPC_ASSASSINATED(task))		goto die;	if (task->tk_status < 0) {		dprintk("lockd: CANCEL call error %d, retrying.\n",					task->tk_status);		goto retry_cancel;	}	dprintk("lockd: cancel status %u (task %u)\n",			status, task->tk_pid);	switch (status) {	case NLM_LCK_GRANTED:	case NLM_LCK_DENIED_GRACE_PERIOD:	case NLM_LCK_DENIED:		/* Everything's good */		break;	case NLM_LCK_DENIED_NOLOCKS:		dprintk("lockd: CANCEL failed (server has no locks)\n");		goto retry_cancel;	default:		printk(KERN_NOTICE "lockd: weird return %d for CANCEL call\n",			status);	}die:	return;retry_cancel:	/* Don't ever retry more than 3 times */	if (req->a_retries++ >= NLMCLNT_MAX_RETRIES)		goto die;	lock_kernel();	nlm_rebind_host(req->a_host);	unlock_kernel();	rpc_restart_call(task);	rpc_delay(task, 30 * HZ);}static const struct rpc_call_ops nlmclnt_cancel_ops = {	.rpc_call_done = nlmclnt_cancel_callback,	.rpc_release = nlmclnt_rpc_release,};/* * Convert an NLM status code to a generic kernel errno */static intnlm_stat_to_errno(__be32 status){	switch(ntohl(status)) {	case NLM_LCK_GRANTED:		return 0;	case NLM_LCK_DENIED:		return -EAGAIN;	case NLM_LCK_DENIED_NOLOCKS:	case NLM_LCK_DENIED_GRACE_PERIOD:		return -ENOLCK;	case NLM_LCK_BLOCKED:		printk(KERN_NOTICE "lockd: unexpected status NLM_BLOCKED\n");		return -ENOLCK;#ifdef CONFIG_LOCKD_V4	case NLM_DEADLCK:		return -EDEADLK;	case NLM_ROFS:		return -EROFS;	case NLM_STALE_FH:		return -ESTALE;	case NLM_FBIG:		return -EOVERFLOW;	case NLM_FAILED:		return -ENOLCK;#endif	}	printk(KERN_NOTICE "lockd: unexpected server status %d\n", status);	return -ENOLCK;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
3751色影院一区二区三区| 国产天堂亚洲国产碰碰| 亚洲一区二区综合| 在线欧美日韩精品| 亚洲午夜免费电影| 欧美日韩在线亚洲一区蜜芽| 亚洲国产日韩a在线播放| 欧美美女直播网站| 久久精品免费观看| 久久久美女毛片| 不卡欧美aaaaa| 一区二区三区视频在线观看| 欧美三级在线视频| 精品一区二区三区免费毛片爱| xf在线a精品一区二区视频网站| 丁香激情综合国产| 亚洲精品老司机| 欧美一区二区三区影视| 国产一二三精品| 亚洲视频每日更新| 91精品国产综合久久精品| 国产一区二区三区四区五区入口| 日本一区二区高清| 欧美性猛交xxxxxx富婆| 老汉av免费一区二区三区| 国产喷白浆一区二区三区| 色婷婷综合久色| 蜜臀av性久久久久av蜜臀妖精| 国产日韩精品一区二区三区| 在线观看91精品国产入口| 麻豆精品精品国产自在97香蕉 | 在线一区二区视频| 日本欧美一区二区三区| 国产亚洲综合性久久久影院| 色婷婷亚洲精品| 精品一区二区三区av| 亚洲人成在线观看一区二区| 在线播放中文字幕一区| 91日韩精品一区| 久久精品国产秦先生| ㊣最新国产の精品bt伙计久久| 欧美日韩国产bt| 成人黄色国产精品网站大全在线免费观看 | 久久国产视频网| 亚洲卡通欧美制服中文| 久久亚洲精品国产精品紫薇| 欧美性大战久久久久久久蜜臀| 国产露脸91国语对白| 亚洲综合色自拍一区| 国产精品理伦片| 欧美成人乱码一区二区三区| 欧美自拍偷拍一区| 国产成人精品免费在线| 日本不卡一区二区三区高清视频| 亚洲视频在线观看三级| 久久免费视频色| 欧美一区二区三区播放老司机| 大桥未久av一区二区三区中文| 亚洲国产一区二区三区| 精品国产乱码久久久久久久| 色嗨嗨av一区二区三区| 中文字幕一区二区三区在线观看| 精品国产免费一区二区三区香蕉| av成人动漫在线观看| 老司机精品视频线观看86| 一区免费观看视频| 精品久久国产字幕高潮| 在线亚洲一区二区| 豆国产96在线|亚洲| 日韩av在线播放中文字幕| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧亚一区二区三区| 国产99久久久国产精品潘金 | 色综合久久天天| 激情六月婷婷综合| 午夜欧美大尺度福利影院在线看| 亚洲国产精品99久久久久久久久| 欧美区在线观看| 色呦呦国产精品| 丁香婷婷综合五月| 国产真实乱子伦精品视频| 丝袜脚交一区二区| 亚洲图片欧美视频| 亚洲三级电影全部在线观看高清| 欧美日韩在线直播| 97se亚洲国产综合自在线观| 波多野结衣的一区二区三区| 国产精品一级在线| 久久精品国产秦先生| 视频一区二区欧美| 亚洲成av人**亚洲成av**| ...av二区三区久久精品| 国产精品污www在线观看| 欧美电影免费观看完整版| 欧美高清性hdvideosex| av在线一区二区三区| 99国产精品久久久久| 成人动漫一区二区三区| 国产成人久久精品77777最新版本| 免费国产亚洲视频| 蜜桃一区二区三区四区| 麻豆久久久久久| 美脚の诱脚舐め脚责91| 美女一区二区三区在线观看| 日本亚洲三级在线| 亚洲成人激情自拍| 午夜精品一区二区三区电影天堂| 亚洲国产aⅴ成人精品无吗| 亚洲综合色视频| 亚洲图片自拍偷拍| 亚洲另类在线制服丝袜| 亚洲一区欧美一区| 午夜精彩视频在线观看不卡| 天堂va蜜桃一区二区三区漫画版| 日av在线不卡| 国产在线精品一区在线观看麻豆| 国产精品一二一区| 国产一区亚洲一区| 国产精品羞羞答答xxdd| 懂色av一区二区三区免费观看| 国产精品2024| 9人人澡人人爽人人精品| 91黄视频在线观看| 91精品国产91综合久久蜜臀| 精品三级av在线| 欧美极品aⅴ影院| 亚洲午夜在线视频| 国产精品白丝jk黑袜喷水| www.欧美精品一二区| 欧美影院精品一区| 欧美zozozo| 中文字幕在线观看一区二区| 日本女优在线视频一区二区| 国产伦理精品不卡| 在线观看日韩电影| 精品精品国产高清一毛片一天堂| 欧美国产精品一区二区| 国产精品77777| 成人黄色777网| 91精品国产欧美一区二区| 中文字幕综合网| 久久精品国产第一区二区三区| 成人免费视频一区| 911精品产国品一二三产区| 欧美激情综合五月色丁香小说| 亚洲成人7777| 成人中文字幕在线| 精品卡一卡二卡三卡四在线| 亚洲精品高清在线观看| 精品一区二区三区欧美| 99精品欧美一区| 久久综合久久久久88| 亚洲精品欧美综合四区| 成人激情视频网站| 日韩视频免费观看高清完整版| 国产精品久久久久毛片软件| 免费人成精品欧美精品| 色综合激情五月| 欧美精彩视频一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 一本色道久久加勒比精品| 国产亚洲美州欧州综合国| 丝袜美腿亚洲一区| 在线影视一区二区三区| 国产欧美日韩久久| 久久黄色级2电影| 欧美三级在线播放| 精品国产免费人成电影在线观看四季| 日韩成人精品在线观看| 色播五月激情综合网| 国产精品网友自拍| 国内精品伊人久久久久av影院| 91麻豆精品国产自产在线观看一区 | 奇米在线7777在线精品| 色999日韩国产欧美一区二区| 国产日韩欧美不卡在线| 成人a免费在线看| 久久精品欧美一区二区三区不卡| 麻豆91小视频| 欧美一区二区在线免费播放| 亚洲一二三四区不卡| 91丨porny丨最新| 欧美mv和日韩mv国产网站| 狠狠网亚洲精品| 26uuu亚洲综合色| 另类小说视频一区二区| 日韩精品中午字幕| 麻豆精品在线观看| 欧美一区二区视频在线观看2022 | 亚洲国产精品黑人久久久| 韩国三级在线一区| 精品sm捆绑视频| 日韩国产一区二| 国产日韩三级在线| 不卡电影免费在线播放一区| 国产精品久久毛片av大全日韩| 成人免费视频网站在线观看| 国产精品情趣视频| 99久久综合色| 久久久国产精品麻豆|