From 8613984373de946e1815cc84d50bbd4437a3f7a7 Mon Sep 17 00:00:00 2001 From: Sebastien Ponce Date: Tue, 18 Nov 2014 10:30:36 +0100 Subject: [PATCH] Fixed locking issue in the trun method of libradosstriper leading to potential race conditions - Fixes: #10129 Signed-off-by: Sebastien Ponce --- src/libradosstriper/RadosStriperImpl.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/libradosstriper/RadosStriperImpl.cc b/src/libradosstriper/RadosStriperImpl.cc index 2ef94ad7b59cd..35c1c7ae27c6d 100644 --- a/src/libradosstriper/RadosStriperImpl.cc +++ b/src/libradosstriper/RadosStriperImpl.cc @@ -613,20 +613,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 ///////////////////////////// -- 2.39.5