libvtreefs: convert to KNF

Change-Id: I81bdf05c9b630a0cbb0ac573d36d4f59f8137199
This commit is contained in:
David van Moolenbroek 2014-11-06 13:36:45 +00:00
parent f92baba71c
commit 693ad767e8
12 changed files with 300 additions and 324 deletions

View file

@ -32,23 +32,26 @@ struct fs_hooks {
int (*message_hook)(message *m);
};
extern struct inode *add_inode(struct inode *parent, char *name, index_t index,
struct inode_stat *stat, index_t nr_indexed_entries, cbdata_t cbdata);
extern struct inode *add_inode(struct inode *parent, const char *name,
index_t index, const struct inode_stat *stat,
index_t nr_indexed_entries, cbdata_t cbdata);
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_index(struct inode *parent, index_t index);
extern struct inode *get_inode_by_name(const struct inode *parent,
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 index_t get_inode_index(struct inode *inode);
extern cbdata_t get_inode_cbdata(struct inode *inode);
extern const char *get_inode_name(const struct inode *inode);
extern index_t get_inode_index(const struct inode *inode);
extern cbdata_t get_inode_cbdata(const struct inode *inode);
extern struct inode *get_root_inode(void);
extern struct inode *get_parent_inode(struct inode *inode);
extern struct inode *get_first_inode(struct inode *parent);
extern struct inode *get_next_inode(struct inode *previous);
extern struct inode *get_parent_inode(const struct inode *inode);
extern struct inode *get_first_inode(const struct inode *parent);
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 start_vtreefs(struct fs_hooks *hooks, unsigned int nr_inodes,

View file

@ -1,4 +1,4 @@
/* VTreeFS - inode.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - inode.c - inode management */
#include "inc.h"
@ -19,19 +19,17 @@ static LIST_HEAD(index_head, inode) *parent_index_head;
#define CHECK_INODE(node) \
do { \
assert(node >= &inode[0] && node < &inode[nr_inodes]); \
assert(node == &inode[0] || \
node->i_parent != NULL || \
(node->i_flags & I_DELETED)); \
assert(node == &inode[0] || node->i_parent != NULL || \
(node->i_flags & I_DELETED)); \
} while (0);
/*===========================================================================*
* init_inodes *
*===========================================================================*/
void init_inodes(unsigned int inodes, struct inode_stat *stat,
/*
* Initialize the inode-related state.
*/
void
init_inodes(unsigned int inodes, struct inode_stat * stat,
index_t nr_indexed_entries)
{
/* Initialize the inode-related state.
*/
struct inode *node;
unsigned int i;
@ -51,15 +49,15 @@ void init_inodes(unsigned int inodes, struct inode_stat *stat,
#if DEBUG
printf("VTREEFS: allocated %d+%d+%d bytes\n",
nr_inodes * sizeof(inode[0]),
nr_inodes * sizeof(parent_name_head[0]),
nr_inodes * sizeof(parent_index_head[0]));
nr_inodes * sizeof(inode[0]),
nr_inodes * sizeof(parent_name_head[0]),
nr_inodes * sizeof(parent_index_head[0]));
#endif
/* Initialize the free/unused list. */
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++) {
node = &inode[i];
@ -87,13 +85,12 @@ void init_inodes(unsigned int inodes, struct inode_stat *stat,
node->i_cbdata = NULL;
}
/*===========================================================================*
* cleanup_inodes *
*===========================================================================*/
void cleanup_inodes(void)
/*
* Clean up the inode-related state.
*/
void
cleanup_inodes(void)
{
/* Clean up the inode-related state.
*/
/* Free the inode and hash tables. */
free(parent_index_head);
@ -101,18 +98,16 @@ void cleanup_inodes(void)
free(inode);
}
/*===========================================================================*
* parent_name_hash *
*===========================================================================*/
static int parent_name_hash(struct inode *parent, char *name)
/*
* Return the hash value of <parent,name> tuple.
*/
static int
parent_name_hash(const struct inode * parent, const char *name)
{
/* Return the hash value of <parent,name> tuple.
*/
unsigned int name_hash;
unsigned long parent_hash;
unsigned int name_hash, parent_hash;
/* 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. */
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;
}
/*===========================================================================*
* parent_index_hash *
*===========================================================================*/
static int parent_index_hash(struct inode *parent, index_t index)
/*
* Return the hash value of a <parent,index> tuple.
*/
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 *
*===========================================================================*/
static void purge_inode(struct inode *parent)
/*
* Delete a deletable inode to make room for a new inode.
*/
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 indexed;
* - it is not the given parent inode;
@ -153,7 +147,8 @@ static void purge_inode(struct inode *parent)
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..
*/
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;
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));
@ -172,15 +167,14 @@ static void purge_inode(struct inode *parent)
}
}
/*===========================================================================*
* add_inode *
*===========================================================================*/
struct inode *add_inode(struct inode *parent, char *name,
index_t index, struct inode_stat *stat, index_t nr_indexed_entries,
/*
* Add an inode.
*/
struct inode *
add_inode(struct inode * parent, const char * name, index_t index,
const struct inode_stat * stat, index_t nr_indexed_entries,
cbdata_t cbdata)
{
/* Add an inode.
*/
struct inode *newnode;
int slot;
@ -193,7 +187,7 @@ struct inode *add_inode(struct inode *parent, char *name,
assert(nr_indexed_entries >= 0);
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))
purge_inode(parent);
@ -229,64 +223,59 @@ struct inode *add_inode(struct inode *parent, char *name,
return newnode;
}
/*===========================================================================*
* get_root_inode *
*===========================================================================*/
struct inode *get_root_inode(void)
/*
* Return the file system's root inode.
*/
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];
}
/*===========================================================================*
* get_inode_name *
*===========================================================================*/
char const *get_inode_name(struct inode *node)
/*
* Return the name that an inode has in its parent directory.
*/
const char *
get_inode_name(const struct inode * node)
{
/* Return the name that an inode has in its parent directory.
*/
CHECK_INODE(node);
return node->i_name;
}
/*===========================================================================*
* get_inode_index *
*===========================================================================*/
index_t get_inode_index(struct inode *node)
/*
* Return the index that an inode has in its parent directory.
*/
index_t
get_inode_index(const struct inode * node)
{
/* Return the index that an inode has in its parent directory.
*/
CHECK_INODE(node);
return node->i_index;
}
/*===========================================================================*
* get_inode_cbdata *
*===========================================================================*/
cbdata_t get_inode_cbdata(struct inode *node)
/*
* Return the callback data associated with the given inode.
*/
cbdata_t
get_inode_cbdata(const struct inode * node)
{
/* Return the callback data associated with the given inode.
*/
CHECK_INODE(node);
return node->i_cbdata;
}
/*===========================================================================*
* get_parent_inode *
*===========================================================================*/
struct inode *get_parent_inode(struct inode *node)
/*
* Return an inode's parent inode.
*/
struct inode *
get_parent_inode(const struct inode * node)
{
/* Return an inode's parent inode.
*/
CHECK_INODE(node);
@ -297,13 +286,12 @@ struct inode *get_parent_inode(struct inode *node)
return node->i_parent;
}
/*===========================================================================*
* get_first_inode *
*===========================================================================*/
struct inode *get_first_inode(struct inode *parent)
/*
* Return a directory's first (non-deleted) child inode.
*/
struct inode *
get_first_inode(const struct inode * parent)
{
/* Return a directory's first (non-deleted) child inode.
*/
struct inode *node;
CHECK_INODE(parent);
@ -317,13 +305,12 @@ struct inode *get_first_inode(struct inode *parent)
return node;
}
/*===========================================================================*
* get_next_inode *
*===========================================================================*/
struct inode *get_next_inode(struct inode *previous)
/*
* Return a directory's next (non-deleted) child inode.
*/
struct inode *
get_next_inode(const struct inode * previous)
{
/* Return a directory's next (non-deleted) child inode.
*/
struct inode *node;
CHECK_INODE(previous);
@ -336,52 +323,48 @@ struct inode *get_next_inode(struct inode *previous)
return node;
}
/*===========================================================================*
* get_inode_number *
*===========================================================================*/
int get_inode_number(struct inode *node)
/*
* Return the inode number of the given inode.
*/
int
get_inode_number(const struct inode * node)
{
/* Return the inode number of the given inode.
*/
CHECK_INODE(node);
return (int) (node - &inode[0]) + 1;
return (int)(node - &inode[0]) + 1;
}
/*===========================================================================*
* get_inode_stat *
*===========================================================================*/
void get_inode_stat(struct inode *node, struct inode_stat *stat)
/*
* Retrieve an inode's status.
*/
void
get_inode_stat(const struct inode * node, struct inode_stat * stat)
{
/* Retrieve an inode's status.
*/
CHECK_INODE(node);
*stat = node->i_stat;
}
/*===========================================================================*
* set_inode_stat *
*===========================================================================*/
void set_inode_stat(struct inode *node, struct inode_stat *stat)
/*
* Set an inode's status.
*/
void
set_inode_stat(struct inode * node, struct inode_stat * stat)
{
/* Set an inode's status.
*/
CHECK_INODE(node);
node->i_stat = *stat;
}
/*===========================================================================*
* get_inode_by_name *
*===========================================================================*/
struct inode *get_inode_by_name(struct inode *parent, char *name)
/*
* Look up an inode using a <parent,name> tuple.
*/
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;
int slot;
@ -399,13 +382,12 @@ struct inode *get_inode_by_name(struct inode *parent, char *name)
return NULL;
}
/*===========================================================================*
* get_inode_by_index *
*===========================================================================*/
struct inode *get_inode_by_index(struct inode *parent, index_t index)
/*
* Look up an inode using a <parent,index> tuple.
*/
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;
int slot;
@ -423,13 +405,12 @@ struct inode *get_inode_by_index(struct inode *parent, index_t index)
return NULL;
}
/*===========================================================================*
* find_inode *
*===========================================================================*/
struct inode *find_inode(ino_t num)
/*
* Retrieve an inode by inode number.
*/
struct inode *
find_inode(ino_t num)
{
/* Retrieve an inode by inode number.
*/
struct inode *node;
node = &inode[num - 1];
@ -439,13 +420,12 @@ struct inode *find_inode(ino_t num)
return node;
}
/*===========================================================================*
* get_inode *
*===========================================================================*/
struct inode *get_inode(ino_t num)
/*
* Retrieve an inode by inode number, and increase its reference count.
*/
struct inode *
get_inode(ino_t num)
{
/* Retrieve an inode by inode number, and increase its reference count.
*/
struct inode *node;
if ((node = find_inode(num)) == NULL)
@ -455,46 +435,44 @@ struct inode *get_inode(ino_t num)
return node;
}
/*===========================================================================*
* put_inode *
*===========================================================================*/
void put_inode(struct inode *node)
/*
* Decrease an inode's reference count.
*/
void
put_inode(struct inode * node)
{
/* Decrease an inode's reference count.
*/
CHECK_INODE(node);
assert(node->i_count > 0);
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.
*/
if ((node->i_flags & I_DELETED) && node->i_count == 0)
delete_inode(node);
}
/*===========================================================================*
* ref_inode *
*===========================================================================*/
void ref_inode(struct inode *node)
/*
* Increase an inode's reference count.
*/
void
ref_inode(struct inode * node)
{
/* Increase an inode's reference count.
*/
CHECK_INODE(node);
node->i_count++;
}
/*===========================================================================*
* unlink_inode *
*===========================================================================*/
static void unlink_inode(struct inode *node)
/*
* Unlink the given node from its parent, if it is still linked in.
*/
static void
unlink_inode(struct inode * node)
{
/* Unlink the given node from its parent, if it is still linked in.
*/
struct inode *parent;
assert(node->i_flags & I_DELETED);
@ -513,25 +491,24 @@ static void unlink_inode(struct inode *node)
delete_inode(parent);
}
/*===========================================================================*
* delete_inode *
*===========================================================================*/
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.
*/
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;
CHECK_INODE(node);
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)) {
/* Remove any children first (before I_DELETED is set!). */
@ -547,15 +524,17 @@ void delete_inode(struct inode *node)
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))
unlink_inode(node);
}
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.
*/
if (node->i_parent != NULL)
@ -566,25 +545,23 @@ void delete_inode(struct inode *node)
}
}
/*===========================================================================*
* is_inode_deleted *
*===========================================================================*/
int is_inode_deleted(struct inode *node)
/*
* Return whether the given inode has been deleted.
*/
int
is_inode_deleted(const struct inode * node)
{
/* Return whether the given inode has been deleted.
*/
return (node->i_flags & I_DELETED);
}
/*===========================================================================*
* fs_putnode *
*===========================================================================*/
int fs_putnode(ino_t ino_nr, unsigned int count)
/*
* Find the inode specified by the request message, and decrease its reference
* 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;
/* Get the inode specified by its number. */

