From: Sebastien Ponce Date: Tue, 18 Nov 2014 09:30:36 +0000 (+0100) Subject: Fixed locking issue in the trun method of libradosstriper leading to potential race... X-Git-Tag: v0.87.1~28^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=13bb880b2a04ab354506eb183d2907b9054bf937;p=ceph.git Fixed locking issue in the trun method of libradosstriper leading to potential race conditions - Fixes: #10129 Signed-off-by: Sebastien Ponce (cherry picked from commit 8613984373de946e1815cc84d50bbd4437a3f7a7) --- diff --git a/src/libradosstriper/RadosStriperImpl.cc b/src/libradosstriper/RadosStriperImpl.cc index 2460999eb319..fc08e1179d00 100644 --- a/src/libradosstriper/RadosStriperImpl.cc +++ b/src/libradosstriper/RadosStriperImpl.cc @@ -600,20 +600,20 @@ int libradosstriper::RadosStriperImpl::trunc(const std::string& soid, uint64_t s std::string firstObjOid = getObjectId(soid, 0); try { RadosExclusiveLock lock(&m_ioCtx, firstObjOid); + // load layout and size + ceph_file_layout layout; + uint64_t original_size; + int rc = internal_get_layout_and_size(firstObjOid, &layout, &original_size); + if (rc) return rc; + if (size < original_size) { + rc = truncate(soid, original_size, size, layout); + } else if (size > original_size) { + rc = grow(soid, original_size, size, layout); + } + return rc; } catch (ErrorCode &e) { return e.m_code; } - // load layout and size - ceph_file_layout layout; - uint64_t original_size; - int rc = internal_get_layout_and_size(firstObjOid, &layout, &original_size); - if (rc) return rc; - if (size < original_size) { - rc = truncate(soid, original_size, size, layout); - } else if (size > original_size) { - rc = grow(soid, original_size, size, layout); - } - return rc; } ///////////////////////// private helpers /////////////////////////////