X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fkernel_patches%2Fpatches%2Fext3-htree-2.4.19-pre1.patch;h=0806c38912ca8de7af09ab8c7e6096d40c84593e;hp=7865c63c644d7e6cc39fef51830eb123a852340b;hb=852b26e9392827b337adf5fd2298fce0f16e15c7;hpb=9f59ef764e80542d82f3b78902615124ddac1020 diff --git a/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch index 7865c63..0806c38 100644 --- a/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch +++ b/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch @@ -1420,7 +1420,7 @@ Index: linux-2.4.19-pre1/fs/ext3/namei.c + struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); + rec_len = EXT3_DIR_REC_LEN(de->name_len); + memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *) to)->rec_len = rec_len; ++ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); + de->inode = 0; + map++; + to += rec_len; @@ -1441,9 +1441,9 @@ Index: linux-2.4.19-pre1/fs/ext3/namei.c + rec_len = EXT3_DIR_REC_LEN(de->name_len); + if (de > to) + memmove(to, de, rec_len); -+ to->rec_len = rec_len; ++ to->rec_len = cpu_to_le16(rec_len); + prev = to; -+ to = (struct ext3_dir_entry_2 *) (((char *) to) + rec_len); ++ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); + } + de = next; + } @@ -2258,19 +2258,23 @@ Index: linux-2.4.19-pre1/fs/ext3/namei.c if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) handle->h_sync = 1; -@@ -1070,14 +2174,33 @@ +@@ -1070,14 +2174,37 @@ /* * ok, that's it */ - ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ retval = ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (retval == -ENOENT) { -+ /* -+ * old_de could have moved out from under us. -+ */ ++ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || ++ old_de->name_len != old_dentry->d_name.len || ++ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || ++ (retval = ext3_delete_entry(handle, old_dir, ++ old_de, old_bh)) == -ENOENT) { ++ /* old_de could have moved from under us during htree split, so ++ * make sure that we are deleting the right entry. We might ++ * also be pointing to a stale entry in the unused part of ++ * old_bh so just checking inum and the name isn't enough. */ + struct buffer_head *old_bh2; + struct ext3_dir_entry_2 *old_de2; -+ ++ + old_bh2 = ext3_find_entry(old_dentry, &old_de2); + if (old_bh2) { + retval = ext3_delete_entry(handle, old_dir,