Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / kernel_patches / patches / ext3-nlinks-2.4.24.patch
index f198362..621d1b3 100644 (file)
@@ -1,13 +1,14 @@
 --- ./fs/ext3/namei.c.orig     2004-08-19 12:53:21.000000000 +0800
 +++ ./fs/ext3/namei.c  2004-08-19 12:44:18.000000000 +0800
-@@ -1541,11 +1541,16 @@
+@@ -1541,11 +1541,17 @@
  static inline void ext3_inc_count(handle_t *handle, struct inode *inode)
  {
        inode->i_nlink++;
 +      if (is_dx(inode) && inode->i_nlink > 1) {
-+              if (inode->i_nlink >= 65000) /* limit is 16-bit i_links_count */
++              /* 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)
@@ -23,7 +24,7 @@
        int err;
  
 -      if (dir->i_nlink >= EXT3_LINK_MAX)
-+      if (EXT3_DIR_LINK_MAXED(dir))
++      if (EXT3_DIR_LINK_MAX(dir))
                return -EMLINK;
  
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
@@ -95,7 +96,7 @@
                return -EPERM;
  
 -      if (inode->i_nlink >= EXT3_LINK_MAX) {
-+      if (EXT3_DIR_LINK_MAXED(inode))
++      if (EXT3_DIR_LINK_MAX(inode))
                return -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_MAXED(new_dir))
++                  EXT3_DIR_LINK_MAX(new_dir))
                        goto end_rename;
        }
        if (!new_bh) {
                new_inode->i_ctime = CURRENT_TIME;
        }
        old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
-@@ -2296,11 +2301,11 @@
+@@ -2296,11 +2301,13 @@
                PARENT_INO(dir_bh->b_data) = le32_to_cpu(new_dir->i_ino);
                BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata");
                ext3_journal_dirty_metadata(handle, dir_bh);
 +              ext3_dec_count(handle, old_dir);
                if (new_inode) {
 -                      new_inode->i_nlink--;
-+                      ext3_dec_count(handle, new_inode);
++                      /* 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);
                }
 --- ./include/linux/ext3_fs.h.orig     2004-08-19 12:53:52.000000000 +0800
 +++ ./include/linux/ext3_fs.h  2004-08-19 11:06:33.000000000 +0800
-@@ -42,7 +42,7 @@
+@@ -79,7 +81,7 @@
  /*
-  * Always enable hashed directories
+  * Maximal count of links to a file
   */
--#define CONFIG_EXT3_INDEX
-+#define CONFIG_EXT3_INDEX 1
+-#define EXT3_LINK_MAX         32000
++#define EXT3_LINK_MAX         65000
  
  /*
-  * Debug code
-@@ -581,14 +581,15 @@
-  */
- #ifdef CONFIG_EXT3_INDEX
--  #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \
--                                            EXT3_FEATURE_COMPAT_DIR_INDEX) && \
-+#define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \
-+                                          EXT3_FEATURE_COMPAT_DIR_INDEX) && \
-                     (EXT3_I(dir)->i_flags & EXT3_INDEX_FL))
--#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX)
--#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
-+#define EXT3_DIR_LINK_MAXED(dir) (!is_dx(dir) && (dir)->i_nlink >=EXT3_LINK_MAX)
-+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || \
-+                                (is_dx(dir) && (dir)->i_nlink == 1))
- #else
-   #define is_dx(dir) 0
--#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX)
-+#define EXT3_DIR_LINK_MAXED(dir) ((dir)->i_nlink >= EXT3_LINK_MAX)
- #define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2)
- #endif
+  * Macro-instructions used to manage several block sizes