View file

@ -1,7 +1,8 @@
#ifndef _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
* 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,
* 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
* 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.
*/
struct inode {

View file

@ -1,14 +1,13 @@
/* VTreeFS - link.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - link.c - support for symbolic links */
#include "inc.h"
/*===========================================================================*
* fs_rdlink *
*===========================================================================*/
ssize_t fs_rdlink(ino_t ino_nr, struct fsdriver_data *data, size_t bytes)
/*
* Retrieve symbolic link target.
*/
ssize_t
fs_rdlink(ino_t ino_nr, struct fsdriver_data * data, size_t bytes)
{
/* Retrieve symbolic link target.
*/
char path[PATH_MAX];
struct inode *node;
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)
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(!is_inode_deleted(node)); /* symlinks cannot be opened */
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
get_inode_cbdata(node));
get_inode_cbdata(node));
if (r != OK) return r;
len = strlen(path);

View file

@ -1,22 +1,21 @@
/* VTreeFS - mount.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - mount.c - mounting and unmounting */
#include "inc.h"
#include <minix/vfsif.h>
/*===========================================================================*
* fs_mount *
*===========================================================================*/
int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
unsigned int *res_flags)
/*
* 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,
unsigned int * res_flags)
{
/* This function gets the root inode and sends back its details.
*/
struct inode *root;
/* Get the device number, for stat requests. */
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)
return EINVAL;
@ -24,7 +23,7 @@ int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
root = get_root_inode();
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)
vtreefs_hooks->init_hook();
@ -41,13 +40,12 @@ int fs_mount(dev_t dev, unsigned int flags, struct fsdriver_node *root_node,
return OK;
}
/*===========================================================================*
* fs_unmount *
*===========================================================================*/
void fs_unmount(void)
/*
* Unmount the file system.
*/
void
fs_unmount(void)
{
/* Unmount the file system.
*/
struct inode *root;
/* Decrease the count of the root inode. */
@ -55,7 +53,7 @@ void fs_unmount(void)
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)
vtreefs_hooks->cleanup_hook();
}

