From: yangsheng Date: Fri, 13 Nov 2009 06:06:59 +0000 (+0000) Subject: Branch b1_8 X-Git-Tag: GIT_EPOCH_B_HD_KDMU~85 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=f4e0240b6679d17eb65796bbfae84e3fe833f033 Branch b1_8 b=20773 Fork the patch ext4-hash-indexed-dir-dotdot-update.patch for rhel5.4. --- 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 index 0000000..76416c7 --- /dev/null +++ b/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update-rhel5.patch @@ -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; diff --git a/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update.patch b/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update.patch index 76416c7..d354f89 100644 --- a/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update.patch +++ b/ldiskfs/kernel_patches/patches/ext4-hash-indexed-dir-dotdot-update.patch @@ -62,8 +62,8 @@ Index: linux-stage/fs/ext4/namei.c + +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); diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5-ext4.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5-ext4.series index fafac54..1559a88 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5-ext4.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5-ext4.series @@ -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-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