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

📄 compat_sync_mapping_range.c

📁 ocfs1.4.1 oracle分布式文件系统
💻 C
字号:
/* * compat_sync_mapping_range.c * * This code has been copied from mainline linux kernel git commit * e7b34019606ab1dd06196635e931b0c302799228 to allow ocfs2 to build * against older kernels. For license, refer to fs/sync.c in mainline * linux kernel. * */#include <linux/fs.h>#include <linux/types.h>#include <linux/slab.h>#include <linux/highmem.h>#include <linux/swap.h>#include <linux/writeback.h>#include <linux/mpage.h>#include <linux/pagemap.h>#include <linux/pagevec.h>#include <linux/backing-dev.h>/** * wait_on_page_writeback_range - wait for writeback to complete * @mapping:	target address_space * @start:	beginning page index * @end:	ending page index * * Wait for writeback to complete against pages indexed by start->end * inclusive */int wait_on_page_writeback_range(struct address_space *mapping,				pgoff_t start, pgoff_t end){	struct pagevec pvec;	int nr_pages;	int ret = 0;	pgoff_t index;	if (end < start)		return 0;	pagevec_init(&pvec, 0);	index = start;	while ((index <= end) &&			(nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,			PAGECACHE_TAG_WRITEBACK,			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1)) != 0) {		unsigned i;		for (i = 0; i < nr_pages; i++) {			struct page *page = pvec.pages[i];			/* until radix tree lookup accepts end_index */			if (page->index > end)				continue;			wait_on_page_writeback(page);			if (PageError(page))				ret = -EIO;		}		pagevec_release(&pvec);		cond_resched();	}	/* Check for outstanding write errors */	if (test_and_clear_bit(AS_ENOSPC, &mapping->flags))		ret = -ENOSPC;	if (test_and_clear_bit(AS_EIO, &mapping->flags))		ret = -EIO;	return ret;}int do_writepages(struct address_space *mapping, struct writeback_control *wbc){	int ret;	if (wbc->nr_to_write <= 0)		return 0;	wbc->for_writepages = 1;	if (mapping->a_ops->writepages)		ret = mapping->a_ops->writepages(mapping, wbc);	else		ret = generic_writepages(mapping, wbc);	wbc->for_writepages = 0;	return ret;}/** * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range * @mapping:	address space structure to write * @start:	offset in bytes where the range starts * @end:	offset in bytes where the range ends (inclusive) * @sync_mode:	enable synchronous operation * * Start writeback against all of a mapping's dirty pages that lie * within the byte offsets <start, end> inclusive. * * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as * opposed to a regular memory cleansing writeback.  The difference between * these two operations is that if a dirty page/buffer is encountered, it must * be waited upon, and not just skipped over. */int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,				loff_t end, int sync_mode){	int ret;	struct writeback_control wbc = {		.sync_mode = sync_mode,		.nr_to_write = mapping->nrpages * 2,		.range_start = start,		.range_end = end,	};	if (!mapping_cap_writeback_dirty(mapping))		return 0;	ret = do_writepages(mapping, &wbc);	return ret;}/* * `endbyte' is inclusive */int do_sync_mapping_range(struct address_space *mapping, loff_t offset,			  loff_t endbyte, unsigned int flags){	int ret;	if (!mapping) {		ret = -EINVAL;		goto out;	}	ret = 0;	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {		ret = wait_on_page_writeback_range(mapping,					offset >> PAGE_CACHE_SHIFT,					endbyte >> PAGE_CACHE_SHIFT);		if (ret < 0)			goto out;	}	if (flags & SYNC_FILE_RANGE_WRITE) {		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,						WB_SYNC_NONE);		if (ret < 0)			goto out;	}	if (flags & SYNC_FILE_RANGE_WAIT_AFTER) {		ret = wait_on_page_writeback_range(mapping,					offset >> PAGE_CACHE_SHIFT,					endbyte >> PAGE_CACHE_SHIFT);	}out:	return ret;}

⌨️ 快捷键说明

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