Whamcloud - gitweb
Branch b1_8
authoryangsheng <yangsheng>
Fri, 13 Nov 2009 06:06:59 +0000 (06:06 +0000)
committeryangsheng <yangsheng>
Fri, 13 Nov 2009 06:06:59 +0000 (06:06 +0000)
b=20773

Fork the patch ext4-hash-indexed-dir-dotdot-update.patch for rhel5.4.

ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update-rhel5.patch [new file with mode: 0644]
ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update.patch
ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5-ext4.series

diff --git a/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update-rhel5.patch b/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update-rhel5.patch
new file mode 100644 (file)
index 0000000..76416c7
--- /dev/null
@@ -0,0 +1,87 @@
+Index: linux-stage/fs/ext4/namei.c
+===================================================================
+--- linux-stage.orig/fs/ext4/namei.c   2009-08-10 22:44:33.000000000 +0800
++++ linux-stage/fs/ext4/namei.c        2009-08-10 22:48:22.000000000 +0800
+@@ -1493,6 +1493,72 @@
+       return add_dirent_to_buf(handle, dentry, inode, de, bh);
+ }
++/* update ".." for hash-indexed directory, split the item "." if necessary */
++static int ext4_update_dotdot(handle_t *handle, struct dentry *dentry,
++                               struct inode *inode)
++{
++      struct inode * dir = dentry->d_parent->d_inode;
++      struct buffer_head * dir_block;
++      struct ext4_dir_entry_2 * de;
++      int len, journal = 0, err = 0;
++
++      if (IS_ERR(handle))
++              return PTR_ERR(handle);
++
++      if (IS_DIRSYNC(dir))
++              handle->h_sync = 1;
++
++      dir_block = ext4_bread(handle, dir, 0, 0, &err);
++      if (!dir_block)
++              goto out;
++
++      de = (struct ext4_dir_entry_2 *)dir_block->b_data;
++      /* the first item must be "." */
++      assert(de->name_len == 1 && de->name[0] == '.');
++      len = le16_to_cpu(de->rec_len);
++      assert(len >= EXT4_DIR_REC_LEN(1));
++      if (len > EXT4_DIR_REC_LEN(1)) {
++              BUFFER_TRACE(dir_block, "get_write_access");
++              err = ext4_journal_get_write_access(handle, dir_block);
++              if (err)
++                      goto out_journal;
++
++              journal = 1;
++              de->rec_len = cpu_to_le16(EXT4_DIR_REC_LEN(1));
++      }
++
++      len -= EXT4_DIR_REC_LEN(1);
++      assert(len == 0 || len >= EXT4_DIR_REC_LEN(2));
++      de = (struct ext4_dir_entry_2 *)
++                      ((char *) de + le16_to_cpu(de->rec_len));
++      if (!journal) {
++              BUFFER_TRACE(dir_block, "get_write_access");
++              err = ext4_journal_get_write_access(handle, dir_block);
++              if (err)
++                      goto out_journal;
++      }
++
++      de->inode = cpu_to_le32(inode->i_ino);
++      if (len > 0)
++              de->rec_len = cpu_to_le16(len);
++      else
++              assert(le16_to_cpu(de->rec_len) >= EXT4_DIR_REC_LEN(2));
++      de->name_len = 2;
++      strcpy (de->name, "..");
++      ext4_set_de_type(dir->i_sb, de, S_IFDIR);
++
++out_journal:
++      if (journal) {
++              BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
++              err = ext4_handle_dirty_metadata(handle, dir, dir_block);
++              ext4_mark_inode_dirty(handle, dir);
++      }
++      brelse (dir_block);
++
++out:
++      return err;
++}
++
+ /*
+  *    ext4_add_entry()
+  *
+@@ -1521,6 +1587,9 @@
+       if (!dentry->d_name.len)
+               return -EINVAL;
+       if (is_dx(dir)) {
++              if (dentry->d_name.len == 2 &&
++                  memcmp(dentry->d_name.name, "..", 2) == 0)
++                      return ext4_update_dotdot(handle, dentry, inode);
+               retval = ext4_dx_add_entry(handle, dentry, inode);
+               if (!retval || (retval != ERR_BAD_DX_DIR))
+                       return retval;
index 76416c7..d354f89 100644 (file)
@@ -62,8 +62,8 @@ Index: linux-stage/fs/ext4/namei.c
 +
 +out_journal:
 +      if (journal) {
 +
 +out_journal:
 +      if (journal) {
-+              BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
-+              err = ext4_handle_dirty_metadata(handle, dir, dir_block);
++              BUFFER_TRACE(dir_block, "call ext4_journal_dirty_metadata");
++              err = ext4_journal_dirty_metadata(handle, dir_block);
 +              ext4_mark_inode_dirty(handle, dir);
 +      }
 +      brelse (dir_block);
 +              ext4_mark_inode_dirty(handle, dir);
 +      }
 +      brelse (dir_block);
index fafac54..1559a88 100644 (file)
@@ -24,7 +24,7 @@ ext4-osd-iop-common.patch
 ext4-osd-iam-exports.patch
 ext4-dynlocks-common.patch
 ext4-dynlocks-2.6-rhel5.patch
 ext4-osd-iam-exports.patch
 ext4-dynlocks-common.patch
 ext4-dynlocks-2.6-rhel5.patch
-ext4-hash-indexed-dir-dotdot-update.patch
+ext4-hash-indexed-dir-dotdot-update-rhel5.patch
 ext4-ext_generation-sles11.patch
 ext4-kill-dx_root.patch
 ext4-extents-mount-option-rhel5.patch
 ext4-ext_generation-sles11.patch
 ext4-kill-dx_root.patch
 ext4-extents-mount-option-rhel5.patch