From 0f3e9eec19548e3fe9452ddd603810ff41aa1588 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Thu, 10 Jan 2013 21:32:57 +0800 Subject: [PATCH] LU-2638 ldiskfs: update dotdot entry for rename On master, when rename a directory, its old dotdot entry will be removed firstly, then insert the new dotdot entry, and try to append FID-in-dirent. But the space for dotdot entry maybe not enough to hold the new dotdot with FID-in-dirent, such as the MDT device restored from file-level backup, or the device is upgraded from 1.8. If we do not move data in the directory block, the FID-in-dirent will overwrite the dx_root and cause the directory crashed. Currently, we do not want to introduce complex logic to handle directory data moving, instead, under such case, ignore the FID-in-dirent for the new dotdot entry, and just insert the new dotdot entry. Signed-off-by: Fan Yong Change-Id: Id38f5136fb2bc607344c37ca10a32e63ab427e3d Reviewed-on: http://review.whamcloud.com/5179 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev --- .../kernel_patches/patches/ext4_data_in_dirent-rhel6.patch | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/ext4_data_in_dirent-rhel6.patch b/ldiskfs/kernel_patches/patches/ext4_data_in_dirent-rhel6.patch index b23e2d6..75e5634 100644 --- a/ldiskfs/kernel_patches/patches/ext4_data_in_dirent-rhel6.patch +++ b/ldiskfs/kernel_patches/patches/ext4_data_in_dirent-rhel6.patch @@ -420,12 +420,13 @@ Index: linux-stage/fs/ext4/namei.c else - assert(le16_to_cpu(de->rec_len) >= EXT4_DIR_REC_LEN(2)); + 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); -+ if (data) { + de->name_len = 2; + strcpy (de->name, ".."); +- ext4_set_de_type(dir->i_sb, de, S_IFDIR); ++ if (data != NULL && ext4_get_dirent_data_len(de) >= dlen) { + de->name[2] = 0; -+ memcpy(&de->name[2 + 1], data, dlen); ++ memcpy(&de->name[2 + 1], data, *data); ++ ext4_set_de_type(dir->i_sb, de, S_IFDIR); + de->file_type |= EXT4_DIRENT_LUFID; + } -- 1.8.3.1