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

📄 ext3-extents-multiblock-directio-2.6.5-suse.patch

📁 非常经典的一个分布式系统
💻 PATCH
字号:
Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h===================================================================--- linux-2.6.5-7.283-full.orig/include/linux/ext3_fs.h	2007-03-28 02:13:37.000000000 +0400+++ linux-2.6.5-7.283-full/include/linux/ext3_fs.h	2007-03-28 02:21:37.000000000 +0400@@ -815,7 +815,7 @@ extern struct inode_operations ext3_fast  /* extents.c */ extern int ext3_ext_writepage_trans_blocks(struct inode *, int);-extern int ext3_ext_get_block(handle_t *, struct inode *, long,+extern int ext3_ext_get_block(handle_t *, struct inode *, long, int, 			      struct buffer_head *, int, int); extern void ext3_ext_truncate(struct inode *, struct page *); extern void ext3_ext_init(struct super_block *);Index: linux-2.6.5-7.283-full/fs/ext3/extents.c===================================================================--- linux-2.6.5-7.283-full.orig/fs/ext3/extents.c	2007-03-28 02:14:25.000000000 +0400+++ linux-2.6.5-7.283-full/fs/ext3/extents.c	2007-03-28 02:21:37.000000000 +0400@@ -2024,7 +2024,8 @@ void ext3_init_tree_desc(struct ext3_ext }  int ext3_ext_get_block(handle_t *handle, struct inode *inode,-		       long iblock, struct buffer_head *bh_result,+		       long iblock, int max_blocks, +		       struct buffer_head *bh_result, 		       int create, int extend_disksize) { 	struct ext3_ext_path *path = NULL;@@ -2032,6 +2033,11 @@ int ext3_ext_get_block(handle_t *handle, 	struct ext3_extent *ex; 	int goal, newblock, err = 0, depth; 	struct ext3_extents_tree tree;+	unsigned long next;+	int allocated = 0;++	/* until we have multiblock allocation */+	max_blocks = 1;  	__clear_bit(BH_New, &bh_result->b_state); 	ext3_init_tree_desc(&tree, inode);@@ -2051,6 +2057,9 @@ int ext3_ext_get_block(handle_t *handle, 		} else if (goal == EXT3_EXT_CACHE_EXTENT) { 			/* block is already allocated */ 			newblock = iblock - newex.ee_block + newex.ee_start;+			/* number of remaining blocks in the extent */+			EXT_ASSERT(iblock >= newex.ee_block);+			allocated = newex.ee_len - (iblock - newex.ee_block); 			goto out; 		} else { 			EXT_ASSERT(0);@@ -2078,6 +2087,8 @@ int ext3_ext_get_block(handle_t *handle, 		/* if found exent covers block, simple return it */ 		if (iblock >= ex->ee_block && iblock < ex->ee_block + ex->ee_len) { 			newblock = iblock - ex->ee_block + ex->ee_start;+			/* number of remaining blocks in the extent */+			allocated = ex->ee_len - (iblock - ex->ee_block); 			ext_debug(&tree, "%d fit into %d:%d -> %d\n", 				  (int) iblock, ex->ee_block, ex->ee_len, 				  newblock);@@ -2098,6 +2109,15 @@ int ext3_ext_get_block(handle_t *handle, 		goto out2; 	} +	/* find next allocated block so that we know how many+	 * blocks we can allocate without ovelapping next extent */+	EXT_ASSERT(iblock >= ex->ee_block + ex->ee_len);+	next = ext3_ext_next_allocated_block(path);+	EXT_ASSERT(next > iblock);+	allocated = next - iblock;+	if (allocated > max_blocks)+		allocated = max_blocks;+ 	/* allocate new block */ 	goal = ext3_ext_find_goal(inode, path, iblock); 	newblock = ext3_new_block(handle, inode, goal, &err);@@ -2112,8 +2132,11 @@ int ext3_ext_get_block(handle_t *handle, 	newex.ee_start_hi = 0; 	newex.ee_len = 1; 	err = ext3_ext_insert_extent(handle, &tree, path, &newex);-	if (err)+	if (err) {+		/* free data blocks we just allocated */+		ext3_free_blocks(handle, inode, newex.ee_start, newex.ee_len); 		goto out2;+	} 	 	if (extend_disksize && inode->i_size > EXT3_I(inode)->i_disksize) 		EXT3_I(inode)->i_disksize = inode->i_size;@@ -2125,10 +2148,13 @@ int ext3_ext_get_block(handle_t *handle, 	ext3_ext_put_in_cache(&tree, newex.ee_block, newex.ee_len, 			      newex.ee_start, EXT3_EXT_CACHE_EXTENT); out:+	if (allocated > max_blocks)+		allocated = max_blocks; 	ext3_ext_show_leaf(&tree, path); 	__set_bit(BH_Mapped, &bh_result->b_state); 	bh_result->b_bdev = inode->i_sb->s_bdev; 	bh_result->b_blocknr = newblock;+	bh_result->b_size = (allocated << inode->i_blkbits); out2: 	if (path) { 		ext3_ext_drop_refs(path);Index: linux-2.6.5-7.283-full/fs/ext3/inode.c===================================================================--- linux-2.6.5-7.283-full.orig/fs/ext3/inode.c	2007-03-28 02:13:37.000000000 +0400+++ linux-2.6.5-7.283-full/fs/ext3/inode.c	2007-03-28 02:50:19.000000000 +0400@@ -800,13 +800,17 @@ changed:  static inline int ext3_get_block_wrap(handle_t *handle, struct inode *inode, long block,-		    struct buffer_head *bh, int create, int extend_disksize)+			int max_blocks, struct buffer_head *bh, int create,+			int extend_disksize) {+	int ret; 	if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL)-		return ext3_ext_get_block(handle, inode, block, bh, create,-					  extend_disksize);-	return ext3_get_block_handle(handle, inode, block, bh, create,+		return ext3_ext_get_block(handle, inode, block, max_blocks,+					bh, create, extend_disksize);+	ret = ext3_get_block_handle(handle, inode, block, bh, create, 				     extend_disksize);+	bh->b_size = (1 << inode->i_blkbits);+	return ret; }  static int ext3_get_block(struct inode *inode, sector_t iblock,@@ -819,7 +823,7 @@ static int ext3_get_block(struct inode * 		handle = ext3_journal_current_handle(); 		J_ASSERT(handle != 0); 	}-	ret = ext3_get_block_wrap(handle, inode, iblock,+	ret = ext3_get_block_wrap(handle, inode, iblock, 1, 				  bh_result, create, 1); 	return ret; }@@ -847,10 +851,8 @@ ext3_direct_io_get_blocks(struct inode * 		} 	} 	if (ret == 0)-		ret = ext3_get_block_wrap(handle, inode, iblock,+		ret = ext3_get_block_wrap(handle, inode, iblock, max_blocks, 					  bh_result, create, 0);-	if (ret == 0)-		bh_result->b_size = (1 << inode->i_blkbits); 	return ret; } @@ -869,7 +871,7 @@ struct buffer_head *ext3_getblk(handle_t 	dummy.b_state = 0; 	dummy.b_blocknr = -1000; 	buffer_trace_init(&dummy.b_history);-	*errp = ext3_get_block_wrap(handle, inode, block, &dummy, create, 1);+	*errp = ext3_get_block_wrap(handle, inode, block, 1, &dummy, create, 1); 	if (!*errp && buffer_mapped(&dummy)) { 		struct buffer_head *bh; 		bh = sb_getblk(inode->i_sb, dummy.b_blocknr);

⌨️ 快捷键说明

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