1 /*
2 * Copyright (c) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 * http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2022-09-21
13 * Description: 文件系统vfs层
14 */
15
16 #include <stdlib.h>
17 #include "securec.h"
18 #include "vfs_maps.h"
19 #include "vfs_operations.h"
20 #include "prt_fs.h"
21
22 static struct TagFsMap *g_fsMap;
23
OsVfsGetFsMap(const char * fsType)24 struct TagFsMap *OsVfsGetFsMap(const char *fsType)
25 {
26 struct TagFsMap *curr = g_fsMap;
27 while (curr != NULL) {
28 if ((curr->fsType != NULL) && (fsType != NULL) &&
29 (strcmp(curr->fsType, fsType) == 0)) {
30 return curr;
31 }
32 curr = curr->next;
33 }
34 return NULL;
35 }
36
OsVfsFsMgtDisk(const char * dev,const char * fsType,S32 * lengthArray,S32 partNum)37 S32 OsVfsFsMgtDisk(const char *dev, const char *fsType, S32 *lengthArray, S32 partNum)
38 {
39 S32 ret = FS_OK;
40 (void)OsVfsLock();
41 struct TagFsMap *fMap = OsVfsGetFsMap(fsType);
42 if ((fMap != NULL) && (fMap->fsMgt != NULL) && (fMap->fsMgt->fdisk != NULL)) {
43 ret = fMap->fsMgt->fdisk(dev, lengthArray, partNum);
44 }
45 (void)OsVfsUnlock();
46 return ret;
47 }
48
OsVfsFsMgtFormat(const char * partName,char * fsType,void * data)49 S32 OsVfsFsMgtFormat(const char *partName, char *fsType, void *data)
50 {
51 S32 ret = FS_OK;
52 (void)OsVfsLock();
53 struct TagFsMap *fMap = OsVfsGetFsMap(fsType);
54 if ((fMap != NULL) && (fMap->fsMgt != NULL) && (fMap->fsMgt->format != NULL)) {
55 ret = fMap->fsMgt->format(partName, data);
56 }
57 (void)OsVfsUnlock();
58 return ret;
59 }
60
OsFsRegister(const char * fsType,struct TagMountOps * fsMops,struct TagFileOps * fsFops,struct TagFsManagement * fsMgt)61 S32 OsFsRegister(const char *fsType, struct TagMountOps *fsMops,
62 struct TagFileOps *fsFops, struct TagFsManagement *fsMgt)
63 {
64 if ((fsMops == NULL) || (fsFops == NULL)) {
65 return FS_NOK;
66 }
67
68 struct TagFsMap *newfs = (struct TagFsMap *)malloc(sizeof(struct TagFsMap));
69 if (newfs == NULL) {
70 return FS_NOK;
71 }
72 if (memset_s(newfs, sizeof(struct TagFsMap), 0, sizeof(struct TagFsMap)) != EOK) {
73 free(newfs);
74 return FS_NOK;
75 }
76
77 newfs->fsType = strdup(fsType);
78 if (newfs->fsType == NULL) {
79 free(newfs);
80 return FS_NOK;
81 }
82
83 newfs->fsMops = fsMops;
84 newfs->fsFops = fsFops;
85 newfs->fsMgt = fsMgt;
86 newfs->fsRefs = 0;
87
88 (void)OsVfsLock();
89 newfs->next = g_fsMap;
90 g_fsMap = newfs;
91
92 OsVfsUnlock();
93 return FS_OK;
94 }
95