Blame libglusterfs/src/glusterfs/inode.h

Packit Service e080da
/*
Packit Service e080da
  Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com>
Packit Service e080da
  This file is part of GlusterFS.
Packit Service e080da
Packit Service e080da
  This file is licensed to you under your choice of the GNU Lesser
Packit Service e080da
  General Public License, version 3 or any later version (LGPLv3 or
Packit Service e080da
  later), or the GNU General Public License, version 2 (GPLv2), in all
Packit Service e080da
  cases as published by the Free Software Foundation.
Packit Service e080da
*/
Packit Service e080da
Packit Service e080da
#ifndef _INODE_H
Packit Service e080da
#define _INODE_H
Packit Service e080da
Packit Service e080da
#include <stdint.h>
Packit Service e080da
#include <sys/types.h>
Packit Service e080da
Packit Service e080da
#define LOOKUP_NEEDED 1
Packit Service e080da
#define LOOKUP_NOT_NEEDED 2
Packit Service e080da
Packit Service e080da
#define DEFAULT_INODE_MEMPOOL_ENTRIES 32 * 1024
Packit Service e080da
#define INODE_PATH_FMT "<gfid:%s>"
Packit Service e080da
struct _inode_table;
Packit Service e080da
typedef struct _inode_table inode_table_t;
Packit Service e080da
Packit Service e080da
struct _inode;
Packit Service e080da
typedef struct _inode inode_t;
Packit Service e080da
Packit Service e080da
struct _dentry;
Packit Service e080da
typedef struct _dentry dentry_t;
Packit Service e080da
Packit Service e080da
#include "glusterfs/list.h"
Packit Service e080da
#include "glusterfs/iatt.h"
Packit Service e080da
#include "glusterfs/compat-uuid.h"
Packit Service e080da
#include "glusterfs/fd.h"
Packit Service e080da
Packit Service e080da
struct _inode_table {
Packit Service e080da
    pthread_mutex_t lock;
Packit Service e080da
    size_t hashsize;    /* bucket size of inode hash and dentry hash */
Packit Service e080da
    char *name;         /* name of the inode table, just for gf_log() */
Packit Service e080da
    inode_t *root;      /* root directory inode, with number 1 */
Packit Service e080da
    xlator_t *xl;       /* xlator to be called to do purge */
Packit Service e080da
    uint32_t lru_limit; /* maximum LRU cache size */
Packit Service e080da
    struct list_head *inode_hash; /* buckets for inode hash table */
Packit Service e080da
    struct list_head *name_hash;  /* buckets for dentry hash table */
Packit Service e080da
    struct list_head active; /* list of inodes currently active (in an fop) */
Packit Service e080da
    uint32_t active_size;    /* count of inodes in active list */
Packit Service e080da
    struct list_head lru;    /* list of inodes recently used.
Packit Service e080da
                                lru.next most recent */
Packit Service e080da
    uint32_t lru_size;       /* count of inodes in lru list  */
Packit Service e080da
    struct list_head purge;  /* list of inodes to be purged soon */
Packit Service e080da
    uint32_t purge_size;     /* count of inodes in purge list */
Packit Service e080da
Packit Service e080da
    struct mem_pool *inode_pool;  /* memory pool for inodes */
Packit Service e080da
    struct mem_pool *dentry_pool; /* memory pool for dentrys */
Packit Service e080da
    struct mem_pool *fd_mem_pool; /* memory pool for fd_t */
Packit Service e080da
    int ctxcount;                 /* number of slots in inode->ctx */
Packit Service e080da
Packit Service e080da
    /* This is required for 'invalidation' when 'nlookup' would be used,
Packit Service e080da
       specially in case of fuse-bridge */
Packit Service e080da
    int32_t (*invalidator_fn)(xlator_t *, inode_t *);
Packit Service e080da
    xlator_t *invalidator_xl;
Packit Service e080da
    struct list_head invalidate; /* inodes which are in invalidation queue */
Packit Service e080da
    uint32_t invalidate_size;    /* count of inodes in invalidation list */
Packit Service e080da
};
Packit Service e080da
Packit Service e080da
struct _dentry {
Packit Service e080da
    struct list_head inode_list; /* list of dentries of inode */
Packit Service e080da
    struct list_head hash;       /* hash table pointers */
Packit Service e080da
    inode_t *inode;              /* inode of this directory entry */
Packit Service e080da
    char *name;                  /* name of the directory entry */
Packit Service e080da
    inode_t *parent;             /* directory of the entry */
Packit Service e080da
};
Packit Service e080da
Packit Service e080da
struct _inode_ctx {
Packit Service e080da
    union {
Packit Service e080da
        uint64_t key;
Packit Service e080da
        xlator_t *xl_key;
Packit Service e080da
    };
Packit Service e080da
    /* if value1 is 0, then field is not set.. */
Packit Service e080da
    union {
Packit Service e080da
        uint64_t value1;
Packit Service e080da
        void *ptr1;
Packit Service e080da
    };
Packit Service e080da
    /* if value2 is 0, then field is not set.. */
Packit Service e080da
    union {
Packit Service e080da
        uint64_t value2;
Packit Service e080da
        void *ptr2;
Packit Service e080da
    };
Packit Service e080da
    int ref; /* This is for debugging inode ref leaks,
Packit Service e080da
                basically helps in identifying the xlator
Packit Service e080da
                causing th ref leak, it is printed in
Packit Service e080da
                statedump */
Packit Service e080da
};
Packit Service e080da
Packit Service e080da
struct _inode {
Packit Service e080da
    inode_table_t *table; /* the table this inode belongs to */
Packit Service e080da
    uuid_t gfid;
Packit Service e080da
    gf_lock_t lock;
Packit Service e080da
    gf_atomic_t nlookup;
Packit Service e080da
    uint32_t fd_count;            /* Open fd count */
Packit Service e080da
    uint32_t active_fd_count;     /* Active open fd count */
Packit Service e080da
    uint32_t ref;                 /* reference count on this inode */
Packit Service e080da
    ia_type_t ia_type;            /* what kind of file */
Packit Service e080da
    struct list_head fd_list;     /* list of open files on this inode */
Packit Service e080da
    struct list_head dentry_list; /* list of directory entries for this inode */
Packit Service e080da
    struct list_head hash;        /* hash table pointers */
Packit Service e080da
    struct list_head list;        /* active/lru/purge */
Packit Service e080da
Packit Service e080da
    struct _inode_ctx *_ctx; /* replacement for dict_t *(inode->ctx) */
Packit Service 173fb3
    bool in_invalidate_list; /* Set if inode is in table invalidate list */
Packit Service e080da
    bool invalidate_sent;    /* Set it if invalidator_fn is called for inode */
Packit Service e080da
};
Packit Service e080da
Packit Service e080da
#define UUID0_STR "00000000-0000-0000-0000-000000000000"
Packit Service e080da
#define GFID_STR_PFX "<gfid:" UUID0_STR ">"
Packit Service e080da
#define GFID_STR_PFX_LEN (sizeof(GFID_STR_PFX) - 1)
Packit Service e080da
Packit Service e080da
inode_table_t *
Packit Service e080da
inode_table_new(uint32_t lru_limit, xlator_t *xl);
Packit Service e080da
Packit Service e080da
inode_table_t *
Packit Service e080da
inode_table_with_invalidator(uint32_t lru_limit, xlator_t *xl,
Packit Service e080da
                             int32_t (*invalidator_fn)(xlator_t *, inode_t *),
Packit Service e080da
                             xlator_t *invalidator_xl);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_table_destroy_all(glusterfs_ctx_t *ctx);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_table_destroy(inode_table_t *inode_table);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_new(inode_table_t *table);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_link(inode_t *inode, inode_t *parent, const char *name,
Packit Service e080da
           struct iatt *stbuf);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_unlink(inode_t *inode, inode_t *parent, const char *name);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_parent(inode_t *inode, uuid_t pargfid, const char *name);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_ref(inode_t *inode);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_unref(inode_t *inode);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_lookup(inode_t *inode);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_forget(inode_t *inode, uint64_t nlookup);
