1 /****************************************************************************
2 * fs/driver/fs_registerblockdriver.c
3 *
4 * Copyright (C) 2007-2009, 2012 Gregory Nutt. All rights reserved.
5 * Author: Gregory Nutt <gnutt@nuttx.org>
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * 3. Neither the name NuttX nor the names of its contributors may be
18 * used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *
34 ****************************************************************************/
35
36 /****************************************************************************
37 * Included Files
38 ****************************************************************************/
39
40 #include "vfs_config.h"
41 #include "sys/types.h"
42 #include "errno.h"
43 #include "fs/driver.h"
44 #include "vnode.h"
45 #include "string.h"
46 #include "path_cache.h"
47 #include "vnode.h"
48 #include "limits.h"
49
50 /****************************************************************************
51 * Public Functions
52 ****************************************************************************/
53
54 /****************************************************************************
55 * Name: register_blockdriver
56 *
57 * Description:
58 * Register a block driver vnode the pseudo file system.
59 *
60 * Input parameters:
61 * path - The path to the vnode to create
62 * bops - The block driver operations structure
63 * mode - inmode priviledges (not used)
64 * priv - Private, user data that will be associated with the vnode.
65 *
66 * Returned Value:
67 * Zero on success (with the vnode point in 'vnode'); A negated errno
68 * value is returned on a failure (all error values returned by
69 * vnode_reserve):
70 *
71 * EINVAL - 'path' is invalid for this operation
72 * EEXIST - An vnode already exists at 'path'
73 * ENOMEM - Failed to allocate in-memory resources for the operation
74 *
75 ****************************************************************************/
76
register_blockdriver(const char * path,const struct block_operations * bops,mode_t mode,void * priv)77 int register_blockdriver(const char *path,
78 const struct block_operations *bops,
79 mode_t mode, void *priv)
80 {
81 struct Vnode *vp = NULL;
82 int ret;
83
84 if (path == NULL || strlen(path) >= PATH_MAX || strncmp("/dev/", path, DEV_PATH_LEN) != 0)
85 {
86 return -EINVAL;
87 }
88
89 /* Insert an vnode for the device driver -- we need to hold the vnode
90 * semaphore to prevent access to the tree while we this. This is because
91 * we will have a momentarily bad true until we populate the vnode with
92 * valid data.
93 */
94
95 struct drv_data *data = (struct drv_data *)zalloc(sizeof(struct drv_data));
96
97 data->ops = (void *)bops;
98 data->mode = mode;
99 data->priv = priv;
100
101 VnodeHold();
102 ret = VnodeLookup(path, &vp, V_CREATE | V_DUMMY);
103 if (ret == OK)
104 {
105 /* We have it, now populate it with block driver specific information. */
106
107 vp->type = VNODE_TYPE_BLK;
108 vp->data = data;
109 vp->mode = mode;
110 }
111
112 VnodeDrop();
113 return ret;
114 }
115