View file

@ -1,15 +1,14 @@
/* VTreeFS - path.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - path.c - name resolution */
#include "inc.h"
/*===========================================================================*
* fs_lookup *
*===========================================================================*/
int fs_lookup(ino_t dir_nr, char *name, struct fsdriver_node *node_details,
int *is_mountpt)
/*
* Resolve a path string to an inode.
*/
int
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;
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)
return ENOENT; /* deleted? should not be possible */
} 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.
*/
if (!is_inode_deleted(node) &&
vtreefs_hooks->lookup_hook != NULL) {
r = vtreefs_hooks->lookup_hook(node, name,
get_inode_cbdata(node));
get_inode_cbdata(node));
if (r != OK) return r;
}

View file

@ -9,8 +9,8 @@ struct inode *find_inode(ino_t num);
struct inode *get_inode(ino_t num);
void put_inode(struct inode *node);
void ref_inode(struct inode *node);
int get_inode_number(struct inode *node);
int is_inode_deleted(struct inode *node);
int get_inode_number(const struct inode *node);
int is_inode_deleted(const struct inode *node);
int fs_putnode(ino_t ino_nr, unsigned int count);
/* link.c */
@ -35,7 +35,7 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
off_t *pos);
/* sdbm.c */
long sdbm_hash(char *str, int len);
long sdbm_hash(const char *str, int len);
/* stadir.c */
int fs_stat(ino_t ino_nr, struct stat *buf);

