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

📄 fsync.c

📁 这是Linux系统下的对UDF文件系统新增的功能
💻 C
字号:
/* * fsync.c * * PURPOSE *  Fsync handling routines for the OSTA-UDF(tm) filesystem. * * CONTACTS *  E-mail regarding any portion of the Linux UDF file system should be *  directed to the development team mailing list (run by majordomo): *      linux_udf@hpesjro.fc.hp.com * * COPYRIGHT *  This file is distributed under the terms of the GNU General Public *  License (GPL). Copies of the GPL can be obtained from: *      ftp://prep.ai.mit.edu/pub/gnu/GPL *  Each contributing author retains all rights to their own work. * *  (C) 1999-2001 Ben Fennema *  (C) 1999-2000 Stelias Computing Inc * * HISTORY * *  05/22/99 blf  Created. */#include "udfdecl.h"#include <linux/fs.h>#include <linux/udf_fs.h>#include "udf_i.h"static int sync_block (struct inode * inode, uint32_t * block, int wait){	struct buffer_head * bh;		if (!*block)		return 0;	bh = get_hash_table (inode->i_dev, *block, inode->i_sb->s_blocksize);	if (!bh)		return 0;	if (wait && buffer_req(bh) && !buffer_uptodate(bh)) {		brelse (bh);		return -1;	}	if (wait || !buffer_uptodate(bh) || !buffer_dirty(bh)) {		brelse (bh);		return 0;	}	ll_rw_block (WRITE, 1, &bh);	bh->b_count--;	return 0;}static int sync_extent (struct inode * inode, lb_addr *loc, uint32_t *len, int wait){	uint32_t i, block;	int rc, err = 0;	for (i = 0; i < *len; i++)	{		block = udf_get_lb_pblock(inode->i_sb, *loc, i);		rc = sync_block (inode, &block, wait);		if (rc)			err = rc;	}	return err;}static int sync_all_extents(struct inode * inode, int wait){	lb_addr bloc, eloc;	uint32_t extoffset, elen, offset;	int err = 0, etype;	struct buffer_head *bh = NULL;		if ((etype = inode_bmap(inode, 0, &bloc, &extoffset, &eloc, &elen, &offset, &bh)) != -1)	{		err |= sync_extent(inode, &eloc, &elen, wait);		while ((etype = udf_next_aext(inode, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1)		{			if (etype == (EXT_RECORDED_ALLOCATED >> 30))				err |= sync_extent(inode, &eloc, &elen, wait);		}	}	udf_release_data(bh);	return err;}/* *	File may be NULL when we are called. Perhaps we shouldn't *	even pass file to fsync ? */int udf_sync_file(struct file * file, struct dentry *dentry){	int wait, err = 0;	struct inode *inode = dentry->d_inode;	if (S_ISLNK(inode->i_mode) && !(inode->i_blocks))	{		/*		 * Don't sync fast links! or ICB_FLAG_AD_IN_ICB		 */		goto skip;	}	for (wait=0; wait<=1; wait++)	{		err |= sync_all_extents (inode, wait);	}skip:	err |= udf_sync_inode (inode);	return err ? -EIO : 0;}

⌨️ 快捷键说明

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