diff --git a/src/fdcache_entity.cpp b/src/fdcache_entity.cpp index 9a71d30..0ee60a8 100644 --- a/src/fdcache_entity.cpp +++ b/src/fdcache_entity.cpp @@ -1410,14 +1410,14 @@ off_t FdEntity::BytesModified() // int FdEntity::RowFlush(int fd, const char* tpath, AutoLock::Type type, bool force_sync) { + AutoLock auto_lock(&fdent_lock, type); + S3FS_PRN_INFO3("[tpath=%s][path=%s][pseudo_fd=%d][physical_fd=%d]", SAFESTRPTR(tpath), path.c_str(), fd, physical_fd); if(-1 == physical_fd){ return -EBADF; } - AutoLock auto_lock(&fdent_lock, type); - // check pseudo fd and its flag fdinfo_map_t::iterator miter = pseudo_fd_map.find(fd); if(pseudo_fd_map.end() == miter || NULL == miter->second){ @@ -2491,10 +2491,11 @@ bool FdEntity::PunchHole(off_t start, size_t size) { S3FS_PRN_DBG("[path=%s][physical_fd=%d][offset=%lld][size=%zu]", path.c_str(), physical_fd, static_cast(start), size); + AutoLock auto_lock(&fdent_data_lock); + if(-1 == physical_fd){ return false; } - AutoLock auto_lock(&fdent_data_lock); // get page list that have no data fdpage_list_t nodata_pages; @@ -2532,10 +2533,19 @@ bool FdEntity::PunchHole(off_t start, size_t size) // void FdEntity::MarkDirtyNewFile() { + AutoLock auto_lock(&fdent_data_lock); + pagelist.Init(0, false, true); pending_status = CREATE_FILE_PENDING; } +bool FdEntity::IsDirtyNewFile() const +{ + AutoLock auto_lock(&fdent_data_lock); + + return (CREATE_FILE_PENDING == pending_status); +} + bool FdEntity::AddUntreated(off_t start, off_t size) { bool result = untreated_list.AddPart(start, size); diff --git a/src/fdcache_entity.h b/src/fdcache_entity.h index 1909a56..2b0e736 100644 --- a/src/fdcache_entity.h +++ b/src/fdcache_entity.h @@ -149,7 +149,7 @@ class FdEntity bool PunchHole(off_t start = 0, size_t size = 0); void MarkDirtyNewFile(); - bool IsDirtyNewFile() { return (CREATE_FILE_PENDING == pending_status); } + bool IsDirtyNewFile() const; bool GetLastUpdateUntreatedPart(off_t& start, off_t& size) const; bool ReplaceLastUpdateUntreatedPart(off_t front_start, off_t front_size, off_t behind_start, off_t behind_size);