From 039a51bde4bc3f21fe68c3f4cff966fde2532faa Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 9 May 2007 00:04:03 +0000 Subject: Add support for block drivers git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@206 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/fs/fs_inodereserve.c | 206 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 nuttx/fs/fs_inodereserve.c (limited to 'nuttx/fs/fs_inodereserve.c') diff --git a/nuttx/fs/fs_inodereserve.c b/nuttx/fs/fs_inodereserve.c new file mode 100644 index 000000000..ad010e21e --- /dev/null +++ b/nuttx/fs/fs_inodereserve.c @@ -0,0 +1,206 @@ +/************************************************************ + * fs_registerreserve.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************/ + +/************************************************************ + * Included Files + ************************************************************/ + +#include +#include +#include +#include +#include +#include "fs_internal.h" + +/************************************************************ + * Definitions + ************************************************************/ + +/************************************************************ + * Private Variables + ************************************************************/ + +/************************************************************ + * Public Variables + ************************************************************/ + +/************************************************************ + * Private Functions + ************************************************************/ + +/************************************************************ + * Name: inode_namelen + ************************************************************/ + +static int inode_namelen(const char *name) +{ + const char *tmp = name; + while(*tmp && *tmp != '/') tmp++; + return tmp - name; +} + +/************************************************************ + * Name: inode_namecpy + ************************************************************/ + +static void inode_namecpy(char *dest, const char *src) +{ + while(*src && *src != '/') *dest++ = *src++; + *dest='\0'; +} + +/************************************************************ + * Name: inode_alloc + ************************************************************/ + +static FAR struct inode *inode_alloc(const char *name) +{ + int namelen = inode_namelen(name); + FAR struct inode *node = (FAR struct inode*)zalloc(FSNODE_SIZE(namelen)); + if (node) + { + inode_namecpy(node->i_name, name); + } + return node; +} + +/************************************************************ + * Name: inode_insert + ************************************************************/ + +static void inode_insert(FAR struct inode *node, + FAR struct inode *peer, + FAR struct inode *parent) +{ + /* If peer is non-null, then new node simply goes to the right + * of that peer node. + */ + + if (peer) + { + node->i_peer = peer->i_peer; + peer->i_peer = node; + } + + /* If parent is non-null, then it must go at the head of its + * list of children. + */ + + else if (parent) + { + node->i_peer = parent->i_child; + parent->i_child = node; + } + + /* Otherwise, this must be the new root_inode */ + + else + { + node->i_peer = root_inode; + root_inode = node; + } +} + +/************************************************************ + * Public Functions + ************************************************************/ + +/************************************************************ + * Name: inode_reserve + ************************************************************/ + +FAR struct inode *inode_reserve(const char *path) +{ + const char *name = path; + FAR struct inode *left; + FAR struct inode *parent; + + if (!*path || path[0] != '/') + { + return NULL; + } + + /* Find the location to insert the new subtree */ + + if (inode_search(&name, &left, &parent, NULL) != NULL) + { + /* Is is an error if the node already exists in the tree */ + + return NULL; + } + + /* Now we now where to insert the subtree */ + + for (;;) + { + FAR struct inode *node; + + /* Create a new node -- we need to know if this is the + * the leaf node or some intermediary. We can find this + * by looking at the next name. + */ + + const char *next_name = inode_nextname(name); + if (*next_name) + { + /* Insert an operationless node */ + + node = inode_alloc(name); + if (node) + { + inode_insert(node, left, parent); + + /* Set up for the next time through the loop */ + + name = next_name; + left = NULL; + parent = node; + continue; + } + } + else + { + node = inode_alloc(name); + if (node) + { + inode_insert(node, left, parent); + return node; + } + } + + /* We get here on failures to allocate node memory */ + return NULL; + } +} -- cgit v1.2.3