From: Yan, Zheng Date: Thu, 3 Apr 2014 22:49:49 +0000 (+0800) Subject: client: hold Fcr caps during readahead X-Git-Tag: v0.80-rc1~85^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1538a98a4f42a073206f08cc564cddbadc07842b;p=ceph.git client: hold Fcr caps during readahead Fcr caps prevent the file from being truncated. Fixes: #7958 Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 14271499ec01..137d0b31b11d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6206,7 +6206,7 @@ int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl) NULL, 0, onfinish); if (r == 0) { ldout(cct, 20) << "readahead initiated, c " << onfinish << dendl; - in->get(); + get_cap_ref(in, CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE); } else { ldout(cct, 20) << "readahead was no-op, already cached" << dendl; delete onfinish; @@ -6224,12 +6224,14 @@ int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl) r = objectcacher->file_read(&in->oset, &in->layout, in->snapid, off, len, bl, 0, onfinish); if (r == 0) { + get_cap_ref(in, CEPH_CAP_FILE_CACHE); client_lock.Unlock(); flock.Lock(); while (!done) cond.Wait(flock); flock.Unlock(); client_lock.Lock(); + put_cap_ref(in, CEPH_CAP_FILE_CACHE); r = rvalue; } else { // it was cached. diff --git a/src/client/Client.h b/src/client/Client.h index 80b12d9837d6..df13b6febfc5 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -566,7 +566,7 @@ private: inode(i) { } void finish(int r) { lsubdout(client->cct, client, 20) << "C_Readahead on " << inode << dendl; - client->put_inode(inode, 1); + client->put_cap_ref(inode, CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE); } };