1/****************************************************************************
2 * fs/driver/fs_registerblockdriver.c
3 *
4 * Copyright (c) 2023 Huawei Device Co., Ltd. All rights reserved.
5 * Based on NuttX originally from nuttx source (nuttx/fs/ and nuttx/drivers/)
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 ****************************************************************************/
20
21/****************************************************************************
22 * Included Files
23 ****************************************************************************/
24
25#include "vfs_config.h"
26#include "sys/types.h"
27#include "errno.h"
28#include "fs/driver.h"
29#include "vnode.h"
30#include "string.h"
31#include "path_cache.h"
32#include "vnode.h"
33#include "limits.h"
34
35/****************************************************************************
36 * Public Functions
37 ****************************************************************************/
38
39/****************************************************************************
40 * Name: register_blockdriver
41 *
42 * Description:
43 *   Register a block driver vnode the pseudo file system.
44 *
45 * Input parameters:
46 *   path - The path to the vnode to create
47 *   bops - The block driver operations structure
48 *   mode - inmode priviledges (not used)
49 *   priv - Private, user data that will be associated with the vnode.
50 *
51 * Returned Value:
52 *   Zero on success (with the vnode point in 'vnode'); A negated errno
53 *   value is returned on a failure (all error values returned by
54 *   vnode_reserve):
55 *
56 *   EINVAL - 'path' is invalid for this operation
57 *   EEXIST - An vnode already exists at 'path'
58 *   ENOMEM - Failed to allocate in-memory resources for the operation
59 *
60 ****************************************************************************/
61
62int register_blockdriver(const char *path,
63                         const struct block_operations *bops,
64                         mode_t mode, void *priv)
65{
66  struct Vnode *vp = NULL;
67  int ret;
68
69  if (path == NULL || strlen(path) >= PATH_MAX || strncmp("/dev/", path, DEV_PATH_LEN) != 0)
70    {
71      return -EINVAL;
72    }
73
74  /* Insert an vnode for the device driver -- we need to hold the vnode
75   * semaphore to prevent access to the tree while we this.  This is because
76   * we will have a momentarily bad true until we populate the vnode with
77   * valid data.
78   */
79
80  struct drv_data *data = (struct drv_data *)zalloc(sizeof(struct drv_data));
81
82  data->ops = (void *)bops;
83  data->mode = mode;
84  data->priv = priv;
85
86  VnodeHold();
87  ret = VnodeLookup(path, &vp, V_CREATE | V_DUMMY);
88  if (ret == OK)
89    {
90      /* We have it, now populate it with block driver specific information. */
91
92      vp->type = VNODE_TYPE_BLK;
93      vp->data = data;
94      vp->mode = mode;
95    }
96
97  VnodeDrop();
98  return ret;
99}
100