|
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 */
|