diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp index 05f50ab32ea6a40de1256bf20a3a2b2f2ed57371..76e011f3ece3f8c68bb2e840edd959389129aaa3 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp @@ -154,7 +154,11 @@ void FileOperationsCloud::Forget(fuse_req_t req, fuse_ino_t ino, uint64_t nLooku return (void) fuse_reply_none(req); } auto inoPtr = reinterpret_cast(ino); - shared_ptr node = FileOperationsHelper::FindCloudDiskInode(data, inoPtr->cloudId); + string key = inoPtr->cloudId; + if (inoPtr->layer != CLOUD_DISK_INODE_OTHER_LAYER) { + key = inoPtr->path; + } + shared_ptr node = FileOperationsHelper::FindCloudDiskInode(data, key); FileOperationsHelper::PutCloudDiskInode(data, node, nLookup); fuse_reply_none(req); } @@ -168,7 +172,11 @@ void FileOperationsCloud::ForgetMulti(fuse_req_t req, size_t count, struct fuse_ return (void) fuse_reply_none(req); } auto inoPtr = reinterpret_cast(forgets[i].ino); - shared_ptr node = FileOperationsHelper::FindCloudDiskInode(data, inoPtr->cloudId); + string key = inoPtr->cloudId; + if (inoPtr->layer != CLOUD_DISK_INODE_OTHER_LAYER) { + key = inoPtr->path; + } + shared_ptr node = FileOperationsHelper::FindCloudDiskInode(data, key); FileOperationsHelper::PutCloudDiskInode(data, node, forgets[i].nlookup); } fuse_reply_none(req); diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp index 1b56ba88e38a2e17d7d85e5f2839dcde5aa68e04..a6720d2e0f7456cff9f38f2f347089692b0167aa 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp @@ -143,6 +143,10 @@ void FileOperationsHelper::PutCloudDiskInode(struct CloudDiskFuseData *data, shared_ptr inoPtr, uint64_t num) { std::unique_lock wLock(data->cacheLock, std::defer_lock); + if (inoPtr == nullptr) { + LOGD("Get an invalid inode!"); + return; + } inoPtr->refCount -= num; if (inoPtr->refCount == 0) { LOGD("node released: %{public}s", inoPtr->path.c_str());