1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "file_operations_base.h"
16 #include "cloud_disk_inode.h"
17 #include "file_operations_helper.h"
18
19 #include <cerrno>
20
21 #include "cloud_file_fault_event.h"
22 #include "utils_log.h"
23
24 namespace OHOS {
25 namespace FileManagement {
26 namespace CloudDisk {
27 using namespace std;
28 using namespace OHOS::FileManagement::CloudFile;
Lookup(fuse_req_t req,fuse_ino_t parent,const char * name)29 void FileOperationsBase::Lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
30 {
31 LOGE("Lookup operation is not supported!");
32 fuse_reply_err(req, ENOSYS);
33 }
34
Access(fuse_req_t req,fuse_ino_t ino,int mask)35 void FileOperationsBase::Access(fuse_req_t req, fuse_ino_t ino, int mask)
36 {
37 LOGE("Access operation is not supported!");
38 fuse_reply_err(req, ENOSYS);
39 }
40
GetAttr(fuse_req_t req,fuse_ino_t ino,struct fuse_file_info * fi)41 void FileOperationsBase::GetAttr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
42 {
43 LOGE("GetAttr operation is not supported!");
44 fuse_reply_err(req, ENOSYS);
45 }
46
Open(fuse_req_t req,fuse_ino_t ino,struct fuse_file_info * fi)47 void FileOperationsBase::Open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
48 {
49 LOGE("Open operation is not supported!");
50 fuse_reply_err(req, ENOSYS);
51 }
52
Forget(fuse_req_t req,fuse_ino_t ino,uint64_t nLookup)53 void FileOperationsBase::Forget(fuse_req_t req, fuse_ino_t ino, uint64_t nLookup)
54 {
55 auto data = reinterpret_cast<struct CloudDiskFuseData *>(fuse_req_userdata(req));
56 auto node = FileOperationsHelper::FindCloudDiskInode(data, static_cast<int64_t>(ino));
57 if (node == nullptr) {
58 CLOUD_FILE_FAULT_REPORT(CloudFile::CloudFileFaultInfo{"", CloudFile::FaultOperation::FORGET,
59 CloudFile::FaultType::WARNING, EINVAL, "Forget an invalid inode"});
60 return (void) fuse_reply_none(req);
61 }
62 string localIdKey = std::to_string(node->parent) + node->fileName;
63 int64_t key = static_cast<int64_t>(ino);
64 FileOperationsHelper::PutCloudDiskInode(data, node, nLookup, key);
65 FileOperationsHelper::PutLocalId(data, node, nLookup, localIdKey);
66 fuse_reply_none(req);
67 }
68
ForgetMulti(fuse_req_t req,size_t count,struct fuse_forget_data * forgets)69 void FileOperationsBase::ForgetMulti(fuse_req_t req, size_t count, struct fuse_forget_data *forgets)
70 {
71 auto data = reinterpret_cast<struct CloudDiskFuseData *>(fuse_req_userdata(req));
72 for (size_t i = 0; i < count; i++) {
73 auto inoPtr = FileOperationsHelper::FindCloudDiskInode(data, static_cast<int64_t>(forgets[i].ino));
74 if (inoPtr == nullptr) {
75 CLOUD_FILE_FAULT_REPORT(CloudFile::CloudFileFaultInfo{"", CloudFile::FaultOperation::FORGETMULTI,
76 CloudFile::FaultType::WARNING, EINVAL, "ForgetMulti got an invalid inode"});
77 continue;
78 }
79 string localIdKey = std::to_string(inoPtr->parent) + inoPtr->fileName;
80 FileOperationsHelper::PutCloudDiskInode(data, inoPtr, forgets[i].nlookup, forgets[i].ino);
81 FileOperationsHelper::PutLocalId(data, inoPtr, forgets[i].nlookup, localIdKey);
82 }
83 fuse_reply_none(req);
84 }
85
MkNod(fuse_req_t req,fuse_ino_t parent,const char * name,mode_t mode,dev_t rdev)86 void FileOperationsBase::MkNod(fuse_req_t req, fuse_ino_t parent, const char *name,
87 mode_t mode, dev_t rdev)
88 {
89 LOGE("MkNod operation is not supported!");
90 fuse_reply_err(req, ENOSYS);
91 }
92
Create(fuse_req_t req,fuse_ino_t parent,const char * name,mode_t mode,struct fuse_file_info * fi)93 void FileOperationsBase::Create(fuse_req_t req, fuse_ino_t parent, const char *name,
94 mode_t mode, struct fuse_file_info *fi)
95 {
96 LOGE("Create operation is not supported!");
97 fuse_reply_err(req, ENOSYS);
98 }
99
ReadDir(fuse_req_t req,fuse_ino_t ino,size_t size,off_t off,struct fuse_file_info * fi)100 void FileOperationsBase::ReadDir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
101 struct fuse_file_info *fi)
102 {
103 LOGE("ReadDir operation is not supported!");
104 fuse_reply_err(req, ENOSYS);
105 }
106
SetXattr(fuse_req_t req,fuse_ino_t ino,const char * name,const char * value,size_t size,int flags)107 void FileOperationsBase::SetXattr(fuse_req_t req, fuse_ino_t ino, const char *name,
108 const char *value, size_t size, int flags)
109 {
110 LOGE("SetXattr operation is not supported!");
111 fuse_reply_err(req, EINVAL);
112 }
113
GetXattr(fuse_req_t req,fuse_ino_t ino,const char * name,size_t size)114 void FileOperationsBase::GetXattr(fuse_req_t req, fuse_ino_t ino, const char *name,
115 size_t size)
116 {
117 LOGE("GetXattr operation is not supported!");
118 fuse_reply_err(req, EINVAL);
119 }
120
MkDir(fuse_req_t req,fuse_ino_t parent,const char * name,mode_t mode)121 void FileOperationsBase::MkDir(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode)
122 {
123 LOGE("MkDir operation is not supported!");
124 fuse_reply_err(req, ENOSYS);
125 }
126
RmDir(fuse_req_t req,fuse_ino_t parent,const char * name)127 void FileOperationsBase::RmDir(fuse_req_t req, fuse_ino_t parent, const char *name)
128 {
129 LOGE("RmDir operation is not supported!");
130 fuse_reply_err(req, ENOSYS);
131 }
132
Unlink(fuse_req_t req,fuse_ino_t parent,const char * name)133 void FileOperationsBase::Unlink(fuse_req_t req, fuse_ino_t parent, const char *name)
134 {
135 LOGE("Unlink operation is not supported!");
136 fuse_reply_err(req, ENOSYS);
137 }
138
Rename(fuse_req_t req,fuse_ino_t parent,const char * name,fuse_ino_t newParent,const char * newName,unsigned int flags)139 void FileOperationsBase::Rename(fuse_req_t req, fuse_ino_t parent, const char *name,
140 fuse_ino_t newParent, const char *newName, unsigned int flags)
141 {
142 LOGE("Rename operation is not supported!");
143 fuse_reply_err(req, ENOSYS);
144 }
145
Read(fuse_req_t req,fuse_ino_t ino,size_t size,off_t offset,struct fuse_file_info * fi)146 void FileOperationsBase::Read(fuse_req_t req, fuse_ino_t ino, size_t size,
147 off_t offset, struct fuse_file_info *fi)
148 {
149 LOGE("Read operation is not supported!");
150 fuse_reply_err(req, ENOSYS);
151 }
152
WriteBuf(fuse_req_t req,fuse_ino_t ino,struct fuse_bufvec * bufv,off_t off,struct fuse_file_info * fi)153 void FileOperationsBase::WriteBuf(fuse_req_t req, fuse_ino_t ino, struct fuse_bufvec *bufv,
154 off_t off, struct fuse_file_info *fi)
155 {
156 LOGE("WriteBuf operation is not supported!");
157 fuse_reply_err(req, ENOSYS);
158 }
159
Release(fuse_req_t req,fuse_ino_t ino,struct fuse_file_info * fi)160 void FileOperationsBase::Release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
161 {
162 LOGE("Release operation is not supported!");
163 fuse_reply_err(req, ENOSYS);
164 }
SetAttr(fuse_req_t req,fuse_ino_t ino,struct stat * attr,int valid,struct fuse_file_info * fi)165 void FileOperationsBase::SetAttr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, int valid,
166 struct fuse_file_info *fi)
167 {
168 LOGE("SetAttr operation is not supported!");
169 fuse_reply_err(req, EINVAL);
170 }
Lseek(fuse_req_t req,fuse_ino_t ino,off_t off,int whence,struct fuse_file_info * fi)171 void FileOperationsBase::Lseek(fuse_req_t req, fuse_ino_t ino, off_t off, int whence,
172 struct fuse_file_info *fi)
173 {
174 LOGE("Lseek operation is not supported!");
175 fuse_reply_err(req, ENOSYS);
176 }
Ioctl(fuse_req_t req,fuse_ino_t ino,int cmd,void * arg,struct fuse_file_info * fi,unsigned flags,const void * inBuf,size_t inBufsz,size_t outBufsz)177 void FileOperationsBase::Ioctl(fuse_req_t req, fuse_ino_t ino, int cmd, void *arg, struct fuse_file_info *fi,
178 unsigned flags, const void *inBuf, size_t inBufsz, size_t outBufsz)
179 {
180 LOGE("Ioctl operation is not supported!");
181 fuse_reply_err(req, ENOSYS);
182 }
183 } // namespace CloudDisk
184 } // namespace FileManagement
185 } // namespace OHOS
186