From: YunfeiGuan Date: Wed, 26 Sep 2018 09:01:38 +0000 (+0800) Subject: client: fix fuse client can't read or write data due its caps is invalid X-Git-Tag: v14.1.0~468^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F25479%2Fhead;p=ceph.git client: fix fuse client can't read or write data due its caps is invalid We can't do read or write if we don't have Fr or Fw. Similarly, if the caps is invalid, we can't read or wirte either. What's worse, the mds don't konw our cap gen is invalid and think client inode's caps is right. Thus will lead client application hung all the time. Fixes: http://tracker.ceph.com/issues/36189 Signed-off-by: Guan yunfei Signed-off-by: "Yan, Zheng" --- diff --git a/src/client/Client.cc b/src/client/Client.cc index ccff5acdcdd1..a9c019752fb9 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2794,8 +2794,13 @@ void Client::send_reconnect(MetaSession *session) cap.seq = 0; // reset seq. cap.issue_seq = 0; // reset seq. cap.mseq = 0; // reset seq. - cap.issued = cap.implemented; - + // cap gen should catch up with session cap_gen + if (cap.gen < session->cap_gen) { + cap.gen = session->cap_gen; + cap.issued = cap.implemented = CEPH_CAP_PIN; + } else { + cap.issued = cap.implemented; + } snapid_t snap_follows = 0; if (!in->cap_snaps.empty()) snap_follows = in->cap_snaps.begin()->first;