Packit Service e080da
int
Packit Service e080da
inode_forget_with_unref(inode_t *inode, uint64_t nlookup);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ref_reduce_by_n(inode_t *inode, uint64_t nref);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_invalidate(inode_t *inode);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_rename(inode_table_t *table, inode_t *olddir, const char *oldname,
Packit Service e080da
             inode_t *newdir, const char *newname, inode_t *inode,
Packit Service e080da
             struct iatt *stbuf);
Packit Service e080da
Packit Service e080da
dentry_t *
Packit Service e080da
__dentry_grep(inode_table_t *table, inode_t *parent, const char *name);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_grep(inode_table_t *table, inode_t *parent, const char *name);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_grep_for_gfid(inode_table_t *table, inode_t *parent, const char *name,
Packit Service e080da
                    uuid_t gfid, ia_type_t *type);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_find(inode_table_t *table, uuid_t gfid);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_path(inode_t *inode, const char *name, char **bufp);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
__inode_path(inode_t *inode, const char *name, char **bufp);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_from_path(inode_table_t *table, const char *path);
Packit Service e080da
Packit Service e080da
inode_t *
Packit Service e080da
inode_resolve(inode_table_t *table, char *path);
Packit Service e080da
Packit Service e080da
/* deal with inode ctx's both values */
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
               uint64_t *value2);
