]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: return -eio when sync file which unsafe reqs has been dropped 29167/head
authorsimon gao <simon29rock@gmail.com>
Wed, 31 Jul 2019 01:51:21 +0000 (21:51 -0400)
committersimon gao <simon29rock@gmail.com>
Wed, 31 Jul 2019 01:51:21 +0000 (21:51 -0400)
        Fixes:http://tracker.ceph.com/issues/40877

Signed-off-by: simon gao <simon29rock@gmail.com>
src/client/Client.cc

index 96f683bcc46213f00d44d418acc37ec2669149d4..4dd491e15ff6d2fb6a0b0b221e4f820a47683e67 100644 (file)
@@ -2942,8 +2942,21 @@ void Client::kick_requests_closed(MetaSession *session)
       if (req->got_unsafe) {
        lderr(cct) << __func__ << " removing unsafe request " << req->get_tid() << dendl;
        req->unsafe_item.remove_myself();
-       req->unsafe_dir_item.remove_myself();
-       req->unsafe_target_item.remove_myself();
+       if (is_dir_operation(req)) {
+         Inode *dir = req->inode();
+         assert(dir);
+         dir->set_async_err(-EIO);
+         lderr(cct) << "kick_requests_closed drop req of inode(dir) : "
+                    <<  dir->ino  << " " << req->get_tid() << dendl;
+         req->unsafe_dir_item.remove_myself();
+       }
+       if (req->target) {
+         InodeRef &in = req->target;
+         in->set_async_err(-EIO);
+         lderr(cct) << "kick_requests_closed drop req of inode : "
+                    <<  in->ino  << " " << req->get_tid() << dendl;
+         req->unsafe_target_item.remove_myself();
+       }
        signal_cond_list(req->waitfor_safe);
        unregister_request(req);
       }