From afd438d363dfb36601536ab13893e1758c1e0969 Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Wed, 24 Jul 2019 15:22:14 -0700 Subject: [PATCH] Access FdEntity metadata while holding fdent_lock Create copies to avoid thread races. Found via ThreadSanitizer. Follows on to ecf13a8cb9d08406af454f318b8a2b1eb7f37995. --- src/fdcache.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/fdcache.cpp b/src/fdcache.cpp index 834dcb2..a2d72e6 100644 --- a/src/fdcache.cpp +++ b/src/fdcache.cpp @@ -1479,7 +1479,15 @@ int FdEntity::RowFlush(const char* tpath, bool force_sync) { int result = 0; - S3FS_PRN_INFO3("[tpath=%s][path=%s][fd=%d]", SAFESTRPTR(tpath), path.c_str(), fd); + std::string tmppath; + headers_t tmporgmeta; + { + AutoLock auto_lock(&fdent_lock); + tmppath = path; + tmporgmeta = orgmeta; + } + + S3FS_PRN_INFO3("[tpath=%s][path=%s][fd=%d]", SAFESTRPTR(tpath), tmppath.c_str(), fd); if(-1 == fd){ return -EBADF; @@ -1554,10 +1562,10 @@ int FdEntity::RowFlush(const char* tpath, bool force_sync) } if(pagelist.Size() >= S3fsCurl::GetMultipartSize() && !nomultipart){ - result = S3fsCurl::ParallelMultipartUploadRequest(tpath ? tpath : path.c_str(), orgmeta, fd); + result = S3fsCurl::ParallelMultipartUploadRequest(tpath ? tpath : tmppath.c_str(), tmporgmeta, fd); }else{ S3fsCurl s3fscurl(true); - result = s3fscurl.PutRequest(tpath ? tpath : path.c_str(), orgmeta, fd); + result = s3fscurl.PutRequest(tpath ? tpath : tmppath.c_str(), tmporgmeta, fd); } // seek to head of file.