Whamcloud - gitweb
LU-2634 ldiskfs: clear extent flag for fast symlink
authorEmoly Liu <emoly.liu@intel.com>
Mon, 28 Jan 2013 18:50:34 +0000 (02:50 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 18 Feb 2013 03:48:39 +0000 (22:48 -0500)
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 <emoly.liu@intel.com>
Change-Id: Ib7c1eee7becfaf2b80805d3f6c13658686ad5699
Reviewed-on: http://review.whamcloud.com/5154
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
lustre/osd-ldiskfs/osd_io.c
lustre/tests/conf-sanity.sh

index 995a94c..38ea533 100644 (file)
@@ -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;
index 268a460..fc9d765 100644 (file)
@@ -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