Whamcloud - gitweb
Branch b1_8
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext3-nlinks-2.6.7.patch
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)
7  {
8         inode->i_nlink++;
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)
12 +                       inode->i_nlink = 1;
13 +        }
14  }
15  
16  static inline void ext3_dec_count(handle_t *handle, struct inode *inode)
17  {
18 -       inode->i_nlink--;
19 +       if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)
20 +               inode->i_nlink--;
21  }
22  
23  static int ext3_add_nondir(handle_t *handle,
24 @@ -1730,7 +1736,7 @@ static int ext3_mkdir(struct inode * dir
25         int retries = 0;
26         int err;
27  
28 -       if (dir->i_nlink >= EXT3_LINK_MAX)
29 +       if (EXT3_DIR_LINK_MAX(dir))
30                 return -EMLINK;
31  
32  retry:
33 @@ -1784,7 +1790,7 @@ retry:
34                 iput (inode);
35                 goto out_stop;
36         }
37 -       dir->i_nlink++;
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);
44         if (retval)
45                 goto end_rmdir;
46 -       if (inode->i_nlink != 2)
47 -               ext3_warning (inode->i_sb, "ext3_rmdir",
48 -                             "empty directory has nlink!=2 (%d)",
49 -                             inode->i_nlink);
50 +       if (!EXT3_DIR_LINK_EMPTY(inode))
51 +               ext3_warning(inode->i_sb, "ext3_rmdir",
52 +                            "empty directory has too many links (%d)",
53 +                            inode->i_nlink);
54         inode->i_version++;
55         inode->i_nlink = 0;
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);
59 -       dir->i_nlink--;
60 +       ext3_dec_count(handle, dir);
61         ext3_update_dx_flag(dir);
62         ext3_mark_inode_dirty(handle, dir);
63  
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);
68 -       inode->i_nlink--;
69 +       ext3_dec_count(handle, inode);
70         if (!inode->i_nlink)
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;
75         int err, retries = 0;
76  
77 -       if (inode->i_nlink >= EXT3_LINK_MAX)
78 +       if (EXT3_DIR_LINK_MAX(inode))
79                 return -EMLINK;
80  
81  retry:
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)
84                         goto end_rename;
85                 retval = -EMLINK;
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))
90                         goto end_rename;
91         }
92         if (!new_bh) {
93 @@ -2335,7 +2341,7 @@ static int ext3_rename (struct inode * o
94         }
95  
96         if (new_inode) {
97 -               new_inode->i_nlink--;
98 +               ext3_dec_count(handle, new_inode);
99                 new_inode->i_ctime = CURRENT_TIME;
100         }
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);
108                 if (new_inode) {
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;
113                 } else {
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);
118                 }
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;
124  /*
125   * Maximal count of links to a file
126   */
127 -#define EXT3_LINK_MAX          32000
128 +#define EXT3_LINK_MAX          65000
129  
130  /*
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
137  
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)
146  
147  /*