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

📄 ext3-nlinks-2.6.9.patch

📁 非常经典的一个分布式系统
💻 PATCH
字号:
Index: linux-2.6.12/fs/ext3/namei.c===================================================================--- linux-2.6.12.orig/fs/ext3/namei.c+++ linux-2.6.12/fs/ext3/namei.c@@ -1600,11 +1600,17 @@ static int ext3_delete_entry (handle_t * static inline void ext3_inc_count(handle_t *handle, struct inode *inode) { 	inode->i_nlink++;+	if (is_dx(inode) && inode->i_nlink > 1) {+		/* limit is 16-bit i_links_count */+		if (inode->i_nlink >= EXT3_LINK_MAX || inode->i_nlink == 2)+			inode->i_nlink = 1;+	} }  static inline void ext3_dec_count(handle_t *handle, struct inode *inode) {-	inode->i_nlink--;+	if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)+		inode->i_nlink--; }  static int ext3_add_nondir(handle_t *handle,@@ -1703,7 +1709,7 @@ static int ext3_mkdir(struct inode * dir 	struct ext3_dir_entry_2 * de; 	int err, retries = 0; -	if (dir->i_nlink >= EXT3_LINK_MAX)+	if (EXT3_DIR_LINK_MAX(dir)) 		return -EMLINK;  retry:@@ -1726,7 +1732,7 @@ retry: 	inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; 	dir_block = ext3_bread (handle, inode, 0, 1, &err); 	if (!dir_block) {-		inode->i_nlink--; /* is this nlink == 0? */+		ext3_dec_count(handle, inode); /* is this nlink == 0? */ 		ext3_mark_inode_dirty(handle, inode); 		iput (inode); 		goto out_stop;@@ -1758,7 +1764,7 @@ retry: 		iput (inode); 		goto out_stop; 	}-	dir->i_nlink++;+	ext3_inc_count(handle, dir); 	ext3_update_dx_flag(dir); 	ext3_mark_inode_dirty(handle, dir); 	d_instantiate(dentry, inode);@@ -2023,10 +2029,10 @@ static int ext3_rmdir (struct inode * di 	retval = ext3_delete_entry(handle, dir, de, bh); 	if (retval) 		goto end_rmdir;-	if (inode->i_nlink != 2)-		ext3_warning (inode->i_sb, "ext3_rmdir",-			      "empty directory has nlink!=2 (%d)",-			      inode->i_nlink);+	if (!EXT3_DIR_LINK_EMPTY(inode))+		ext3_warning(inode->i_sb, "ext3_rmdir",+			     "empty directory has too many links (%d)",+			     inode->i_nlink); 	inode->i_version++; 	inode->i_nlink = 0; 	/* There's no need to set i_disksize: the fact that i_nlink is@@ -2036,7 +2042,7 @@ static int ext3_rmdir (struct inode * di 	ext3_orphan_add(handle, inode); 	inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; 	ext3_mark_inode_dirty(handle, inode);-	dir->i_nlink--;+	ext3_dec_count(handle, dir); 	ext3_update_dx_flag(dir); 	ext3_mark_inode_dirty(handle, dir); @@ -2087,7 +2093,7 @@ static int ext3_unlink(struct inode * di 	dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC; 	ext3_update_dx_flag(dir); 	ext3_mark_inode_dirty(handle, dir);-	inode->i_nlink--;+	ext3_dec_count(handle, inode); 	if (!inode->i_nlink) 		ext3_orphan_add(handle, inode); 	inode->i_ctime = dir->i_ctime;@@ -2162,7 +2168,7 @@ static int ext3_link (struct dentry * ol 	struct inode *inode = old_dentry->d_inode; 	int err, retries = 0; -	if (inode->i_nlink >= EXT3_LINK_MAX)+	if (EXT3_DIR_LINK_MAX(inode)) 		return -EMLINK;  retry:@@ -2249,8 +2255,8 @@ static int ext3_rename (struct inode * o 		if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino) 			goto end_rename; 		retval = -EMLINK;-		if (!new_inode && new_dir!=old_dir &&-				new_dir->i_nlink >= EXT3_LINK_MAX)+		if (!new_inode && new_dir != old_dir &&+		    EXT3_DIR_LINK_MAX(new_dir)) 			goto end_rename; 	} 	if (!new_bh) {@@ -2307,7 +2313,7 @@ static int ext3_rename (struct inode * o 	}  	if (new_inode) {-		new_inode->i_nlink--;+		ext3_dec_count(handle, new_inode); 		new_inode->i_ctime = CURRENT_TIME_SEC; 	} 	old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;@@ -2318,11 +2324,13 @@ static int ext3_rename (struct inode * o 		PARENT_INO(dir_bh->b_data) = cpu_to_le32(new_dir->i_ino); 		BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata"); 		ext3_journal_dirty_metadata(handle, dir_bh);-		old_dir->i_nlink--;+		ext3_dec_count(handle, old_dir); 		if (new_inode) {-			new_inode->i_nlink--;+			/* checked empty_dir above, can't have another parent,+			 * ext3_dec_count() won't work for many-linked dirs */+			new_inode->i_nlink = 0; 		} else {-			new_dir->i_nlink++;+			ext3_inc_count(handle, new_dir); 			ext3_update_dx_flag(new_dir); 			ext3_mark_inode_dirty(handle, new_dir); 		}Index: linux-2.6.12/include/linux/ext3_fs.h===================================================================--- linux-2.6.12.orig/include/linux/ext3_fs.h+++ linux-2.6.12/include/linux/ext3_fs.h@@ -78,7 +78,7 @@ struct statfs; /*  * Maximal count of links to a file  */-#define EXT3_LINK_MAX		32000+#define EXT3_LINK_MAX		65000  /*  * Macro-instructions used to manage several block sizes@@ -539,6 +539,7 @@ static inline struct ext3_inode_info *EX #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001 #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE	0x0002 #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR	0x0004+#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK	0x0020  #define EXT3_FEATURE_INCOMPAT_COMPRESSION	0x0001 #define EXT3_FEATURE_INCOMPAT_FILETYPE		0x0002@@ -552,6 +553,7 @@ static inline struct ext3_inode_info *EX 					 EXT3_FEATURE_INCOMPAT_META_BG) #define EXT3_FEATURE_RO_COMPAT_SUPP	(EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ 					 EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \+					 EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \ 					 EXT3_FEATURE_RO_COMPAT_BTREE_DIR)  /*

⌨️ 快捷键说明

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