xref: /kernel/uniproton/src/fs/vfs/vfs_partition.c (revision 54568cb3)
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#include "stdlib.h"
16#include "string.h"
17#include "securec.h"
18#include "vfs_partition.h"
19#include "vfs_operations.h"
20#include "prt_fs.h"
21#include "vfs_maps.h"
22#include "vfs_mount.h"
23
24static struct TagDeviceDesc *g_deviceList;
25
26S32 OsGetPartIdByPartName(const char *partName)
27{
28    if (partName == NULL) {
29        return FS_NOK;
30    }
31
32    /* p 字符后面是 partId */
33    char *p = strrchr(partName, 'p');
34    if (p + 1 != NULL) {
35        return atoi(p + 1);
36    }
37
38    return FS_NOK;
39}
40
41S32 OsGetDevIdByDevName(const char *dev)
42{
43    if (dev == NULL) {
44        return FS_NOK;
45    }
46
47    /* dev后面是 deviceId */
48    char *p = (char *)dev + strlen(dev) - 1;
49    if (p != NULL) {
50        return atoi(p);
51    }
52
53    return FS_NOK;
54}
55
56struct TagDeviceDesc *OsGetDeviceList(void)
57{
58    return g_deviceList;
59}
60
61static void OsFreeDeviceDesc(struct TagDeviceDesc *prev)
62{
63    if (prev == NULL) {
64        return;
65    }
66    if (prev->dDev != NULL) {
67        free((void *)prev->dDev);
68    }
69    if (prev->dFsType != NULL) {
70        free((void *)prev->dFsType);
71    }
72    if (prev->dAddrArray != NULL) {
73        free((void *)prev->dAddrArray);
74    }
75    if (prev->dLengthArray != NULL) {
76        free((void *)prev->dLengthArray);
77    }
78    free(prev);
79}
80
81static S32 OsAddDevice(const char *dev, const char *fsType, S32 *lengthArray,
82                                   S32 *addrArray, S32 partNum)
83{
84    struct TagDeviceDesc *prev = NULL;
85    for (prev = g_deviceList; prev != NULL; prev = prev->dNext) {
86        if (strcmp(prev->dDev, dev) == 0) {
87            errno = -EEXIST;
88            return FS_NOK;
89        }
90    }
91
92    if (addrArray == NULL) {
93        errno = -EFAULT;
94        return FS_NOK;
95    }
96
97    prev = (struct TagDeviceDesc *)malloc(sizeof(struct TagDeviceDesc));
98    if (prev == NULL) {
99        errno = -ENOMEM;
100        return FS_NOK;
101    }
102    prev->dDev = strdup(dev);
103    prev->dFsType  = strdup(fsType);
104    prev->dAddrArray = (S32 *)malloc(partNum * sizeof(S32));
105    if (prev->dDev == NULL || prev->dFsType == NULL || prev->dAddrArray == NULL) {
106        OsFreeDeviceDesc(prev);
107        errno = -ENOMEM;
108        return FS_NOK;
109    }
110    (void)memcpy_s(prev->dAddrArray, partNum * sizeof(S32), addrArray, partNum * sizeof(S32));
111
112    if (lengthArray != NULL) {
113        prev->dLengthArray = (S32 *)malloc(partNum * sizeof(S32));
114        if (prev->dLengthArray == NULL) {
115            OsFreeDeviceDesc(prev);
116            errno = -ENOMEM;
117            return FS_NOK;
118        }
119        (void)memcpy_s(prev->dLengthArray, partNum * sizeof(S32), lengthArray, partNum * sizeof(S32));
120    }
121
122    prev->dNext = g_deviceList;
123    prev->dPartNum = partNum;
124    g_deviceList = prev;
125    return FS_OK;
126}
127
128
129S32 PRT_DiskPartition(const char *dev, const char *fsType, S32 *lengthArray,
130                      S32 *addrArray, S32 partNum)
131{
132    S32 ret = OsVfsFsMgtDisk(dev, fsType, lengthArray, partNum);
133    if (ret != FS_OK) {
134        return ret;
135    }
136
137    return OsAddDevice(dev, fsType, lengthArray, addrArray, partNum);
138}
139
140S32 PRT_PartitionFormat(const char *partName, char *fsType, void *data)
141{
142    S32 ret = OsVfsFindMountPoint(fsType);
143    if (ret == FS_OK) {
144        errno = EBUSY;
145        return FS_NOK;
146    }
147
148    return OsVfsFsMgtFormat(partName, fsType, data);
149}
150