Whamcloud - gitweb
LU-2634 ldiskfs: clear extent flag for fast symlink
authorEmoly Liu <emoly.liu@intel.com>
Mon, 18 Feb 2013 10:17:50 +0000 (18:17 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 20 Feb 2013 04:27:27 +0000 (23:27 -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 extent flag in osd_ldiskfs_writelink() just as
ext4_symlink() does.

Signed-off-by: Liu Ying <emoly.liu@intel.com>
Change-Id: Ic0c711cc82de140f86baa71bacd1721fd4a19e07
Reviewed-on: http://review.whamcloud.com/5458
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
lustre/osd-ldiskfs/osd_handler.c
lustre/tests/conf-sanity.sh

index cbed4fc..b01138b 100644 (file)
@@ -2544,6 +2544,8 @@ static ssize_t osd_read(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_I(inode)->i_flags &= ~LDISKFS_EXTENTS_FL;
 
         memcpy((char*)&LDISKFS_I(inode)->i_data, (char *)buffer,
                buflen);
index adbb9de..1ca6c91 100644 (file)
@@ -2807,6 +2807,42 @@ test_65() { # LU-2237
 }
 run_test 65 "re-create the lost last_rcvd file when server mount"
 
+test_66() { #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 66 "test fast symlink with extents flag enabled"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi