summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2018-08-02 21:48:34 +0530
committerKrutika Dhananjay <kdhananj@redhat.com>2018-08-14 13:49:42 +0000
commitd46632247cbbeefb4798512e4426943f9768ecbf (patch)
tree1b32f90cc7ddd68eb63b932ca086c3e7720489f0
parent76fcdc2a18311ece1ba0d2a191c9d3261637d41c (diff)
features/shard: Fix crash and test case in RENAME fop
Setting the refresh flag in inode ctx in shard_rename_src_cbk() is applicable only when the dst file exists and is sharded and has a hard link > 1 at the time of rename. But this piece of code is exercised even when dst doesn't exist. In this case, the mount crashes because local->int_inodelk.loc.inode is NULL. Change-Id: Iaf85a5ee3dff8b01a76e11972f10f2bb9dcbd407 Updates: bz#1611692 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
-rw-r--r--tests/bugs/shard/unlinks-and-renames.t96
-rw-r--r--xlators/features/shard/src/shard.c7
2 files changed, 61 insertions, 42 deletions
diff --git a/tests/bugs/shard/unlinks-and-renames.t b/tests/bugs/shard/unlinks-and-renames.t
index 6e5164f0b28..990ca69a8b1 100644
--- a/tests/bugs/shard/unlinks-and-renames.t
+++ b/tests/bugs/shard/unlinks-and-renames.t
@@ -31,9 +31,10 @@ TEST mkdir $M0/dir
TEST touch $M0/dir/foo
TEST touch $M0/dir/new
-######################################
-##### Unlink with /.shard absent #####
-######################################
+##########################################
+##### 01. Unlink with /.shard absent #####
+##########################################
+
TEST truncate -s 5M $M0/dir/foo
TEST ! stat $B0/${V0}0/.shard
TEST ! stat $B0/${V0}1/.shard
@@ -45,9 +46,10 @@ TEST stat $B0/${V0}1/.shard/.remove_me
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo
-##################################################
-##### Unlink of a sharded file without holes #####
-##################################################
+######################################################
+##### 02. Unlink of a sharded file without holes #####
+######################################################
+
# Create a 9M sharded file
TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=9216
gfid_new=$(get_gfid_string $M0/dir/new)
@@ -65,9 +67,10 @@ TEST ! stat $B0/${V0}1/dir/new
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_new
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_new
-#######################################
-##### Unlink with /.shard present #####
-#######################################
+###########################################
+##### 03. Unlink with /.shard present #####
+###########################################
+
TEST truncate -s 5M $M0/dir/foo
gfid_foo=$(get_gfid_string $M0/dir/foo)
# Ensure its shards are absent.
@@ -81,9 +84,10 @@ TEST ! stat $M0/dir/foo
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo
-#############################################################
-##### Unlink of a file with only one block (the zeroth) #####
-#############################################################
+#################################################################
+##### 04. Unlink of a file with only one block (the zeroth) #####
+#################################################################
+
TEST touch $M0/dir/foo
gfid_foo=$(get_gfid_string $M0/dir/foo)
TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 count=1024
@@ -95,9 +99,10 @@ TEST ! stat $M0/dir/foo
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo
-####################################################
-##### Unlink of a sharded file with hard-links #####
-####################################################
+########################################################
+##### 05. Unlink of a sharded file with hard-links #####
+########################################################
+
# Create a 9M sharded file
TEST dd if=/dev/zero of=$M0/dir/original bs=1024 count=9216
gfid_original=$(get_gfid_string $M0/dir/original)
@@ -154,9 +159,10 @@ TEST mkdir $M0/dir
TEST touch $M0/dir/src
TEST touch $M0/dir/dst
-######################################
-##### Rename with /.shard absent #####
-######################################
+##########################################
+##### 06. Rename with /.shard absent #####
+##########################################
+
TEST truncate -s 5M $M0/dir/dst
gfid_dst=$(get_gfid_string $M0/dir/dst)
TEST ! stat $B0/${V0}0/.shard
@@ -172,9 +178,10 @@ TEST stat $B0/${V0}1/dir/dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst
-##################################################
-##### Rename to a sharded file without holes #####
-##################################################
+######################################################
+##### 07. Rename to a sharded file without holes #####
+######################################################
+
TEST unlink $M0/dir/dst
TEST touch $M0/dir/src
# Create a 9M sharded file
@@ -197,9 +204,10 @@ TEST stat $B0/${V0}1/dir/dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst
-###################################################
-##### Rename of dst file with /.shard present #####
-###################################################
+#######################################################
+##### 08. Rename of dst file with /.shard present #####
+#######################################################
+
TEST unlink $M0/dir/dst
TEST touch $M0/dir/src
TEST truncate -s 5M $M0/dir/dst
@@ -215,9 +223,10 @@ TEST stat $B0/${V0}1/dir/dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst
-###############################################################
-##### Rename of dst file with only one block (the zeroth) #####
-###############################################################
+###################################################################
+##### 09. Rename of dst file with only one block (the zeroth) #####
+###################################################################
+
TEST unlink $M0/dir/dst
TEST touch $M0/dir/src
TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=1024
@@ -233,9 +242,10 @@ TEST stat $B0/${V0}1/dir/dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst
-########################################################
-##### Rename to a dst sharded file with hard-links #####
-########################################################
+############################################################
+##### 10. Rename to a dst sharded file with hard-links #####
+############################################################
+
TEST unlink $M0/dir/dst
TEST touch $M0/dir/src
# Create a 9M sharded file
@@ -276,7 +286,10 @@ TEST ! stat $B0/${V0}1/dir/src2
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst
EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst
-# Rename with non-existent dst and a sharded src
+##############################################################
+##### 11. Rename with non-existent dst and a sharded src #####
+##############################################################l
+
TEST touch $M0/dir/src
TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=9216
gfid_src=$(get_gfid_string $M0/dir/src)
@@ -286,7 +299,7 @@ TEST stat $B0/${V0}1/.shard/$gfid_src.1
TEST stat $B0/${V0}0/.shard/$gfid_src.2
TEST stat $B0/${V0}1/.shard/$gfid_src.2
# Now rename src to the dst.
-TEST mv $M0/dir/src $M0/dir/dst
+TEST mv $M0/dir/src $M0/dir/dst2
TEST stat $B0/${V0}0/.shard/$gfid_src.1
TEST stat $B0/${V0}1/.shard/$gfid_src.1
@@ -295,23 +308,26 @@ TEST stat $B0/${V0}1/.shard/$gfid_src.2
TEST ! stat $M0/dir/src
TEST ! stat $B0/${V0}0/dir/src
TEST ! stat $B0/${V0}1/dir/src
-TEST stat $M0/dir/dst
-TEST stat $B0/${V0}0/dir/dst
-TEST stat $B0/${V0}1/dir/dst
+TEST stat $M0/dir/dst2
+TEST stat $B0/${V0}0/dir/dst2
+TEST stat $B0/${V0}1/dir/dst2
+
+#############################################################################
+##### 12. Rename with non-existent dst and a sharded src with no shards #####
+#############################################################################
-# Rename with non-existent dst and a sharded src with no shards
TEST touch $M0/dir/src
TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=1024
gfid_src=$(get_gfid_string $M0/dir/src)
TEST ! stat $B0/${V0}0/.shard/$gfid_src.1
TEST ! stat $B0/${V0}1/.shard/$gfid_src.1
# Now rename src to the dst.
-TEST mv $M0/dir/src $M0/dir/dst
+TEST mv $M0/dir/src $M0/dir/dst1
TEST ! stat $M0/dir/src
TEST ! stat $B0/${V0}0/dir/src
TEST ! stat $B0/${V0}1/dir/src
-TEST stat $M0/dir/dst
-TEST stat $B0/${V0}0/dir/dst
-TEST stat $B0/${V0}1/dir/dst
+TEST stat $M0/dir/dst1
+TEST stat $B0/${V0}0/dir/dst1
+TEST stat $B0/${V0}1/dir/dst1
cleanup
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index 2e76720d176..45711754ebe 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -4325,9 +4325,12 @@ shard_rename_src_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
/* Set ctx->refresh to TRUE to force a lookup on disk when
* shard_lookup_base_file() is called next to refresh the hard link
- * count in ctx
+ * count in ctx. Note that this is applicable only to the case where
+ * the rename dst is already existent and sharded.
*/
- shard_inode_ctx_set_refresh_flag (local->int_inodelk.loc.inode, this);
+ if ((local->dst_block_size) && (!local->cleanup_required))
+ shard_inode_ctx_set_refresh_flag (local->int_inodelk.loc.inode,
+ this);
local->prebuf = *buf;
local->preoldparent = *preoldparent;