1 Index: linux-2.6.5-7.283/fs/ext3/namei.c
2 ===================================================================
3 --- linux-2.6.5-7.283.orig/fs/ext3/namei.c
4 +++ linux-2.6.5-7.283/fs/ext3/namei.c
5 @@ -1613,11 +1613,17 @@ static int ext3_delete_entry (handle_t *
6 static inline void ext3_inc_count(handle_t *handle, struct inode *inode)
9 + if (is_dx(inode) && inode->i_nlink > 1) {
10 + /* limit is 16-bit i_links_count */
11 + if (inode->i_nlink >= EXT3_LINK_MAX || inode->i_nlink == 2)
16 static inline void ext3_dec_count(handle_t *handle, struct inode *inode)
19 + if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)
23 static int ext3_add_nondir(handle_t *handle,
24 @@ -1730,7 +1736,7 @@ static int ext3_mkdir(struct inode * dir
28 - if (dir->i_nlink >= EXT3_LINK_MAX)
29 + if (EXT3_DIR_LINK_MAX(dir))
33 @@ -1784,7 +1790,7 @@ retry:
38 + ext3_inc_count(handle, dir);
39 ext3_update_dx_flag(dir);
40 ext3_mark_inode_dirty(handle, dir);
41 d_instantiate(dentry, inode);
42 @@ -2042,16 +2048,16 @@ static int ext3_rmdir (struct inode * di
43 retval = ext3_delete_entry(handle, dir, de, bh);
46 - if (inode->i_nlink != 2)
47 - ext3_warning (inode->i_sb, "ext3_rmdir",
48 - "empty directory has nlink!=2 (%d)",
50 + if (!EXT3_DIR_LINK_EMPTY(inode))
51 + ext3_warning(inode->i_sb, "ext3_rmdir",
52 + "empty directory has too many links (%d)",
56 ext3_orphan_add(handle, inode);
57 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
58 ext3_mark_inode_dirty(handle, inode);
60 + ext3_dec_count(handle, dir);
61 ext3_update_dx_flag(dir);
62 ext3_mark_inode_dirty(handle, dir);
64 @@ -2100,7 +2106,7 @@ static int ext3_unlink(struct inode * di
65 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
66 ext3_update_dx_flag(dir);
67 ext3_mark_inode_dirty(handle, dir);
69 + ext3_dec_count(handle, inode);
71 ext3_orphan_add(handle, inode);
72 inode->i_ctime = dir->i_ctime;
73 @@ -2191,7 +2197,7 @@ static int ext3_link (struct dentry * ol
74 struct inode *inode = old_dentry->d_inode;
77 - if (inode->i_nlink >= EXT3_LINK_MAX)
78 + if (EXT3_DIR_LINK_MAX(inode))
82 @@ -2277,8 +2283,8 @@ static int ext3_rename (struct inode * o
83 if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino)
86 - if (!new_inode && new_dir!=old_dir &&
87 - new_dir->i_nlink >= EXT3_LINK_MAX)
88 + if (!new_inode && new_dir != old_dir &&
89 + EXT3_DIR_LINK_MAX(new_dir))
93 @@ -2335,7 +2341,7 @@ static int ext3_rename (struct inode * o
97 - new_inode->i_nlink--;
98 + ext3_dec_count(handle, new_inode);
99 new_inode->i_ctime = CURRENT_TIME;
101 old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
102 @@ -2346,11 +2352,13 @@ static int ext3_rename (struct inode * o
103 PARENT_INO(dir_bh->b_data) = le32_to_cpu(new_dir->i_ino);
104 BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata");
105 ext3_journal_dirty_metadata(handle, dir_bh);
106 - old_dir->i_nlink--;
107 + ext3_dec_count(handle, old_dir);
109 - new_inode->i_nlink--;
110 + /* checked empty_dir above, can't have another parent,
111 + * ext3_dec_count() won't work for many-linked dirs */
112 + new_inode->i_nlink = 0;
114 - new_dir->i_nlink++;
115 + ext3_inc_count(handle, new_dir);
116 ext3_update_dx_flag(new_dir);
117 ext3_mark_inode_dirty(handle, new_dir);
119 Index: linux-2.6.5-7.283/include/linux/ext3_fs.h
120 ===================================================================
121 --- linux-2.6.5-7.283.orig/include/linux/ext3_fs.h
122 +++ linux-2.6.5-7.283/include/linux/ext3_fs.h
123 @@ -86,7 +86,7 @@ struct statfs;
125 * Maximal count of links to a file
127 -#define EXT3_LINK_MAX 32000
128 +#define EXT3_LINK_MAX 65000
131 * Macro-instructions used to manage several block sizes
132 @@ -538,6 +538,7 @@ static inline struct ext3_inode_info *EX
133 #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
134 #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
135 #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
136 +#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK 0x0020
138 #define EXT3_FEATURE_INCOMPAT_COMPRESSION 0x0001
139 #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002
140 @@ -553,6 +554,7 @@ static inline struct ext3_inode_info *EX
141 EXT3_FEATURE_INCOMPAT_EXTENTS)
142 #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
143 EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
144 + EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
145 EXT3_FEATURE_RO_COMPAT_BTREE_DIR)