152be5c0aSDavid van Moolenbroek /* VTreeFS - extra.c - per-inode storage of arbitrary extra data */ 252be5c0aSDavid van Moolenbroek 352be5c0aSDavid van Moolenbroek #include "inc.h" 452be5c0aSDavid van Moolenbroek 552be5c0aSDavid van Moolenbroek /* 652be5c0aSDavid van Moolenbroek * Right now, we maintain the extra data (if requested) as a separate buffer, 752be5c0aSDavid van Moolenbroek * so that we don't have to make the inode structure variable in size. Later, 852be5c0aSDavid van Moolenbroek * if for example the maximum node name length becomes a runtime setting, we 952be5c0aSDavid van Moolenbroek * could reconsider this. 1052be5c0aSDavid van Moolenbroek */ 1152be5c0aSDavid van Moolenbroek static char *extra_ptr = NULL; 1252be5c0aSDavid van Moolenbroek static size_t extra_size = 0; /* per inode */ 1352be5c0aSDavid van Moolenbroek 1452be5c0aSDavid van Moolenbroek /* 1552be5c0aSDavid van Moolenbroek * Initialize memory to store extra data. 1652be5c0aSDavid van Moolenbroek */ 1752be5c0aSDavid van Moolenbroek int init_extra(unsigned int nr_inodes,size_t inode_extra)1852be5c0aSDavid van Moolenbroekinit_extra(unsigned int nr_inodes, size_t inode_extra) 1952be5c0aSDavid van Moolenbroek { 2052be5c0aSDavid van Moolenbroek 21*5a7def9aSCristiano Giuffrida if (inode_extra == 0) 2252be5c0aSDavid van Moolenbroek return OK; 2352be5c0aSDavid van Moolenbroek 24*5a7def9aSCristiano Giuffrida if ((extra_ptr = calloc(nr_inodes, inode_extra)) == NULL) 2552be5c0aSDavid van Moolenbroek return ENOMEM; 2652be5c0aSDavid van Moolenbroek 2752be5c0aSDavid van Moolenbroek extra_size = inode_extra; 2852be5c0aSDavid van Moolenbroek 2952be5c0aSDavid van Moolenbroek return OK; 3052be5c0aSDavid van Moolenbroek } 3152be5c0aSDavid van Moolenbroek 3252be5c0aSDavid van Moolenbroek /* 3352be5c0aSDavid van Moolenbroek * Initialize the extra data for the given inode to zero. 3452be5c0aSDavid van Moolenbroek */ 3552be5c0aSDavid van Moolenbroek void clear_inode_extra(struct inode * node)3652be5c0aSDavid van Moolenbroekclear_inode_extra(struct inode * node) 3752be5c0aSDavid van Moolenbroek { 3852be5c0aSDavid van Moolenbroek 3952be5c0aSDavid van Moolenbroek if (extra_size == 0) 4052be5c0aSDavid van Moolenbroek return; 4152be5c0aSDavid van Moolenbroek 4252be5c0aSDavid van Moolenbroek memset(&extra_ptr[node->i_num * extra_size], 0, extra_size); 4352be5c0aSDavid van Moolenbroek } 4452be5c0aSDavid van Moolenbroek 4552be5c0aSDavid van Moolenbroek /* 4652be5c0aSDavid van Moolenbroek * Retrieve a pointer to the extra data for the given inode. 4752be5c0aSDavid van Moolenbroek */ 4852be5c0aSDavid van Moolenbroek void * get_inode_extra(const struct inode * node)4952be5c0aSDavid van Moolenbroekget_inode_extra(const struct inode * node) 5052be5c0aSDavid van Moolenbroek { 5152be5c0aSDavid van Moolenbroek 5252be5c0aSDavid van Moolenbroek if (extra_size == 0) 5352be5c0aSDavid van Moolenbroek return NULL; 5452be5c0aSDavid van Moolenbroek 5552be5c0aSDavid van Moolenbroek return (void *)&extra_ptr[node->i_num * extra_size]; 5652be5c0aSDavid van Moolenbroek } 57