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

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

?? xfs_dquot_item.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it would be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like.	 Any license provided herein, whether implied or * otherwise, applies only to this software file.  Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * You should have received a copy of the GNU General Public License along * with this program; if not, write the Free Software Foundation, Inc., 59 * Temple Place - Suite 330, Boston MA 02111-1307, USA. * * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, * Mountain View, CA  94043, or: * * http://www.sgi.com * * For further information regarding this notice, see: * * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ */#include "xfs.h"#include "xfs_fs.h"#include "xfs_inum.h"#include "xfs_log.h"#include "xfs_trans.h"#include "xfs_sb.h"#include "xfs_ag.h"#include "xfs_dir.h"#include "xfs_dir2.h"#include "xfs_alloc.h"#include "xfs_dmapi.h"#include "xfs_quota.h"#include "xfs_mount.h"#include "xfs_alloc_btree.h"#include "xfs_bmap_btree.h"#include "xfs_ialloc_btree.h"#include "xfs_btree.h"#include "xfs_ialloc.h"#include "xfs_attr_sf.h"#include "xfs_dir_sf.h"#include "xfs_dir2_sf.h"#include "xfs_dinode.h"#include "xfs_inode.h"#include "xfs_bmap.h"#include "xfs_bit.h"#include "xfs_rtalloc.h"#include "xfs_error.h"#include "xfs_itable.h"#include "xfs_rw.h"#include "xfs_acl.h"#include "xfs_cap.h"#include "xfs_mac.h"#include "xfs_attr.h"#include "xfs_buf_item.h"#include "xfs_trans_priv.h"#include "xfs_qm.h"/* * returns the number of iovecs needed to log the given dquot item. *//* ARGSUSED */STATIC uintxfs_qm_dquot_logitem_size(	xfs_dq_logitem_t	*logitem){	/*	 * we need only two iovecs, one for the format, one for the real thing	 */	return (2);}/* * fills in the vector of log iovecs for the given dquot log item. */STATIC voidxfs_qm_dquot_logitem_format(	xfs_dq_logitem_t	*logitem,	xfs_log_iovec_t		*logvec){	ASSERT(logitem);	ASSERT(logitem->qli_dquot);	logvec->i_addr = (xfs_caddr_t)&logitem->qli_format;	logvec->i_len  = sizeof(xfs_dq_logformat_t);	logvec++;	logvec->i_addr = (xfs_caddr_t)&logitem->qli_dquot->q_core;	logvec->i_len  = sizeof(xfs_disk_dquot_t);	ASSERT(2 == logitem->qli_item.li_desc->lid_size);	logitem->qli_format.qlf_size = 2;}/* * Increment the pin count of the given dquot. * This value is protected by pinlock spinlock in the xQM structure. */STATIC voidxfs_qm_dquot_logitem_pin(	xfs_dq_logitem_t *logitem){	unsigned long	s;	xfs_dquot_t *dqp;	dqp = logitem->qli_dquot;	ASSERT(XFS_DQ_IS_LOCKED(dqp));	s = XFS_DQ_PINLOCK(dqp);	dqp->q_pincount++;	XFS_DQ_PINUNLOCK(dqp, s);}/* * Decrement the pin count of the given dquot, and wake up * anyone in xfs_dqwait_unpin() if the count goes to 0.	 The * dquot must have been previously pinned with a call to xfs_dqpin(). *//* ARGSUSED */STATIC voidxfs_qm_dquot_logitem_unpin(	xfs_dq_logitem_t *logitem,	int		  stale){	unsigned long	s;	xfs_dquot_t *dqp;	dqp = logitem->qli_dquot;	ASSERT(dqp->q_pincount > 0);	s = XFS_DQ_PINLOCK(dqp);	dqp->q_pincount--;	if (dqp->q_pincount == 0) {		sv_broadcast(&dqp->q_pinwait);	}	XFS_DQ_PINUNLOCK(dqp, s);}/* ARGSUSED */STATIC voidxfs_qm_dquot_logitem_unpin_remove(	xfs_dq_logitem_t *logitem,	xfs_trans_t	 *tp){	xfs_qm_dquot_logitem_unpin(logitem, 0);}/* * Given the logitem, this writes the corresponding dquot entry to disk * asynchronously. This is called with the dquot entry securely locked; * we simply get xfs_qm_dqflush() to do the work, and unlock the dquot * at the end. */STATIC voidxfs_qm_dquot_logitem_push(	xfs_dq_logitem_t	*logitem){	xfs_dquot_t	*dqp;	dqp = logitem->qli_dquot;	ASSERT(XFS_DQ_IS_LOCKED(dqp));	ASSERT(XFS_DQ_IS_FLUSH_LOCKED(dqp));	/*	 * Since we were able to lock the dquot's flush lock and	 * we found it on the AIL, the dquot must be dirty.  This	 * is because the dquot is removed from the AIL while still	 * holding the flush lock in xfs_dqflush_done().  Thus, if	 * we found it in the AIL and were able to obtain the flush	 * lock without sleeping, then there must not have been	 * anyone in the process of flushing the dquot.	 */	xfs_qm_dqflush(dqp, XFS_B_DELWRI);	xfs_dqunlock(dqp);}/*ARGSUSED*/STATIC xfs_lsn_txfs_qm_dquot_logitem_committed(	xfs_dq_logitem_t	*l,	xfs_lsn_t		lsn){	/*	 * We always re-log the entire dquot when it becomes dirty,	 * so, the latest copy _is_ the only one that matters.	 */	return (lsn);}/* * This is called to wait for the given dquot to be unpinned. * Most of these pin/unpin routines are plagiarized from inode code. */voidxfs_qm_dqunpin_wait(	xfs_dquot_t	*dqp){	SPLDECL(s);	ASSERT(XFS_DQ_IS_LOCKED(dqp));	if (dqp->q_pincount == 0) {		return;	}	/*	 * Give the log a push so we don't wait here too long.	 */	xfs_log_force(dqp->q_mount, (xfs_lsn_t)0, XFS_LOG_FORCE);	s = XFS_DQ_PINLOCK(dqp);	if (dqp->q_pincount == 0) {		XFS_DQ_PINUNLOCK(dqp, s);		return;	}	sv_wait(&(dqp->q_pinwait), PINOD,		&(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s);}/* * This is called when IOP_TRYLOCK returns XFS_ITEM_PUSHBUF to indicate that * the dquot is locked by us, but the flush lock isn't. So, here we are * going to see if the relevant dquot buffer is incore, waiting on DELWRI. * If so, we want to push it out to help us take this item off the AIL as soon * as possible. * * We must not be holding the AIL_LOCK at this point. Calling incore() to * search the buffercache can be a time consuming thing, and AIL_LOCK is a * spinlock. */STATIC voidxfs_qm_dquot_logitem_pushbuf(	xfs_dq_logitem_t    *qip){	xfs_dquot_t	*dqp;	xfs_mount_t	*mp;	xfs_buf_t	*bp;	uint		dopush;	dqp = qip->qli_dquot;	ASSERT(XFS_DQ_IS_LOCKED(dqp));	/*	 * The qli_pushbuf_flag keeps others from	 * trying to duplicate our effort.	 */	ASSERT(qip->qli_pushbuf_flag != 0);	ASSERT(qip->qli_push_owner == get_thread_id());	/*	 * If flushlock isn't locked anymore, chances are that the	 * inode flush completed and the inode was taken off the AIL.	 * So, just get out.	 */	if ((valusema(&(dqp->q_flock)) > 0)  ||	    ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) {		qip->qli_pushbuf_flag = 0;		xfs_dqunlock(dqp);		return;	}	mp = dqp->q_mount;	bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno,		    XFS_QI_DQCHUNKLEN(mp),		    XFS_INCORE_TRYLOCK);	if (bp != NULL) {		if (XFS_BUF_ISDELAYWRITE(bp)) {			dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) &&				  (valusema(&(dqp->q_flock)) <= 0));			qip->qli_pushbuf_flag = 0;			xfs_dqunlock(dqp);			if (XFS_BUF_ISPINNED(bp)) {				xfs_log_force(mp, (xfs_lsn_t)0,					      XFS_LOG_FORCE);			}			if (dopush) {#ifdef XFSRACEDEBUG				delay_for_intr();				delay(300);#endif				xfs_bawrite(mp, bp);			} else {				xfs_buf_relse(bp);			}		} else {			qip->qli_pushbuf_flag = 0;			xfs_dqunlock(dqp);			xfs_buf_relse(bp);		}		return;	}	qip->qli_pushbuf_flag = 0;	xfs_dqunlock(dqp);}/* * This is called to attempt to lock the dquot associated with this * dquot log item.  Don't sleep on the dquot lock or the flush lock. * If the flush lock is already held, indicating that the dquot has * been or is in the process of being flushed, then see if we can * find the dquot's buffer in the buffer cache without sleeping.  If * we can and it is marked delayed write, then we want to send it out. * We delay doing so until the push routine, though, to avoid sleeping * in any device strategy routines. */STATIC uintxfs_qm_dquot_logitem_trylock(	xfs_dq_logitem_t	*qip){	xfs_dquot_t		*dqp;	uint			retval;	dqp = qip->qli_dquot;	if (dqp->q_pincount > 0)		return (XFS_ITEM_PINNED);	if (! xfs_qm_dqlock_nowait(dqp))		return (XFS_ITEM_LOCKED);	retval = XFS_ITEM_SUCCESS;	if (! xfs_qm_dqflock_nowait(dqp)) {		/*		 * The dquot is already being flushed.	It may have been		 * flushed delayed write, however, and we don't want to		 * get stuck waiting for that to complete.  So, we want to check		 * to see if we can lock the dquot's buffer without sleeping.		 * If we can and it is marked for delayed write, then we		 * hold it and send it out from the push routine.  We don't		 * want to do that now since we might sleep in the device		 * strategy routine.  We also don't want to grab the buffer lock		 * here because we'd like not to call into the buffer cache		 * while holding the AIL_LOCK.		 * Make sure to only return PUSHBUF if we set pushbuf_flag		 * ourselves.  If someone else is doing it then we don't		 * want to go to the push routine and duplicate their efforts.		 */		if (qip->qli_pushbuf_flag == 0) {			qip->qli_pushbuf_flag = 1;			ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno);#ifdef DEBUG			qip->qli_push_owner = get_thread_id();#endif			/*			 * The dquot is left locked.			 */			retval = XFS_ITEM_PUSHBUF;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美另类综合偷拍| 99在线精品免费| 国产91在线观看| 欧美精品日韩一本| 中文字幕一区在线观看视频| 日本美女视频一区二区| 91色在线porny| 国产日本亚洲高清| 精品一区二区免费| 欧美一二区视频| 天天综合天天综合色| 91久久国产最好的精华液| 国产亚洲婷婷免费| 精品一区免费av| 欧美一区二区视频在线观看| 亚洲一区二区三区四区五区黄 | 日韩午夜电影在线观看| 日韩理论片一区二区| 粉嫩高潮美女一区二区三区| 2020国产成人综合网| 日韩在线一区二区| 欧美日韩亚洲综合一区| 亚洲精品中文字幕乱码三区| 成人精品小蝌蚪| 日本一区二区免费在线| 国产精品99久久久久久久女警| 欧美成人精品高清在线播放| 日韩av电影天堂| 日韩午夜在线观看视频| 久久国产精品区| 日韩欧美国产不卡| 精品亚洲国产成人av制服丝袜| 日韩欧美一区电影| 国产一区日韩二区欧美三区| 欧美v亚洲v综合ⅴ国产v| 狠狠色狠狠色综合日日91app| 亚洲精品一区二区三区在线观看| 麻豆精品国产传媒mv男同| 欧美成人官网二区| 国产精品一区二区不卡| 欧美激情一区二区三区四区| 国产成人亚洲综合a∨婷婷| 国产精品午夜在线观看| www.一区二区| 亚洲在线视频网站| 欧美一区二区三区四区久久| 久久99国产乱子伦精品免费| 久久久av毛片精品| av一本久道久久综合久久鬼色| 国产精品你懂的在线欣赏| 一本一道综合狠狠老| 亚洲成av人片在线观看| 欧美r级在线观看| 国产黑丝在线一区二区三区| 亚洲私人黄色宅男| 日韩午夜在线播放| 不卡影院免费观看| 午夜在线成人av| 久久久不卡影院| 欧美性三三影院| 国产精品夜夜爽| 亚洲综合色视频| 久久先锋影音av鲁色资源| 91小视频在线观看| 久久精品99久久久| 国产精品不卡在线| 欧美一级视频精品观看| 成人国产精品免费| 免费视频最近日韩| 亚洲天堂精品视频| 久久久久久一级片| 欧美日韩一区二区三区免费看| 韩日av一区二区| 亚洲国产精品天堂| 中文字幕欧美三区| 日韩免费看的电影| 在线精品视频小说1| 国产一区二区视频在线播放| 亚洲一区二区三区三| 欧美国产精品专区| 欧美不卡一区二区三区| 色噜噜夜夜夜综合网| 国产精品18久久久久久久久久久久 | 日韩伦理免费电影| 久久久久久久网| 欧美日本一区二区| 一本到一区二区三区| 国产一级精品在线| 日本系列欧美系列| 亚洲一区二区三区中文字幕在线| 国产亚洲精品超碰| 欧美成人在线直播| 7777精品伊人久久久大香线蕉的 | 一区二区在线电影| 日本一二三四高清不卡| 日韩欧美高清dvd碟片| 欧美日韩视频在线第一区| 91在线观看成人| 国产v日产∨综合v精品视频| 免费观看一级欧美片| 亚洲成av人综合在线观看| 亚洲激情自拍视频| 亚洲六月丁香色婷婷综合久久| 国产欧美日韩不卡| 国产精品污网站| 亚洲国产高清在线| 国产日韩av一区二区| 久久九九久久九九| 国产午夜精品理论片a级大结局 | 亚洲精品欧美激情| 亚洲色图另类专区| 亚洲欧洲美洲综合色网| 日本一区二区久久| 国产精品乱人伦| 国产蜜臀97一区二区三区| 国产精品水嫩水嫩| 国产精品大尺度| 亚洲精品自拍动漫在线| 亚洲综合男人的天堂| 亚洲第一搞黄网站| 日韩在线卡一卡二| 精品亚洲aⅴ乱码一区二区三区| 精品一区免费av| 国产成人精品午夜视频免费| 成人在线一区二区三区| 91在线高清观看| 欧美日韩在线播放一区| 欧美丰满高潮xxxx喷水动漫| 91麻豆精品国产91久久久使用方法 | av日韩在线网站| 91行情网站电视在线观看高清版| 在线亚洲精品福利网址导航| 欧美日本不卡视频| 26uuu成人网一区二区三区| 日本一二三不卡| 亚洲一区二区成人在线观看| 日韩高清一区在线| 国产成人在线电影| 91国模大尺度私拍在线视频| 日韩一区二区在线看| 欧美激情综合五月色丁香小说| 亚洲日本青草视频在线怡红院| 亚洲成人资源网| 国产精品一区二区免费不卡 | 2023国产精品视频| 亚洲嫩草精品久久| 蜜桃91丨九色丨蝌蚪91桃色| 国产一区视频导航| 欧美日韩视频专区在线播放| 精品久久人人做人人爱| 一区二区三区四区乱视频| 麻豆精品在线播放| 91在线porny国产在线看| 欧美猛男男办公室激情| 国产精品萝li| 美女mm1313爽爽久久久蜜臀| 91在线精品一区二区三区| 日韩欧美黄色影院| 亚洲综合色噜噜狠狠| 国产成人免费视频网站| 欧美日韩国产高清一区二区三区| 欧美国产日韩精品免费观看| 蜜桃视频在线观看一区| 91在线观看地址| 久久久一区二区三区| 日韩av二区在线播放| 日本韩国欧美一区二区三区| 久久久久久久综合| 麻豆视频观看网址久久| 欧美男女性生活在线直播观看| 国产精品不卡一区二区三区| 国产真实精品久久二三区| 欧美日精品一区视频| 综合色中文字幕| 成人av免费观看| 国产日韩欧美亚洲| 极品少妇一区二区三区精品视频| 91福利在线免费观看| 成人免费在线视频观看| 国产寡妇亲子伦一区二区| 精品国产91乱码一区二区三区| 日韩国产欧美一区二区三区| 日本黄色一区二区| 亚洲精品高清在线| 色悠悠亚洲一区二区| 国产精品高清亚洲| 成人激情小说网站| 国产亚洲欧美在线| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美吞精做爰啪啪高潮| 亚洲日本乱码在线观看| 99久久婷婷国产精品综合| 国产精品私人自拍| 成人sese在线| 最新久久zyz资源站| 99久久久精品免费观看国产蜜| 国产精品不卡在线观看| 99re66热这里只有精品3直播| 中文字幕中文字幕一区二区| 成人理论电影网|