From 40f95272beada61b6137bb2ae7273083ef4dbcce Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Sun, 13 Oct 2024 11:53:56 +0900 Subject: [PATCH] Fix locking annotations and add one missing lock (#2542) This allows clang's thread safety checks to pass. --- src/fdcache.h | 2 +- src/fdcache_entity.h | 14 +++++++------- src/fdcache_fdinfo.cpp | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/fdcache.h b/src/fdcache.h index 1d60d0f..0c8fed7 100644 --- a/src/fdcache.h +++ b/src/fdcache.h @@ -108,7 +108,7 @@ class FdManager return GetFdEntityHasLock(path, existfd, newfd); } FdEntity* GetFdEntityHasLock(const char* path, int& existfd, bool newfd = true) REQUIRES(FdManager::fd_manager_lock); - FdEntity* Open(int& fd, const char* path, const headers_t* pmeta, off_t size, const struct timespec& ts_mctime, int flags, bool force_tmpfile, bool is_create, bool ignore_modify) REQUIRES(FdManager::fd_manager_lock); + FdEntity* Open(int& fd, const char* path, const headers_t* pmeta, off_t size, const struct timespec& ts_mctime, int flags, bool force_tmpfile, bool is_create, bool ignore_modify); FdEntity* GetExistFdEntity(const char* path, int existfd = -1); FdEntity* OpenExistFdEntity(const char* path, int& fd, int flags = O_RDONLY); void Rename(const std::string &from, const std::string &to); diff --git a/src/fdcache_entity.h b/src/fdcache_entity.h index fdd8998..dcd75f4 100644 --- a/src/fdcache_entity.h +++ b/src/fdcache_entity.h @@ -85,12 +85,12 @@ class FdEntity int NoCachePreMultipartPost(PseudoFdInfo* pseudo_obj); int NoCacheMultipartPost(PseudoFdInfo* pseudo_obj, int tgfd, off_t start, off_t size); int NoCacheCompleteMultipartPost(PseudoFdInfo* pseudo_obj); - int RowFlushNoMultipart(const PseudoFdInfo* pseudo_obj, const char* tpath); - int RowFlushMultipart(PseudoFdInfo* pseudo_obj, const char* tpath); - int RowFlushMixMultipart(PseudoFdInfo* pseudo_obj, const char* tpath); - int RowFlushStreamMultipart(PseudoFdInfo* pseudo_obj, const char* tpath); - ssize_t WriteNoMultipart(const PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size); - ssize_t WriteMultipart(PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size); + int RowFlushNoMultipart(const PseudoFdInfo* pseudo_obj, const char* tpath) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); + int RowFlushMultipart(PseudoFdInfo* pseudo_obj, const char* tpath) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); + int RowFlushMixMultipart(PseudoFdInfo* pseudo_obj, const char* tpath) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); + int RowFlushStreamMultipart(PseudoFdInfo* pseudo_obj, const char* tpath) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); + ssize_t WriteNoMultipart(const PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); + ssize_t WriteMultipart(PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size) REQUIRES(FdEntity::fdent_lock, FdEntity::fdent_data_lock); ssize_t WriteMixMultipart(PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size); ssize_t WriteStreamUpload(PseudoFdInfo* pseudo_obj, const char* bytes, off_t start, size_t size); @@ -121,7 +121,7 @@ class FdEntity return FindPseudoFdWithLock(fd); } bool FindPseudoFdWithLock(int fd) const REQUIRES(FdEntity::fdent_lock); - int Open(const headers_t* pmeta, off_t size, const struct timespec& ts_mctime, int flags) REQUIRES(FdEntity::fdent_lock); + int Open(const headers_t* pmeta, off_t size, const struct timespec& ts_mctime, int flags); bool LoadAll(int fd, headers_t* pmeta = nullptr, off_t* size = nullptr, bool force_load = false); int Dup(int fd) { const std::lock_guard lock(fdent_lock); diff --git a/src/fdcache_fdinfo.cpp b/src/fdcache_fdinfo.cpp index 500ed00..dbc9bb1 100644 --- a/src/fdcache_fdinfo.cpp +++ b/src/fdcache_fdinfo.cpp @@ -577,6 +577,7 @@ ssize_t PseudoFdInfo::UploadBoundaryLastUntreatedArea(const char* path, headers_ // // Upload Multipart parts // + const std::lock_guard lock(upload_list_lock); if(!ParallelMultipartUpload(path, to_upload_list, false)){ S3FS_PRN_ERR("Failed to upload multipart parts."); return -EIO;