View file

@ -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 <dirent.h>
#define GETDENTS_BUFSIZ 4096
/*===========================================================================*
* fs_read *
*===========================================================================*/
ssize_t fs_read(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
/*
* Read from a file.
*/
ssize_t
fs_read(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
off_t pos, int __unused call)
{
/* Read from a file.
*/
struct inode *node;
size_t len;
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) {
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,
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;
}
/*===========================================================================*
* fs_getdents *
*===========================================================================*/
ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
off_t *posp)
/*
* Retrieve directory entries.
*/
ssize_t
fs_getdents(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
off_t * posp)
{
/* Retrieve directory entries.
*/
struct fsdriver_dentry fsdentry;
struct inode *node, *child;
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. */
if (!is_inode_deleted(node) && vtreefs_hooks->getdents_hook != NULL) {
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));
@ -91,29 +91,27 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
/* The "." entry. */
child = node;
name = ".";
}
else if (pos == 1) {
} else if (pos == 1) {
/* The ".." entry. */
child = get_parent_inode(node);
if (child == NULL)
child = node;
name = "..";
}
else if (pos - 2 < indexed) {
} else if (pos - 2 < indexed) {
/* All indexed entries. */
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.
*/
if (child == NULL) continue;
name = child->i_name;
}
else {
} else {
/* 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
* position.
*/
@ -123,7 +121,7 @@ ssize_t fs_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
/* Skip indexed children. */
while (child != NULL &&
child->i_index != NO_INDEX)
child->i_index != NO_INDEX)
child = get_next_inode(child);
/* 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);
get_next = TRUE;
}
else {
} else
child = get_next_inode(child);
}
/* No more children? Then stop. */
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. */
r = fsdriver_dentry_add(&fsdentry,
(ino_t) get_inode_number(child), name, strlen(name),
IFTODT(child->i_stat.mode));
(ino_t)get_inode_number(child), name, strlen(name),
IFTODT(child->i_stat.mode));
if (r < 0)
return r;
} while (r > 0);

