Subversion Repositories HelenOS

Rev

Rev 2757 | Rev 2760 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2757 Rev 2758
Line 68... Line 68...
68
 
68
 
69
/* Forward declarations of static functions. */
69
/* Forward declarations of static functions. */
70
static bool tmpfs_match(void *, const char *);
70
static bool tmpfs_match(void *, const char *);
71
static void *tmpfs_create_node(int);
71
static void *tmpfs_create_node(int);
72
static bool tmpfs_link_node(void *, void *, const char *);
72
static bool tmpfs_link_node(void *, void *, const char *);
73
static int tmpfs_unlink_node(void *);
73
static int tmpfs_unlink_node(void *, void *);
74
static void tmpfs_destroy_node(void *);
74
static void tmpfs_destroy_node(void *);
75
 
75
 
76
/* Implementation of helper functions. */
76
/* Implementation of helper functions. */
77
static unsigned long tmpfs_index_get(void *nodep)
77
static unsigned long tmpfs_index_get(void *nodep)
78
{
78
{
Line 168... Line 168...
168
unsigned tmpfs_next_index = 1;
168
unsigned tmpfs_next_index = 1;
169
 
169
 
170
static void tmpfs_dentry_initialize(tmpfs_dentry_t *dentry)
170
static void tmpfs_dentry_initialize(tmpfs_dentry_t *dentry)
171
{
171
{
172
    dentry->index = 0;
172
    dentry->index = 0;
173
    dentry->parent = NULL;
-
 
174
    dentry->sibling = NULL;
173
    dentry->sibling = NULL;
175
    dentry->child = NULL;
174
    dentry->child = NULL;
176
    dentry->name = NULL;
175
    dentry->name = NULL;
177
    dentry->type = TMPFS_NONE;
176
    dentry->type = TMPFS_NONE;
178
    dentry->lnkcnt = 0;
177
    dentry->lnkcnt = 0;
Line 248... Line 247...
248
            tmp = tmp->sibling;
247
            tmp = tmp->sibling;
249
        tmp->sibling = childp;
248
        tmp->sibling = childp;
250
    } else {
249
    } else {
251
        parentp->child = childp;
250
        parentp->child = childp;
252
    }
251
    }
253
    childp->parent = parentp;
-
 
254
 
252
 
255
    return true;
253
    return true;
256
}
254
}
257
 
255
 
258
int tmpfs_unlink_node(void *nodeptr)
256
int tmpfs_unlink_node(void *prnt, void *chld)
259
{
257
{
260
    tmpfs_dentry_t *dentry = (tmpfs_dentry_t *)nodeptr;
258
    tmpfs_dentry_t *parentp = (tmpfs_dentry_t *)prnt;
-
 
259
    tmpfs_dentry_t *childp = (tmpfs_dentry_t *)chld;
261
 
260
 
262
    if (dentry->child)
-
 
263
        return ENOTEMPTY;
-
 
264
 
-
 
265
    if (!dentry->parent)
261
    if (!parentp)
266
        return EBUSY;
262
        return EBUSY;
267
 
263
 
-
 
264
    if (childp->child)
-
 
265
        return ENOTEMPTY;
-
 
266
 
268
    if (dentry->parent->child == dentry) {
267
    if (parentp->child == childp) {
269
        dentry->parent->child = dentry->sibling;
268
        parentp->child = childp->sibling;
270
    } else {
269
    } else {
271
        /* TODO: consider doubly linked list for organizing siblings. */
270
        /* TODO: consider doubly linked list for organizing siblings. */
272
        tmpfs_dentry_t *tmp = dentry->parent->child;
271
        tmpfs_dentry_t *tmp = parentp->child;
273
        while (tmp->sibling != dentry)
272
        while (tmp->sibling != childp)
274
            tmp = tmp->sibling;
273
            tmp = tmp->sibling;
275
        tmp->sibling = dentry->sibling;
274
        tmp->sibling = childp->sibling;
276
    }
275
    }
277
    dentry->sibling = NULL;
276
    childp->sibling = NULL;
278
    dentry->parent = NULL;
-
 
279
 
277
 
280
    free(dentry->name);
278
    free(childp->name);
281
    dentry->name = NULL;
279
    childp->name = NULL;
282
 
280
 
283
    dentry->lnkcnt--;
281
    childp->lnkcnt--;
284
 
282
 
285
    return EOK;
283
    return EOK;
286
}
284
}
287
 
285
 
288
void tmpfs_destroy_node(void *nodep)
286
void tmpfs_destroy_node(void *nodep)