From 43414bd6f25a4b207e13539414782ddb961fbf2a Mon Sep 17 00:00:00 2001 From: Emoly Liu Date: Tue, 29 Jan 2013 02:50:34 +0800 Subject: [PATCH] LU-2634 ldiskfs: clear extent flag for fast symlink Fast symlinks on MDT filesystems formatted with the "extents" feature are created with EXT4_EXTENTS_FL. e2fsck considers this a corruption and deletes the symlink. The patch is to clear LDISKFS_INODE_EXTENTS flag in osd_ldiskfs_writelink() just as ext4_symlink() does. Signed-off-by: Liu Ying Change-Id: Ib7c1eee7becfaf2b80805d3f6c13658686ad5699 Reviewed-on: http://review.whamcloud.com/5154 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev --- lustre/osd-ldiskfs/osd_io.c | 2 ++ lustre/tests/conf-sanity.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 995a94c..38ea533 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1030,6 +1030,8 @@ static ssize_t osd_declare_write(const struct lu_env *env, struct dt_object *dt, static int osd_ldiskfs_writelink(struct inode *inode, char *buffer, int buflen) { + /* LU-2634: clear the extent format for fast symlink */ + ldiskfs_clear_inode_flag(inode, LDISKFS_INODE_EXTENTS); memcpy((char *)&LDISKFS_I(inode)->i_data, (char *)buffer, buflen); LDISKFS_I(inode)->i_disksize = buflen; diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index 268a460..fc9d765 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -3798,6 +3798,42 @@ test_71e() { } run_test 71e "start OST0, MDT1, OST1, MDT0" +test_72() { #LU-2634 + local mdsdev=$(mdsdevname 1) + local ostdev=$(ostdevname 1) + local cmd="$E2FSCK -fnvd $mdsdev" + local fn=3 + + #tune MDT with "-O extents" + add $SINGLEMDS \ + $(mkfs_opts $SINGLEMDS ${mdsdev}) --reformat $mdsdev || + error "add $SINGLEMDS failed" + $TUNE2FS -O extents $mdsdev + add ost1 $(mkfs_opts ost1 $ostdev) --reformat $ostdev || + error "add $ostdev failed" + start_mgsmds || error "start mds failed" + start_ost || error "start ost failed" + mount_client $MOUNT || error "mount client failed" + + #create some short symlinks + mkdir -p $DIR/$tdir + createmany -o $DIR/$tdir/$tfile-%d $fn + echo "create $fn short symlinks" + for i in $(seq -w 1 $fn); do + ln -s $DIR/$tdir/$tfile-$i $MOUNT/$tfile-$i + done + ls -al $MOUNT + + #umount + umount_client $MOUNT || error "umount client failed" + stop_mds || error "stop mds failed" + stop_ost || error "stop ost failed" + + #run e2fsck + run_e2fsck $(facet_active_host $SINGLEMDS) $mdsdev "-n" +} +run_test 72 "test fast symlink with extents flag enabled" + if ! combined_mgs_mds ; then stop mgs fi -- 1.8.3.1