diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp index 374dc8a0c4ce9d958e558c7860f0036fdda6863d..b2a48b11b35ceb243290d66cc39a2e1abef691d9 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp @@ -468,8 +468,8 @@ static void DoSessionInit(shared_ptr filePtr, shared_ptropenLock); *openFinish = true; } - cond->notify_one(); *error = CloudError::CK_LOCAL_ERROR; + cond->notify_one(); return; } *error = session->InitSession(); diff --git a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp index 62821854d2a3b0216da254d5c1e201c9be5b6b7a..d31a2044df8d32cd625f4e06708774254eedef6b 100644 --- a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp +++ b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp @@ -242,7 +242,7 @@ struct HmdfsSaveAppId { struct FuseData { int userId; - int64_t fileId{0}; + uint64_t fileId{0}; shared_ptr rootNode{nullptr}; /* store CloudInode by path */ map> inodeCache; @@ -672,7 +672,8 @@ static void fuse_inval(fuse_session *se, fuse_ino_t parentIno, fuse_ino_t childI ffrt::submit(task, {}, {}, ffrt::task_attr().qos(ffrt_qos_background)); } -static int CloudOpenOnLocal(struct FuseData *data, shared_ptr cInode, struct fuse_file_info *fi) +static int CloudOpenOnLocal(struct FuseData *data, shared_ptr cInode, + struct fuse_file_info *fi, shared_ptr cloudFdInfo) { string localPath = GetLocalPath(data->userId, cInode->path); string tmpPath = GetCacheTmpPath(data->userId, cInode->path); @@ -706,17 +707,13 @@ static int CloudOpenOnLocal(struct FuseData *data, shared_ptr cInode return 0; } auto fdsan = new fdsan_fd(fd); - auto cloudFdInfo = FindKeyInCloudFdCache(data, fi->fh); - if (cloudFdInfo == nullptr) { - LOGE("cloudFdCache is nullptr"); - return 0; - } + std::unique_lock lock(cloudFdInfo->modifyLock)); cloudFdInfo->fdsan = reinterpret_cast(fdsan); return 0; } -static int HandleOpenResult(CloudFile::CloudError ckError, struct FuseData *data, - shared_ptr cInode, struct fuse_file_info *fi) +static int HandleOpenResult(CloudFile::CloudError ckError, struct FuseData *data, shared_ptr cInode, + struct fuse_file_info *fi, shared_ptr cloudFdInfo) { string prepareTraceId; if (cInode->readSession) { @@ -727,7 +724,7 @@ static int HandleOpenResult(CloudFile::CloudError ckError, struct FuseData *data return ret; } if (cInode->mBase->fileType != FILE_TYPE_CONTENT) { - ret = CloudOpenOnLocal(data, cInode, fi); + ret = CloudOpenOnLocal(data, cInode, fi, cloudFdInfo); if (ret < 0) { CLOUD_FILE_FAULT_REPORT(CloudFileFaultInfo{PHOTOS_BUNDLE_NAME, FaultOperation::OPEN, FaultType::INODE_FILE, ret, "inner error"}); @@ -757,8 +754,8 @@ static void DoSessionInit(shared_ptr cInode, shared_ptr unique_lock lck(cInode->openLock); *openFinish = true; } - cond->notify_one(); *err = CloudError::CK_LOCAL_ERROR; + cond->notify_one(); return; } *err = session->InitSession(); @@ -877,7 +874,8 @@ static void LoadCacheFileIndex(shared_ptr cInode, struct FuseData *d cInode->cacheFileIndex = std::move(mp); } -static int DoCloudOpen(shared_ptr cInode, struct fuse_file_info *fi, struct FuseData *data) +static int DoCloudOpen(shared_ptr cInode, struct fuse_file_info *fi, + struct FuseData *data, shared_ptr cloudFdInfo) { auto error = make_shared(); auto openFinish = make_shared(false); @@ -900,7 +898,7 @@ static int DoCloudOpen(shared_ptr cInode, struct fuse_file_info *fi, FaultType::OPEN_CLOUD_FILE_TIMEOUT, ENETUNREACH, msg}); return -ENETUNREACH; } - return HandleOpenResult(*error, data, cInode, fi); + return HandleOpenResult(*error, data, cInode, fi, cloudFdInfo); } static bool IsLocalFile(struct FuseData *data, shared_ptr cInode) @@ -918,7 +916,7 @@ static bool NeedReCloudOpen(struct FuseData *data, shared_ptr cInode } static void HandleReopen(fuse_req_t req, struct FuseData *data, shared_ptr cInode, - struct fuse_file_info *fi) + struct fuse_file_info *fi, shared_ptr cloudFdInfo) { do { if (cInode->mBase->fileType == FILE_TYPE_CONTENT) { @@ -940,6 +938,7 @@ static void HandleReopen(fuse_req_t req, struct FuseData *data, shared_ptr lock(data->cacheLock); data->cloudFdCache[fi->fh]->fdsan = reinterpret_cast(fdsan); } while (0); @@ -976,7 +975,7 @@ static void EraseCloudFdCache(FuseData *data, uint64_t key) } static void CloudOpenHelper(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, - struct FuseData *data, shared_ptr& cInode) + struct FuseData *data, shared_ptr& cInode, shared_ptr cloudFdInfo) { pid_t pid = GetPidFromTid(req->ctx.pid); string recordId = MetaFileMgr::GetInstance().CloudIdToRecordId(cInode->mBase->cloudId); @@ -1004,7 +1003,7 @@ static void CloudOpenHelper(fuse_req_t req, fuse_ino_t ino, struct fuse_file_inf GetAssetKey(cInode->mBase->fileType), GetAssetPath(cInode, data)); if (cInode->readSession) { cInode->readSession->SetPrepareTraceId(prepareTraceId); - auto ret = DoCloudOpen(cInode, fi, data); + auto ret = DoCloudOpen(cInode, fi, data, cloudFdInfo); if (ret == 0) { fuse_reply_open(req, fi); } else { @@ -1025,7 +1024,7 @@ static void CloudOpenHelper(fuse_req_t req, fuse_ino_t ino, struct fuse_file_inf CLOUD_FILE_FAULT_REPORT(CloudFileFaultInfo{PHOTOS_BUNDLE_NAME, FaultOperation::OPEN, FaultType::DRIVERKIT, EPERM, "readSession is null or fix size fail"}); } else { - HandleReopen(req, data, cInode, fi); + HandleReopen(req, data, cInode, fi, cloudFdInfo); } wSesLock.unlock(); } @@ -1043,12 +1042,12 @@ static void CloudOpen(fuse_req_t req, fuse_ino_t ino, return; } { - std::shared_lock lock(data->cacheLock); + std::unique_lock lock(data->cacheLock); data->fileId++; - fi->fh = static_cast(data->fileId); + fi->fh = data->fileId; data->cloudFdCache[fi->fh] = std::make_shared(); } - CloudOpenHelper(req, ino, fi, data, cInode); + CloudOpenHelper(req, ino, fi, data, cInode, data->cloudFdCache[fi->fh]); } static void DeleteFdsan(shared_ptr cloudFdInfo) @@ -1740,9 +1739,11 @@ static void CloudRead(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, } std::string appId = ""; auto cloudFdInfo = FindKeyInCloudFdCache(data, fi->fh); - if (cloudFdInfo->fdsan != UINT64_MAX) { - CloudReadOnLocalFile(req, buf, size, off, cloudFdInfo->fdsan); - return; + if (cloudFdInfo != nullptr) { + if (cloudFdInfo->fdsan != UINT64_MAX) { + CloudReadOnLocalFile(req, buf, size, off, cloudFdInfo->fdsan); + return; + } } appId = cloudFdInfo->appId;