diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c
index 7dfe16dd4bd478ed6bcf203bbc23ceb80afadc84..d9f9a0daf761a2f52a8145df7d104cdfc48c3363 100644
--- a/lustre/mds/handler.c
+++ b/lustre/mds/handler.c
@@ -1343,6 +1343,7 @@ static int mds_filter_recovery_request(struct ptlrpc_request *req,
         case MDS_SYNC: /* used in unmounting */
         case OBD_PING:
         case MDS_REINT:
+        case MDS_SETXATTR:
         case LDLM_ENQUEUE:
                 *process = target_queue_recovery_request(req, obd);
                 RETURN(0);
diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh
index 6a40f339087ed01cad798d07f2ae5140da71cd55..95ba1312492d65f145683a422d2730d388e65f0f 100755
--- a/lustre/tests/replay-single.sh
+++ b/lustre/tests/replay-single.sh
@@ -1249,7 +1249,7 @@ test_57() {
 run_test 57 "test recovery from llog for setattr op"
 
 #recovery many mds-ost setattr from llog
-test_58() {
+test_58a() {
     mkdir -p $DIR/$tdir
 #define OBD_FAIL_MDS_OST_SETATTR       0x12c
     do_facet mds "lctl set_param fail_loc=0x8000012c"
@@ -1262,7 +1262,40 @@ test_58() {
     unlinkmany $DIR/$tdir/$tfile-%d 2500
     rmdir $DIR/$tdir
 }
-run_test 58 "test recovery from llog for setattr op (test llog_gen_rec)"
+run_test 58a "test recovery from llog for setattr op (test llog_gen_rec)"
+
+test_58b() {
+    mount_client $MOUNT2
+    mkdir -p $DIR/$tdir
+    touch $DIR/$tdir/$tfile
+    replay_barrier mds
+    setfattr -n trusted.foo -v bar $DIR/$tdir/$tfile
+    fail mds
+    VAL=`getfattr --absolute-names --only-value -n trusted.foo $MOUNT2/$tdir/$tfile`
+    [ x$VAL = x"bar" ] || return 1
+    rm -f $DIR/$tdir/$tfile
+    rmdir $DIR/$tdir
+    zconf_umount `hostname` $MOUNT2
+}
+run_test 58b "test replay of setxattr op"
+
+test_58c() { # bug 16570
+        mount_client $MOUNT2
+        mkdir -p $DIR/$tdir
+        touch $DIR/$tdir/$tfile
+        drop_request "setfattr -n trusted.foo -v bar $DIR/$tdir/$tfile" || \
+                return 1
+        VAL=`getfattr --absolute-names --only-value -n trusted.foo $MOUNT2/$tdir/$tfile`
+        [ x$VAL = x"bar" ] || return 2
+        drop_reint_reply "setfattr -n trusted.foo1 -v bar1 $DIR/$tdir/$tfile" || \
+                return 3
+        VAL=`getfattr --absolute-names --only-value -n trusted.foo1 $MOUNT2/$tdir/$tfile`
+        [ x$VAL = x"bar1" ] || return 4
+        rm -f $DIR/$tdir/$tfile
+        rmdir $DIR/$tdir
+        zconf_umount `hostname` $MOUNT2
+}
+run_test 58c "resend/reconstruct setxattr op"
 
 # log_commit_thread vs filter_destroy race used to lead to import use after free
 # bug 11658