Packit Service e080da
int
Packit Service e080da
__inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
                 uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
               uint64_t *value2);
Packit Service e080da
int
Packit Service e080da
__inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
                 uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_del2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
               uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_reset2(inode_t *inode, xlator_t *xlator, uint64_t *value1,
Packit Service e080da
                 uint64_t *value2);
Packit Service e080da
Packit Service e080da
/* deal with inode ctx's 1st value */
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
__inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1);
Packit Service e080da
int
Packit Service e080da
__inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_reset0(inode_t *inode, xlator_t *xlator, uint64_t *value1);
Packit Service e080da
Packit Service e080da
/* deal with inode ctx's 2st value */
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
__inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2);
Packit Service e080da
int
Packit Service e080da
__inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_ctx_reset1(inode_t *inode, xlator_t *xlator, uint64_t *value2);
Packit Service e080da
Packit Service e080da
static inline int
Packit Service e080da
__inode_ctx_put(inode_t *inode, xlator_t *this, uint64_t v)
Packit Service e080da
{
Packit Service e080da
    return __inode_ctx_set0(inode, this, &v);
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
static inline int
Packit Service e080da
inode_ctx_put(inode_t *inode, xlator_t *this, uint64_t v)
Packit Service e080da
{
Packit Service e080da
    return inode_ctx_set0(inode, this, &v);
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
#define __inode_ctx_set(i, x, v_p) __inode_ctx_set0(i, x, v_p)
Packit Service e080da
Packit Service e080da
#define inode_ctx_set(i, x, v_p) inode_ctx_set0(i, x, v_p)
Packit Service e080da
Packit Service e080da
#define inode_ctx_reset(i, x, v) inode_ctx_reset0(i, x, v)
Packit Service e080da
Packit Service e080da
#define __inode_ctx_get(i, x, v) __inode_ctx_get0(i, x, v)
Packit Service e080da
Packit Service e080da
#define inode_ctx_get(i, x, v) inode_ctx_get0(i, x, v)
Packit Service e080da
Packit Service e080da
#define inode_ctx_del(i, x, v) inode_ctx_del2(i, x, v, 0)
Packit Service e080da
#define inode_ctx_del1(i, x, v) inode_ctx_del2(i, x, 0, v)
Packit Service e080da
Packit Service e080da
gf_boolean_t
Packit Service e080da
__is_root_gfid(uuid_t gfid);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
__inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_ctx_merge(fd_t *fd, inode_t *inode, inode_t *linked_inode);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_is_linked(inode_t *inode);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_set_need_lookup(inode_t *inode, xlator_t *this);
Packit Service e080da
Packit Service e080da
gf_boolean_t
Packit Service e080da
inode_needs_lookup(inode_t *inode, xlator_t *this);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
inode_has_dentry(inode_t *inode);
Packit Service e080da
Packit Service e080da
size_t
Packit Service e080da
inode_ctx_size(inode_t *inode);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
inode_find_directory_name(inode_t *inode, const char **name);
Packit Service e080da
#endif /* _INODE_H */