View file

@ -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
@ -10,6 +10,7 @@
*/
#include "inc.h"
/*
* polynomial conversion ignoring overflows
* [this seems to work remarkably well, in fact better
@ -17,7 +18,8 @@
* use: 65599 nice.
* 65587 even better.
*/
long sdbm_hash(char *str, int len)
long
sdbm_hash(const char *str, int len)
{
unsigned long n = 0;

View file

@ -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"
/*===========================================================================*
* fs_stat *
*===========================================================================*/
int fs_stat(ino_t ino_nr, struct stat *buf)
/*
* Retrieve file status.
*/
int
fs_stat(ino_t ino_nr, struct stat * buf)
{
/* Retrieve file status.
*/
char path[PATH_MAX];
time_t cur_time;
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 (S_ISLNK(node->i_stat.mode) && vtreefs_hooks->rdlink_hook != NULL) {
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
get_inode_cbdata(node));
get_inode_cbdata(node));
if (r == OK)
buf->st_size = strlen(path);
@ -45,13 +44,12 @@ int fs_stat(ino_t ino_nr, struct stat *buf)
return OK;
}
/*===========================================================================*
* fs_statvfs *
*===========================================================================*/
int fs_statvfs(struct statvfs *buf)
/*
* Retrieve file system statistics.
*/
int
fs_statvfs(struct statvfs * buf)
{
/* Retrieve file system statistics.
*/
buf->f_flag = ST_NOTRUNC;
buf->f_namemax = PNAME_MAX;

View file

@ -1,4 +1,4 @@
/* VTreeFS - table.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - table.c - file system driver callback table */
#define _TABLE
#include "inc.h"

View file

@ -1,4 +1,4 @@
/* VTreeFS - vtreefs.c - by Alen Stojanov and David van Moolenbroek */
/* VTreeFS - vtreefs.c - initialization and message loop */
#include "inc.h"
@ -6,13 +6,12 @@ static unsigned int inodes;
static struct inode_stat *root_stat;
static index_t root_entries;
/*===========================================================================*
* init_server *
*===========================================================================*/
static int init_server(int UNUSED(type), sef_init_info_t *UNUSED(info))
/*
* Initialize internal state, and register with VFS.
*/
static int
init_server(int __unused type, sef_init_info_t * __unused info)
{
/* Initialize internal state, and register with VFS.
*/
/* Initialize the virtual tree. */
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;
}
/*===========================================================================*
* got_signal *
*===========================================================================*/
static void got_signal(int signal)
/*
* We received a signal.
*/
static void
got_signal(int signal)
{
/* We received a signal.
*/
if (signal != SIGTERM)
return;
@ -34,11 +32,13 @@ static void got_signal(int signal)
fsdriver_terminate();
}
/*===========================================================================*
* sef_local_startup *
*===========================================================================*/
static void sef_local_startup(void)
/*
* SEF initialization.
*/
static void
sef_local_startup(void)
{
sef_setcb_init_fresh(init_server);
sef_setcb_init_restart(init_server);
@ -49,18 +49,18 @@ static void sef_local_startup(void)
sef_startup();
}
/*===========================================================================*
* fs_other *
*===========================================================================*/
void fs_other(const message *m_ptr, int __unused ipc_status)
/*
* 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)
{
/* We received a message that is not among the recognized file system
* requests. Call the message hook, if there is one.
*/
message msg;
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.
*/
msg = *m_ptr;
@ -69,18 +69,18 @@ void fs_other(const message *m_ptr, int __unused ipc_status)
}
}
/*===========================================================================*
* start_vtreefs *
*===========================================================================*/
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.
*/
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..
*/
vtreefs_hooks = hooks;