libvtreefs: convert to KNF
Change-Id: I81bdf05c9b630a0cbb0ac573d36d4f59f8137199
This commit is contained in:
parent
f92baba71c
commit
693ad767e8
12 changed files with 300 additions and 324 deletions
|
@ -32,23 +32,26 @@ struct fs_hooks {
|
||||||
int (*message_hook)(message *m);
|
int (*message_hook)(message *m);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct inode *add_inode(struct inode *parent, char *name, index_t index,
|
extern struct inode *add_inode(struct inode *parent, const char *name,
|
||||||
struct inode_stat *stat, index_t nr_indexed_entries, cbdata_t cbdata);
|
index_t index, const struct inode_stat *stat,
|
||||||
|
index_t nr_indexed_entries, cbdata_t cbdata);
|
||||||
extern void delete_inode(struct inode *inode);
|
extern void delete_inode(struct inode *inode);
|
||||||
|
|
||||||
extern struct inode *get_inode_by_name(struct inode *parent, char *name);
|
extern struct inode *get_inode_by_name(const struct inode *parent,
|
||||||
extern struct inode *get_inode_by_index(struct inode *parent, index_t index);
|
const char *name);
|
||||||
|
extern struct inode *get_inode_by_index(const struct inode *parent,
|
||||||
|
index_t index);
|
||||||
|
|
||||||
extern char const *get_inode_name(struct inode *inode);
|
extern const char *get_inode_name(const struct inode *inode);
|
||||||
extern index_t get_inode_index(struct inode *inode);
|
extern index_t get_inode_index(const struct inode *inode);
|
||||||
extern cbdata_t get_inode_cbdata(struct inode *inode);
|
extern cbdata_t get_inode_cbdata(const struct inode *inode);
|
||||||
|
|
||||||
extern struct inode *get_root_inode(void);
|
extern struct inode *get_root_inode(void);
|
||||||
extern struct inode *get_parent_inode(struct inode *inode);
|
extern struct inode *get_parent_inode(const struct inode *inode);
|
||||||
extern struct inode *get_first_inode(struct inode *parent);
|
extern struct inode *get_first_inode(const struct inode *parent);
|
||||||
extern struct inode *get_next_inode(struct inode *previous);
|
extern struct inode *get_next_inode(const struct inode *previous);
|
||||||
|
|
||||||
extern void get_inode_stat(struct inode *inode, struct inode_stat *stat);
|
extern void get_inode_stat(const struct inode *inode, struct inode_stat *stat);
|
||||||
extern void set_inode_stat(struct inode *inode, struct inode_stat *stat);
|
extern void set_inode_stat(struct inode *inode, struct inode_stat *stat);
|
||||||
|
|
||||||
extern void start_vtreefs(struct fs_hooks *hooks, unsigned int nr_inodes,
|
extern void start_vtreefs(struct fs_hooks *hooks, unsigned int nr_inodes,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* VTreeFS - inode.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - inode.c - inode management */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
|
@ -19,19 +19,17 @@ static LIST_HEAD(index_head, inode) *parent_index_head;
|
||||||
#define CHECK_INODE(node) \
|
#define CHECK_INODE(node) \
|
||||||
do { \
|
do { \
|
||||||
assert(node >= &inode[0] && node < &inode[nr_inodes]); \
|
assert(node >= &inode[0] && node < &inode[nr_inodes]); \
|
||||||
assert(node == &inode[0] || \
|
assert(node == &inode[0] || node->i_parent != NULL || \
|
||||||
node->i_parent != NULL || \
|
(node->i_flags & I_DELETED)); \
|
||||||
(node->i_flags & I_DELETED)); \
|
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* init_inodes *
|
* Initialize the inode-related state.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void init_inodes(unsigned int inodes, struct inode_stat *stat,
|
void
|
||||||
|
init_inodes(unsigned int inodes, struct inode_stat * stat,
|
||||||
index_t nr_indexed_entries)
|
index_t nr_indexed_entries)
|
||||||
{
|
{
|
||||||
/* Initialize the inode-related state.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -51,15 +49,15 @@ void init_inodes(unsigned int inodes, struct inode_stat *stat,
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
printf("VTREEFS: allocated %d+%d+%d bytes\n",
|
printf("VTREEFS: allocated %d+%d+%d bytes\n",
|
||||||
nr_inodes * sizeof(inode[0]),
|
nr_inodes * sizeof(inode[0]),
|
||||||
nr_inodes * sizeof(parent_name_head[0]),
|
nr_inodes * sizeof(parent_name_head[0]),
|
||||||
nr_inodes * sizeof(parent_index_head[0]));
|
nr_inodes * sizeof(parent_index_head[0]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialize the free/unused list. */
|
/* Initialize the free/unused list. */
|
||||||
TAILQ_INIT(&unused_inodes);
|
TAILQ_INIT(&unused_inodes);
|
||||||
|
|
||||||
/* Add free inodes to the unused/free list. Skip the root inode. */
|
/* Add free inodes to the unused/free list. Skip the root inode. */
|
||||||
for (i = 1; i < nr_inodes; i++) {
|
for (i = 1; i < nr_inodes; i++) {
|
||||||
node = &inode[i];
|
node = &inode[i];
|
||||||
|
|
||||||
|
@ -87,13 +85,12 @@ void init_inodes(unsigned int inodes, struct inode_stat *stat,
|
||||||
node->i_cbdata = NULL;
|
node->i_cbdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* cleanup_inodes *
|
* Clean up the inode-related state.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void cleanup_inodes(void)
|
void
|
||||||
|
cleanup_inodes(void)
|
||||||
{
|
{
|
||||||
/* Clean up the inode-related state.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Free the inode and hash tables. */
|
/* Free the inode and hash tables. */
|
||||||
free(parent_index_head);
|
free(parent_index_head);
|
||||||
|
@ -101,18 +98,16 @@ void cleanup_inodes(void)
|
||||||
free(inode);
|
free(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* parent_name_hash *
|
* Return the hash value of <parent,name> tuple.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static int parent_name_hash(struct inode *parent, char *name)
|
static int
|
||||||
|
parent_name_hash(const struct inode * parent, const char *name)
|
||||||
{
|
{
|
||||||
/* Return the hash value of <parent,name> tuple.
|
unsigned int name_hash, parent_hash;
|
||||||
*/
|
|
||||||
unsigned int name_hash;
|
|
||||||
unsigned long parent_hash;
|
|
||||||
|
|
||||||
/* The parent hash is a simple array entry; find its index. */
|
/* The parent hash is a simple array entry; find its index. */
|
||||||
parent_hash = parent - &inode[0];
|
parent_hash = (unsigned int)(parent - &inode[0]);
|
||||||
|
|
||||||
/* Use the sdbm algorithm to hash the name. */
|
/* Use the sdbm algorithm to hash the name. */
|
||||||
name_hash = sdbm_hash(name, strlen(name));
|
name_hash = sdbm_hash(name, strlen(name));
|
||||||
|
@ -120,25 +115,24 @@ static int parent_name_hash(struct inode *parent, char *name)
|
||||||
return (parent_hash ^ name_hash) % nr_inodes;
|
return (parent_hash ^ name_hash) % nr_inodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* parent_index_hash *
|
* Return the hash value of a <parent,index> tuple.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static int parent_index_hash(struct inode *parent, index_t index)
|
static int
|
||||||
|
parent_index_hash(const struct inode * parent, index_t index)
|
||||||
{
|
{
|
||||||
/* Return the hash value of a <parent,index> tuple.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return ((parent - &inode[0]) ^ index) % nr_inodes;
|
return ((int)(parent - &inode[0]) ^ index) % nr_inodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* purge_inode *
|
* Delete a deletable inode to make room for a new inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static void purge_inode(struct inode *parent)
|
static void
|
||||||
|
purge_inode(struct inode * parent)
|
||||||
{
|
{
|
||||||
/* Delete a deletable inode to make room for a new inode.
|
/*
|
||||||
*/
|
* An inode is deletable if:
|
||||||
/* An inode is deletable if:
|
|
||||||
* - it is in use;
|
* - it is in use;
|
||||||
* - it is indexed;
|
* - it is indexed;
|
||||||
* - it is not the given parent inode;
|
* - it is not the given parent inode;
|
||||||
|
@ -153,7 +147,8 @@ static void purge_inode(struct inode *parent)
|
||||||
|
|
||||||
assert(TAILQ_EMPTY(&unused_inodes));
|
assert(TAILQ_EMPTY(&unused_inodes));
|
||||||
|
|
||||||
/* This should not happen often enough to warrant an extra linked list,
|
/*
|
||||||
|
* This should not happen often enough to warrant an extra linked list,
|
||||||
* especially as maintenance of that list would be rather error-prone..
|
* especially as maintenance of that list would be rather error-prone..
|
||||||
*/
|
*/
|
||||||
for (count = 0; count < nr_inodes; count++) {
|
for (count = 0; count < nr_inodes; count++) {
|
||||||
|
@ -161,7 +156,7 @@ static void purge_inode(struct inode *parent)
|
||||||
last_checked = (last_checked + 1) % nr_inodes;
|
last_checked = (last_checked + 1) % nr_inodes;
|
||||||
|
|
||||||
if (node != parent && node->i_index != NO_INDEX &&
|
if (node != parent && node->i_index != NO_INDEX &&
|
||||||
node->i_count == 0 && TAILQ_EMPTY(&node->i_children)) {
|
node->i_count == 0 && TAILQ_EMPTY(&node->i_children)) {
|
||||||
|
|
||||||
assert(!(node->i_flags & I_DELETED));
|
assert(!(node->i_flags & I_DELETED));
|
||||||
|
|
||||||
|
@ -172,15 +167,14 @@ static void purge_inode(struct inode *parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* add_inode *
|
* Add an inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *add_inode(struct inode *parent, char *name,
|
struct inode *
|
||||||
index_t index, struct inode_stat *stat, index_t nr_indexed_entries,
|
add_inode(struct inode * parent, const char * name, index_t index,
|
||||||
|
const struct inode_stat * stat, index_t nr_indexed_entries,
|
||||||
cbdata_t cbdata)
|
cbdata_t cbdata)
|
||||||
{
|
{
|
||||||
/* Add an inode.
|
|
||||||
*/
|
|
||||||
struct inode *newnode;
|
struct inode *newnode;
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
|
@ -193,7 +187,7 @@ struct inode *add_inode(struct inode *parent, char *name,
|
||||||
assert(nr_indexed_entries >= 0);
|
assert(nr_indexed_entries >= 0);
|
||||||
assert(get_inode_by_name(parent, name) == NULL);
|
assert(get_inode_by_name(parent, name) == NULL);
|
||||||
|
|
||||||
/* Get a free inode. Free one up if necessary. */
|
/* Get a free inode. Free one up if necessary. */
|
||||||
if (TAILQ_EMPTY(&unused_inodes))
|
if (TAILQ_EMPTY(&unused_inodes))
|
||||||
purge_inode(parent);
|
purge_inode(parent);
|
||||||
|
|
||||||
|
@ -229,64 +223,59 @@ struct inode *add_inode(struct inode *parent, char *name,
|
||||||
return newnode;
|
return newnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_root_inode *
|
* Return the file system's root inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_root_inode(void)
|
struct inode *
|
||||||
|
get_root_inode(void)
|
||||||
{
|
{
|
||||||
/* Return the file system's root inode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The root node is always the first node in the inode table */
|
/* The root node is always the first node in the inode table. */
|
||||||
return &inode[0];
|
return &inode[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_name *
|
* Return the name that an inode has in its parent directory.
|
||||||
*===========================================================================*/
|
*/
|
||||||
char const *get_inode_name(struct inode *node)
|
const char *
|
||||||
|
get_inode_name(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return the name that an inode has in its parent directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
return node->i_name;
|
return node->i_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_index *
|
* Return the index that an inode has in its parent directory.
|
||||||
*===========================================================================*/
|
*/
|
||||||
index_t get_inode_index(struct inode *node)
|
index_t
|
||||||
|
get_inode_index(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return the index that an inode has in its parent directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
return node->i_index;
|
return node->i_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_cbdata *
|
* Return the callback data associated with the given inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
cbdata_t get_inode_cbdata(struct inode *node)
|
cbdata_t
|
||||||
|
get_inode_cbdata(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return the callback data associated with the given inode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
return node->i_cbdata;
|
return node->i_cbdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_parent_inode *
|
* Return an inode's parent inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_parent_inode(struct inode *node)
|
struct inode *
|
||||||
|
get_parent_inode(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return an inode's parent inode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
|
@ -297,13 +286,12 @@ struct inode *get_parent_inode(struct inode *node)
|
||||||
return node->i_parent;
|
return node->i_parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_first_inode *
|
* Return a directory's first (non-deleted) child inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_first_inode(struct inode *parent)
|
struct inode *
|
||||||
|
get_first_inode(const struct inode * parent)
|
||||||
{
|
{
|
||||||
/* Return a directory's first (non-deleted) child inode.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
|
||||||
CHECK_INODE(parent);
|
CHECK_INODE(parent);
|
||||||
|
@ -317,13 +305,12 @@ struct inode *get_first_inode(struct inode *parent)
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_next_inode *
|
* Return a directory's next (non-deleted) child inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_next_inode(struct inode *previous)
|
struct inode *
|
||||||
|
get_next_inode(const struct inode * previous)
|
||||||
{
|
{
|
||||||
/* Return a directory's next (non-deleted) child inode.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
|
||||||
CHECK_INODE(previous);
|
CHECK_INODE(previous);
|
||||||
|
@ -336,52 +323,48 @@ struct inode *get_next_inode(struct inode *previous)
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_number *
|
* Return the inode number of the given inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int get_inode_number(struct inode *node)
|
int
|
||||||
|
get_inode_number(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return the inode number of the given inode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
return (int) (node - &inode[0]) + 1;
|
return (int)(node - &inode[0]) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_stat *
|
* Retrieve an inode's status.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void get_inode_stat(struct inode *node, struct inode_stat *stat)
|
void
|
||||||
|
get_inode_stat(const struct inode * node, struct inode_stat * stat)
|
||||||
{
|
{
|
||||||
/* Retrieve an inode's status.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
*stat = node->i_stat;
|
*stat = node->i_stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* set_inode_stat *
|
* Set an inode's status.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void set_inode_stat(struct inode *node, struct inode_stat *stat)
|
void
|
||||||
|
set_inode_stat(struct inode * node, struct inode_stat * stat)
|
||||||
{
|
{
|
||||||
/* Set an inode's status.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
node->i_stat = *stat;
|
node->i_stat = *stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_by_name *
|
* Look up an inode using a <parent,name> tuple.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_inode_by_name(struct inode *parent, char *name)
|
struct inode *
|
||||||
|
get_inode_by_name(const struct inode * parent, const char * name)
|
||||||
{
|
{
|
||||||
/* Look up an inode using a <parent,name> tuple.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
|
@ -399,13 +382,12 @@ struct inode *get_inode_by_name(struct inode *parent, char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode_by_index *
|
* Look up an inode using a <parent,index> tuple.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_inode_by_index(struct inode *parent, index_t index)
|
struct inode *
|
||||||
|
get_inode_by_index(const struct inode * parent, index_t index)
|
||||||
{
|
{
|
||||||
/* Look up an inode using a <parent,index> tuple.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
|
@ -423,13 +405,12 @@ struct inode *get_inode_by_index(struct inode *parent, index_t index)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* find_inode *
|
* Retrieve an inode by inode number.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *find_inode(ino_t num)
|
struct inode *
|
||||||
|
find_inode(ino_t num)
|
||||||
{
|
{
|
||||||
/* Retrieve an inode by inode number.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
|
||||||
node = &inode[num - 1];
|
node = &inode[num - 1];
|
||||||
|
@ -439,13 +420,12 @@ struct inode *find_inode(ino_t num)
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* get_inode *
|
* Retrieve an inode by inode number, and increase its reference count.
|
||||||
*===========================================================================*/
|
*/
|
||||||
struct inode *get_inode(ino_t num)
|
struct inode *
|
||||||
|
get_inode(ino_t num)
|
||||||
{
|
{
|
||||||
/* Retrieve an inode by inode number, and increase its reference count.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
|
||||||
if ((node = find_inode(num)) == NULL)
|
if ((node = find_inode(num)) == NULL)
|
||||||
|
@ -455,46 +435,44 @@ struct inode *get_inode(ino_t num)
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* put_inode *
|
* Decrease an inode's reference count.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void put_inode(struct inode *node)
|
void
|
||||||
|
put_inode(struct inode * node)
|
||||||
{
|
{
|
||||||
/* Decrease an inode's reference count.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
assert(node->i_count > 0);
|
assert(node->i_count > 0);
|
||||||
|
|
||||||
node->i_count--;
|
node->i_count--;
|
||||||
|
|
||||||
/* If the inode is scheduled for deletion, and has no more references,
|
/*
|
||||||
|
* If the inode is scheduled for deletion, and has no more references,
|
||||||
* actually delete it now.
|
* actually delete it now.
|
||||||
*/
|
*/
|
||||||
if ((node->i_flags & I_DELETED) && node->i_count == 0)
|
if ((node->i_flags & I_DELETED) && node->i_count == 0)
|
||||||
delete_inode(node);
|
delete_inode(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* ref_inode *
|
* Increase an inode's reference count.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void ref_inode(struct inode *node)
|
void
|
||||||
|
ref_inode(struct inode * node)
|
||||||
{
|
{
|
||||||
/* Increase an inode's reference count.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
|
|
||||||
node->i_count++;
|
node->i_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* unlink_inode *
|
* Unlink the given node from its parent, if it is still linked in.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static void unlink_inode(struct inode *node)
|
static void
|
||||||
|
unlink_inode(struct inode * node)
|
||||||
{
|
{
|
||||||
/* Unlink the given node from its parent, if it is still linked in.
|
|
||||||
*/
|
|
||||||
struct inode *parent;
|
struct inode *parent;
|
||||||
|
|
||||||
assert(node->i_flags & I_DELETED);
|
assert(node->i_flags & I_DELETED);
|
||||||
|
@ -513,25 +491,24 @@ static void unlink_inode(struct inode *node)
|
||||||
delete_inode(parent);
|
delete_inode(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* delete_inode *
|
* Delete the given inode. If its reference count is nonzero, or it still has
|
||||||
*===========================================================================*/
|
* children that cannot be deleted for the same reason, keep the inode around
|
||||||
void delete_inode(struct inode *node)
|
* for the time being. If the node is a directory, keep around its parent so
|
||||||
|
* that we can still do a "cd .." out of it. For these reasons, this function
|
||||||
|
* may be called on an inode more than once before it is actually deleted.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
delete_inode(struct inode * node)
|
||||||
{
|
{
|
||||||
/* Delete the given inode. If its reference count is nonzero, or it
|
|
||||||
* still has children that cannot be deleted for the same reason, keep
|
|
||||||
* the inode around for the time being. If the node is a directory,
|
|
||||||
* keep around its parent so that we can still do a "cd .." out of it.
|
|
||||||
* For these reasons, this function may be called on an inode more than
|
|
||||||
* once before it is actually deleted.
|
|
||||||
*/
|
|
||||||
struct inode *cnode, *ctmp;
|
struct inode *cnode, *ctmp;
|
||||||
|
|
||||||
CHECK_INODE(node);
|
CHECK_INODE(node);
|
||||||
assert(node != &inode[0]);
|
assert(node != &inode[0]);
|
||||||
|
|
||||||
/* If the inode was not already scheduled for deletion,
|
/*
|
||||||
* partially remove the node.
|
* If the inode was not already scheduled for deletion, partially
|
||||||
|
* remove the node.
|
||||||
*/
|
*/
|
||||||
if (!(node->i_flags & I_DELETED)) {
|
if (!(node->i_flags & I_DELETED)) {
|
||||||
/* Remove any children first (before I_DELETED is set!). */
|
/* Remove any children first (before I_DELETED is set!). */
|
||||||
|
@ -547,15 +524,17 @@ void delete_inode(struct inode *node)
|
||||||
|
|
||||||
node->i_flags |= I_DELETED;
|
node->i_flags |= I_DELETED;
|
||||||
|
|
||||||
/* If this inode is not a directory, we don't care about being
|
/*
|
||||||
* able to find its parent. Unlink it from the parent now.
|
* If this inode is not a directory, we don't care about being
|
||||||
|
* able to find its parent. Unlink it from the parent now.
|
||||||
*/
|
*/
|
||||||
if (!S_ISDIR(node->i_stat.mode))
|
if (!S_ISDIR(node->i_stat.mode))
|
||||||
unlink_inode(node);
|
unlink_inode(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->i_count == 0 && TAILQ_EMPTY(&node->i_children)) {
|
if (node->i_count == 0 && TAILQ_EMPTY(&node->i_children)) {
|
||||||
/* If this inode still has a parent at this point, unlink it
|
/*
|
||||||
|
* If this inode still has a parent at this point, unlink it
|
||||||
* now; noone can possibly refer to it anymore.
|
* now; noone can possibly refer to it anymore.
|
||||||
*/
|
*/
|
||||||
if (node->i_parent != NULL)
|
if (node->i_parent != NULL)
|
||||||
|
@ -566,25 +545,23 @@ void delete_inode(struct inode *node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* is_inode_deleted *
|
* Return whether the given inode has been deleted.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int is_inode_deleted(struct inode *node)
|
int
|
||||||
|
is_inode_deleted(const struct inode * node)
|
||||||
{
|
{
|
||||||
/* Return whether the given inode has been deleted.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (node->i_flags & I_DELETED);
|
return (node->i_flags & I_DELETED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_putnode *
|
* Find the inode specified by the request message, and decrease its reference
|
||||||
*===========================================================================*/
|
* count.
|
||||||
int fs_putnode(ino_t ino_nr, unsigned int count)
|
*/
|
||||||
|
int
|
||||||
|
fs_putnode(ino_t ino_nr, unsigned int count)
|
||||||
{
|
{
|
||||||
/* Find the inode specified by the request message, and decrease its
|
|
||||||
* reference count.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
|
||||||
/* Get the inode specified by its number. */
|
/* Get the inode specified by its number. */
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#ifndef _VTREEFS_INODE_H
|
#ifndef _VTREEFS_INODE_H
|
||||||
#define _VTREEFS_INODE_H
|
#define _VTREEFS_INODE_H
|
||||||
|
|
||||||
/* The inodes that are active, form a fully connected tree. Each node except
|
/*
|
||||||
|
* The inodes that are active, form a fully connected tree. Each node except
|
||||||
* the root node has a parent and a tail queue of children, where each child
|
* the root node has a parent and a tail queue of children, where each child
|
||||||
* inode points to the "next" and "previous" inode with a common parent.
|
* inode points to the "next" and "previous" inode with a common parent.
|
||||||
*
|
*
|
||||||
|
@ -9,9 +10,9 @@
|
||||||
* <parent,name> -> inode hashtable, and if it has an index into the parent,
|
* <parent,name> -> inode hashtable, and if it has an index into the parent,
|
||||||
* is part of a <parent,index> -> inode hashtable.
|
* is part of a <parent,index> -> inode hashtable.
|
||||||
*
|
*
|
||||||
* Inodes that are not active, are either deleted or free. A deleted inode is
|
* Inodes that are not active, are either deleted or free. A deleted inode is
|
||||||
* in use as long as it still has a nonzero reference count, even though it is
|
* in use as long as it still has a nonzero reference count, even though it is
|
||||||
* no longer part of the tree. Inodes that are free, are part of the list of
|
* no longer part of the tree. Inodes that are free, are part of the list of
|
||||||
* unused inodes.
|
* unused inodes.
|
||||||
*/
|
*/
|
||||||
struct inode {
|
struct inode {
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
/* VTreeFS - link.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - link.c - support for symbolic links */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_rdlink *
|
* Retrieve symbolic link target.
|
||||||
*===========================================================================*/
|
*/
|
||||||
ssize_t fs_rdlink(ino_t ino_nr, struct fsdriver_data *data, size_t bytes)
|
ssize_t
|
||||||
|
fs_rdlink(ino_t ino_nr, struct fsdriver_data * data, size_t bytes)
|
||||||
{
|
{
|
||||||
/* Retrieve symbolic link target.
|
|
||||||
*/
|
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
@ -17,12 +16,15 @@ ssize_t fs_rdlink(ino_t ino_nr, struct fsdriver_data *data, size_t bytes)
|
||||||
if ((node = find_inode(ino_nr)) == NULL)
|
if ((node = find_inode(ino_nr)) == NULL)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
/* Call the rdlink hook. */
|
/*
|
||||||
|
* Call the rdlink hook. The hook must be non-NULL if the file system
|
||||||
|
* adds symlink nodes. If it doesn't, we will never get here.
|
||||||
|
*/
|
||||||
assert(vtreefs_hooks->rdlink_hook != NULL);
|
assert(vtreefs_hooks->rdlink_hook != NULL);
|
||||||
assert(!is_inode_deleted(node)); /* symlinks cannot be opened */
|
assert(!is_inode_deleted(node)); /* symlinks cannot be opened */
|
||||||
|
|
||||||
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
|
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
|
||||||
get_inode_cbdata(node));
|
get_inode_cbdata(node));
|
||||||
if (r != OK) return r;
|
if (r != OK) return r;
|
||||||
|
|
||||||
len = strlen(path);
|
len = strlen(path);
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
/* VTreeFS - mount.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - mount.c - mounting and unmounting */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
#include <minix/vfsif.h>
|
#include <minix/vfsif.h>
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_mount *
|
* Mount the file system. Obtain the root inode and send back its details.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
|
int
|
||||||
unsigned int *res_flags)
|
fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node * root_node,
|
||||||
|
unsigned int * res_flags)
|
||||||
{
|
{
|
||||||
/* This function gets the root inode and sends back its details.
|
|
||||||
*/
|
|
||||||
struct inode *root;
|
struct inode *root;
|
||||||
|
|
||||||
/* Get the device number, for stat requests. */
|
/* Get the device number, for stat requests. */
|
||||||
fs_dev = dev;
|
fs_dev = dev;
|
||||||
|
|
||||||
/* The VTreeFS must not be mounted as a root file system. */
|
/* VTreeFS must not be mounted as a root file system. */
|
||||||
if (flags & REQ_ISROOT)
|
if (flags & REQ_ISROOT)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
|
@ -24,7 +23,7 @@ int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
|
||||||
root = get_root_inode();
|
root = get_root_inode();
|
||||||
ref_inode(root);
|
ref_inode(root);
|
||||||
|
|
||||||
/* The system is now mounted. Call the initialization hook. */
|
/* The system is now mounted. Call the initialization hook. */
|
||||||
if (vtreefs_hooks->init_hook != NULL)
|
if (vtreefs_hooks->init_hook != NULL)
|
||||||
vtreefs_hooks->init_hook();
|
vtreefs_hooks->init_hook();
|
||||||
|
|
||||||
|
@ -41,13 +40,12 @@ int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_unmount *
|
* Unmount the file system.
|
||||||
*===========================================================================*/
|
*/
|
||||||
void fs_unmount(void)
|
void
|
||||||
|
fs_unmount(void)
|
||||||
{
|
{
|
||||||
/* Unmount the file system.
|
|
||||||
*/
|
|
||||||
struct inode *root;
|
struct inode *root;
|
||||||
|
|
||||||
/* Decrease the count of the root inode. */
|
/* Decrease the count of the root inode. */
|
||||||
|
@ -55,7 +53,7 @@ void fs_unmount(void)
|
||||||
|
|
||||||
put_inode(root);
|
put_inode(root);
|
||||||
|
|
||||||
/* The system is unmounted. Call the cleanup hook. */
|
/* The system is unmounted. Call the cleanup hook. */
|
||||||
if (vtreefs_hooks->cleanup_hook != NULL)
|
if (vtreefs_hooks->cleanup_hook != NULL)
|
||||||
vtreefs_hooks->cleanup_hook();
|
vtreefs_hooks->cleanup_hook();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
/* VTreeFS - path.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - path.c - name resolution */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_lookup *
|
* Resolve a path string to an inode.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int fs_lookup(ino_t dir_nr, char *name, struct fsdriver_node *node_details,
|
int
|
||||||
int *is_mountpt)
|
fs_lookup(ino_t dir_nr, char * name, struct fsdriver_node * node_details,
|
||||||
|
int * is_mountpt)
|
||||||
{
|
{
|
||||||
/* Resolve a path string to an inode.
|
|
||||||
*/
|
|
||||||
struct inode *node, *child;
|
struct inode *node, *child;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -30,13 +29,13 @@ int fs_lookup(ino_t dir_nr, char *name, struct fsdriver_node *node_details,
|
||||||
if ((child = get_parent_inode(node)) == NULL)
|
if ((child = get_parent_inode(node)) == NULL)
|
||||||
return ENOENT; /* deleted? should not be possible */
|
return ENOENT; /* deleted? should not be possible */
|
||||||
} else {
|
} else {
|
||||||
/* Progress into a directory entry. Call the lookup hook, if
|
/* Progress into a directory entry. Call the lookup hook, if
|
||||||
* present, before doing the actual lookup.
|
* present, before doing the actual lookup.
|
||||||
*/
|
*/
|
||||||
if (!is_inode_deleted(node) &&
|
if (!is_inode_deleted(node) &&
|
||||||
vtreefs_hooks->lookup_hook != NULL) {
|
vtreefs_hooks->lookup_hook != NULL) {
|
||||||
r = vtreefs_hooks->lookup_hook(node, name,
|
r = vtreefs_hooks->lookup_hook(node, name,
|
||||||
get_inode_cbdata(node));
|
get_inode_cbdata(node));
|
||||||
if (r != OK) return r;
|
if (r != OK) return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,8 @@ struct inode *find_inode(ino_t num);
|
||||||
struct inode *get_inode(ino_t num);
|
struct inode *get_inode(ino_t num);
|
||||||
void put_inode(struct inode *node);
|
void put_inode(struct inode *node);
|
||||||
void ref_inode(struct inode *node);
|
void ref_inode(struct inode *node);
|
||||||
int get_inode_number(struct inode *node);
|
int get_inode_number(const struct inode *node);
|
||||||
int is_inode_deleted(struct inode *node);
|
int is_inode_deleted(const struct inode *node);
|
||||||
int fs_putnode(ino_t ino_nr, unsigned int count);
|
int fs_putnode(ino_t ino_nr, unsigned int count);
|
||||||
|
|
||||||
/* link.c */
|
/* link.c */
|
||||||
|
@ -35,7 +35,7 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
off_t *pos);
|
off_t *pos);
|
||||||
|
|
||||||
/* sdbm.c */
|
/* sdbm.c */
|
||||||
long sdbm_hash(char *str, int len);
|
long sdbm_hash(const char *str, int len);
|
||||||
|
|
||||||
/* stadir.c */
|
/* stadir.c */
|
||||||
int fs_stat(ino_t ino_nr, struct stat *buf);
|
int fs_stat(ino_t ino_nr, struct stat *buf);
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
/* VTreeFS - read.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - read.c - reading from files and directories */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#define GETDENTS_BUFSIZ 4096
|
#define GETDENTS_BUFSIZ 4096
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_read *
|
* Read from a file.
|
||||||
*===========================================================================*/
|
*/
|
||||||
ssize_t fs_read(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
ssize_t
|
||||||
|
fs_read(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
|
||||||
off_t pos, int __unused call)
|
off_t pos, int __unused call)
|
||||||
{
|
{
|
||||||
/* Read from a file.
|
|
||||||
*/
|
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
@ -30,8 +29,9 @@ ssize_t fs_read(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
if (!is_inode_deleted(node) && vtreefs_hooks->read_hook != NULL) {
|
if (!is_inode_deleted(node) && vtreefs_hooks->read_hook != NULL) {
|
||||||
len = bytes;
|
len = bytes;
|
||||||
|
|
||||||
/* On success, the read hook provides us with a pointer to the
|
/*
|
||||||
* resulting data. This avoids copying overhead.
|
* On success, the read hook provides us with a pointer to the
|
||||||
|
* resulting data. This avoids copying overhead.
|
||||||
*/
|
*/
|
||||||
r = vtreefs_hooks->read_hook(node, pos, &ptr, &len,
|
r = vtreefs_hooks->read_hook(node, pos, &ptr, &len,
|
||||||
get_inode_cbdata(node));
|
get_inode_cbdata(node));
|
||||||
|
@ -50,14 +50,13 @@ ssize_t fs_read(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
return (r != OK) ? r : len;
|
return (r != OK) ? r : len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_getdents *
|
* Retrieve directory entries.
|
||||||
*===========================================================================*/
|
*/
|
||||||
ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
ssize_t
|
||||||
off_t *posp)
|
fs_getdents(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
|
||||||
|
off_t * posp)
|
||||||
{
|
{
|
||||||
/* Retrieve directory entries.
|
|
||||||
*/
|
|
||||||
struct fsdriver_dentry fsdentry;
|
struct fsdriver_dentry fsdentry;
|
||||||
struct inode *node, *child;
|
struct inode *node, *child;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -78,7 +77,8 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
/* Call the getdents hook, if any, to "refresh" the directory. */
|
/* Call the getdents hook, if any, to "refresh" the directory. */
|
||||||
if (!is_inode_deleted(node) && vtreefs_hooks->getdents_hook != NULL) {
|
if (!is_inode_deleted(node) && vtreefs_hooks->getdents_hook != NULL) {
|
||||||
r = vtreefs_hooks->getdents_hook(node, get_inode_cbdata(node));
|
r = vtreefs_hooks->getdents_hook(node, get_inode_cbdata(node));
|
||||||
if (r != OK) return r;
|
if (r != OK)
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
fsdriver_dentry_init(&fsdentry, data, bytes, buf, sizeof(buf));
|
fsdriver_dentry_init(&fsdentry, data, bytes, buf, sizeof(buf));
|
||||||
|
@ -91,29 +91,27 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
/* The "." entry. */
|
/* The "." entry. */
|
||||||
child = node;
|
child = node;
|
||||||
name = ".";
|
name = ".";
|
||||||
}
|
} else if (pos == 1) {
|
||||||
else if (pos == 1) {
|
|
||||||
/* The ".." entry. */
|
/* The ".." entry. */
|
||||||
child = get_parent_inode(node);
|
child = get_parent_inode(node);
|
||||||
if (child == NULL)
|
if (child == NULL)
|
||||||
child = node;
|
child = node;
|
||||||
name = "..";
|
name = "..";
|
||||||
}
|
} else if (pos - 2 < indexed) {
|
||||||
else if (pos - 2 < indexed) {
|
|
||||||
/* All indexed entries. */
|
/* All indexed entries. */
|
||||||
child = get_inode_by_index(node, pos - 2);
|
child = get_inode_by_index(node, pos - 2);
|
||||||
|
|
||||||
/* If there is no inode with this particular index,
|
/*
|
||||||
|
* If there is no inode with this particular index,
|
||||||
* continue with the next index number.
|
* continue with the next index number.
|
||||||
*/
|
*/
|
||||||
if (child == NULL) continue;
|
if (child == NULL) continue;
|
||||||
|
|
||||||
name = child->i_name;
|
name = child->i_name;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
/* All non-indexed entries. */
|
/* All non-indexed entries. */
|
||||||
|
/*
|
||||||
/* If this is the first loop iteration, first get to
|
* If this is the first loop iteration, first get to
|
||||||
* the non-indexed child identified by the current
|
* the non-indexed child identified by the current
|
||||||
* position.
|
* position.
|
||||||
*/
|
*/
|
||||||
|
@ -123,7 +121,7 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
|
|
||||||
/* Skip indexed children. */
|
/* Skip indexed children. */
|
||||||
while (child != NULL &&
|
while (child != NULL &&
|
||||||
child->i_index != NO_INDEX)
|
child->i_index != NO_INDEX)
|
||||||
child = get_next_inode(child);
|
child = get_next_inode(child);
|
||||||
|
|
||||||
/* Skip to the right position. */
|
/* Skip to the right position. */
|
||||||
|
@ -131,10 +129,8 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
child = get_next_inode(child);
|
child = get_next_inode(child);
|
||||||
|
|
||||||
get_next = TRUE;
|
get_next = TRUE;
|
||||||
}
|
} else
|
||||||
else {
|
|
||||||
child = get_next_inode(child);
|
child = get_next_inode(child);
|
||||||
}
|
|
||||||
|
|
||||||
/* No more children? Then stop. */
|
/* No more children? Then stop. */
|
||||||
if (child == NULL)
|
if (child == NULL)
|
||||||
|
@ -147,8 +143,8 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
|
||||||
|
|
||||||
/* Add the directory entry to the output. */
|
/* Add the directory entry to the output. */
|
||||||
r = fsdriver_dentry_add(&fsdentry,
|
r = fsdriver_dentry_add(&fsdentry,
|
||||||
(ino_t) get_inode_number(child), name, strlen(name),
|
(ino_t)get_inode_number(child), name, strlen(name),
|
||||||
IFTODT(child->i_stat.mode));
|
IFTODT(child->i_stat.mode));
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
} while (r > 0);
|
} while (r > 0);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* VTreeFS - sdbm.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - sdbm.c - sdbm hash function */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sdbm - ndbm work-alike hashed database library
|
* sdbm - ndbm work-alike hashed database library
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* polynomial conversion ignoring overflows
|
* polynomial conversion ignoring overflows
|
||||||
* [this seems to work remarkably well, in fact better
|
* [this seems to work remarkably well, in fact better
|
||||||
|
@ -17,7 +18,8 @@
|
||||||
* use: 65599 nice.
|
* use: 65599 nice.
|
||||||
* 65587 even better.
|
* 65587 even better.
|
||||||
*/
|
*/
|
||||||
long sdbm_hash(char *str, int len)
|
long
|
||||||
|
sdbm_hash(const char *str, int len)
|
||||||
{
|
{
|
||||||
unsigned long n = 0;
|
unsigned long n = 0;
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
/* VTreeFS - stadir.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - stadir.c - file and file system status retrieval */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_stat *
|
* Retrieve file status.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int fs_stat(ino_t ino_nr, struct stat *buf)
|
int
|
||||||
|
fs_stat(ino_t ino_nr, struct stat * buf)
|
||||||
{
|
{
|
||||||
/* Retrieve file status.
|
|
||||||
*/
|
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
time_t cur_time;
|
time_t cur_time;
|
||||||
struct inode *node;
|
struct inode *node;
|
||||||
|
@ -30,7 +29,7 @@ int fs_stat(ino_t ino_nr, struct stat *buf)
|
||||||
/* If it is a symbolic link, return the size of the link target. */
|
/* If it is a symbolic link, return the size of the link target. */
|
||||||
if (S_ISLNK(node->i_stat.mode) && vtreefs_hooks->rdlink_hook != NULL) {
|
if (S_ISLNK(node->i_stat.mode) && vtreefs_hooks->rdlink_hook != NULL) {
|
||||||
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
|
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
|
||||||
get_inode_cbdata(node));
|
get_inode_cbdata(node));
|
||||||
|
|
||||||
if (r == OK)
|
if (r == OK)
|
||||||
buf->st_size = strlen(path);
|
buf->st_size = strlen(path);
|
||||||
|
@ -45,13 +44,12 @@ int fs_stat(ino_t ino_nr, struct stat *buf)
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_statvfs *
|
* Retrieve file system statistics.
|
||||||
*===========================================================================*/
|
*/
|
||||||
int fs_statvfs(struct statvfs *buf)
|
int
|
||||||
|
fs_statvfs(struct statvfs * buf)
|
||||||
{
|
{
|
||||||
/* Retrieve file system statistics.
|
|
||||||
*/
|
|
||||||
|
|
||||||
buf->f_flag = ST_NOTRUNC;
|
buf->f_flag = ST_NOTRUNC;
|
||||||
buf->f_namemax = PNAME_MAX;
|
buf->f_namemax = PNAME_MAX;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* VTreeFS - table.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - table.c - file system driver callback table */
|
||||||
|
|
||||||
#define _TABLE
|
#define _TABLE
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* VTreeFS - vtreefs.c - by Alen Stojanov and David van Moolenbroek */
|
/* VTreeFS - vtreefs.c - initialization and message loop */
|
||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
|
@ -6,13 +6,12 @@ static unsigned int inodes;
|
||||||
static struct inode_stat *root_stat;
|
static struct inode_stat *root_stat;
|
||||||
static index_t root_entries;
|
static index_t root_entries;
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* init_server *
|
* Initialize internal state, and register with VFS.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static int init_server(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
static int
|
||||||
|
init_server(int __unused type, sef_init_info_t * __unused info)
|
||||||
{
|
{
|
||||||
/* Initialize internal state, and register with VFS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Initialize the virtual tree. */
|
/* Initialize the virtual tree. */
|
||||||
init_inodes(inodes, root_stat, root_entries);
|
init_inodes(inodes, root_stat, root_entries);
|
||||||
|
@ -20,13 +19,12 @@ static int init_server(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* got_signal *
|
* We received a signal.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static void got_signal(int signal)
|
static void
|
||||||
|
got_signal(int signal)
|
||||||
{
|
{
|
||||||
/* We received a signal.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (signal != SIGTERM)
|
if (signal != SIGTERM)
|
||||||
return;
|
return;
|
||||||
|
@ -34,11 +32,13 @@ static void got_signal(int signal)
|
||||||
fsdriver_terminate();
|
fsdriver_terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* sef_local_startup *
|
* SEF initialization.
|
||||||
*===========================================================================*/
|
*/
|
||||||
static void sef_local_startup(void)
|
static void
|
||||||
|
sef_local_startup(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
sef_setcb_init_fresh(init_server);
|
sef_setcb_init_fresh(init_server);
|
||||||
sef_setcb_init_restart(init_server);
|
sef_setcb_init_restart(init_server);
|
||||||
|
|
||||||
|
@ -49,18 +49,18 @@ static void sef_local_startup(void)
|
||||||
sef_startup();
|
sef_startup();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* fs_other *
|
* We have received a message that is not a file system request from VFS.
|
||||||
*===========================================================================*/
|
* Call the message hook, if there is one.
|
||||||
void fs_other(const message *m_ptr, int __unused ipc_status)
|
*/
|
||||||
|
void
|
||||||
|
fs_other(const message * m_ptr, int __unused ipc_status)
|
||||||
{
|
{
|
||||||
/* We received a message that is not among the recognized file system
|
|
||||||
* requests. Call the message hook, if there is one.
|
|
||||||
*/
|
|
||||||
message msg;
|
message msg;
|
||||||
|
|
||||||
if (vtreefs_hooks->message_hook != NULL) {
|
if (vtreefs_hooks->message_hook != NULL) {
|
||||||
/* Not all of vtreefs's users play nice with the message, so
|
/*
|
||||||
|
* Not all of vtreefs's users play nice with the message, so
|
||||||
* make a copy to allow it to be modified.
|
* make a copy to allow it to be modified.
|
||||||
*/
|
*/
|
||||||
msg = *m_ptr;
|
msg = *m_ptr;
|
||||||
|
@ -69,18 +69,18 @@ void fs_other(const message *m_ptr, int __unused ipc_status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*
|
||||||
* start_vtreefs *
|
* This is the main routine of this service. It uses the main loop as provided
|
||||||
*===========================================================================*/
|
* by the fsdriver library. The routine returns once the file system has been
|
||||||
void start_vtreefs(struct fs_hooks *hooks, unsigned int nr_inodes,
|
* unmounted and the process is signaled to exit.
|
||||||
struct inode_stat *stat, index_t nr_indexed_entries)
|
*/
|
||||||
|
void
|
||||||
|
start_vtreefs(struct fs_hooks * hooks, unsigned int nr_inodes,
|
||||||
|
struct inode_stat * stat, index_t nr_indexed_entries)
|
||||||
{
|
{
|
||||||
/* This is the main routine of this service. It uses the main loop as
|
|
||||||
* provided by the fsdriver library. The routine returns once the file
|
|
||||||
* system has been unmounted and the process is signaled to exit.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Use global variables to work around the inability to pass parameters
|
/*
|
||||||
|
* Use global variables to work around the inability to pass parameters
|
||||||
* through SEF to the initialization function..
|
* through SEF to the initialization function..
|
||||||
*/
|
*/
|
||||||
vtreefs_hooks = hooks;
|
vtreefs_hooks = hooks;
|
||||||
|
|
Loading…
Reference in a new issue