From 12395f2a6f5b25d1257d3ca25d4104017363ad56 Mon Sep 17 00:00:00 2001 From: WDY Date: Mon, 25 Aug 2025 16:02:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E8=AF=BB=E9=99=90=E9=80=9F=E5=9B=9E?= =?UTF-8?q?=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: WDY --- .../src/cloud_disk/file_operations_cloud.cpp | 2 +- .../src/fuse_manager/fuse_manager.cpp | 47 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp index 4b2779245..c66f5abca 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp @@ -460,8 +460,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 bc9920e43..a1ef03006 100644 --- a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp +++ b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp @@ -243,7 +243,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; @@ -674,7 +674,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); @@ -708,17 +709,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(data->cacheLock); 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) { @@ -729,7 +726,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"}); @@ -759,8 +756,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(); @@ -879,7 +876,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); @@ -903,7 +901,7 @@ static int DoCloudOpen(shared_ptr cInode, struct fuse_file_info *fi, cInode->readSession->CancelSession(); return -ENETUNREACH; } - return HandleOpenResult(*error, data, cInode, fi); + return HandleOpenResult(*error, data, cInode, fi, cloudFdInfo); } static bool IsLocalFile(struct FuseData *data, shared_ptr cInode) @@ -926,7 +924,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) { @@ -948,6 +946,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); @@ -987,7 +986,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, IsHdc(data)); @@ -1016,7 +1015,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 { @@ -1037,7 +1036,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(); } @@ -1055,12 +1054,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) @@ -1758,9 +1757,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; -- Gitee