summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/inode.c479
1 files changed, 226 insertions, 253 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c
index 9a55034d8..825ab4c5c 100644
--- a/libglusterfs/src/inode.c
+++ b/libglusterfs/src/inode.c
@@ -1,20 +1,20 @@
/*
- Copyright (c) 2007-2009 Gluster, Inc. <http://www.gluster.com>
- This file is part of GlusterFS.
-
- GlusterFS is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- GlusterFS is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see
- <http://www.gnu.org/licenses/>.
+ Copyright (c) 2007-2009 Gluster, Inc. <http://www.gluster.com>
+ This file is part of GlusterFS.
+
+ GlusterFS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3 of the License,
+ or (at your option) any later version.
+
+ GlusterFS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ <http://www.gnu.org/licenses/>.
*/
#ifndef _CONFIG_H
@@ -36,17 +36,17 @@
move latest accessed dentry to list_head of inode
*/
-#define INODE_DUMP_LIST(head, key_buf, key_prefix, list_type) \
-{ \
- int i = 1;\
- inode_t *inode = NULL;\
- list_for_each_entry (inode, head, list) {\
- gf_proc_dump_build_key(key_buf, key_prefix, "%s.%d",list_type,\
- i++);\
- gf_proc_dump_add_section(key_buf);\
- inode_dump(inode, key);\
- }\
-}
+#define INODE_DUMP_LIST(head, key_buf, key_prefix, list_type) \
+ { \
+ int i = 1; \
+ inode_t *inode = NULL; \
+ list_for_each_entry (inode, head, list) { \
+ gf_proc_dump_build_key(key_buf, key_prefix, "%s.%d",list_type, \
+ i++); \
+ gf_proc_dump_add_section(key_buf); \
+ inode_dump(inode, key); \
+ } \
+ }
static inode_t *
__inode_unref (inode_t *inode);
@@ -55,9 +55,7 @@ static int
inode_table_prune (inode_table_t *table);
static int
-hash_name (ino_t par,
- const char *name,
- int mod)
+hash_name (ino_t par, const char *name, int mod)
{
int hash = 0;
int ret = 0;
@@ -75,8 +73,7 @@ hash_name (ino_t par,
static int
-hash_inode (ino_t ino,
- int mod)
+hash_inode (ino_t ino, int mod)
{
int hash = 0;
@@ -167,10 +164,9 @@ __inode_hash (inode_t *inode)
static inode_t *
-__inode_search (inode_table_t *table,
- ino_t ino)
+__inode_search (inode_table_t *table, ino_t ino)
{
- int hash = 0;
+ int hash = 0;
inode_t *inode = NULL;
inode_t *tmp = NULL;
@@ -188,9 +184,7 @@ __inode_search (inode_table_t *table,
static dentry_t *
-__dentry_search_for_inode (inode_t *inode,
- ino_t par,
- const char *name)
+__dentry_search_for_inode (inode_t *inode, ino_t par, const char *name)
{
dentry_t *dentry = NULL;
dentry_t *tmp = NULL;
@@ -207,9 +201,7 @@ __dentry_search_for_inode (inode_t *inode,
dentry_t *
-dentry_search_for_inode (inode_t *inode,
- ino_t par,
- const char *name)
+dentry_search_for_inode (inode_t *inode, ino_t par, const char *name)
{
dentry_t *dentry = NULL;
pthread_mutex_lock (&inode->table->lock);
@@ -223,9 +215,7 @@ dentry_search_for_inode (inode_t *inode,
static dentry_t *
-__dentry_search (inode_table_t *table,
- ino_t par,
- const char *name)
+__dentry_search (inode_table_t *table, ino_t par, const char *name)
{
int hash = 0;
dentry_t *dentry = NULL;
@@ -247,21 +237,21 @@ __dentry_search (inode_table_t *table,
static void
__inode_destroy (inode_t *inode)
{
- int index = 0;
+ int index = 0;
xlator_t *xl = NULL;
- if (!inode->_ctx)
- goto noctx;
+ if (!inode->_ctx)
+ goto noctx;
- for (index = 0; index < inode->table->xl->ctx->xl_count; index++) {
- if (inode->_ctx[index].key) {
- xl = (xlator_t *)(long)inode->_ctx[index].key;
- if (xl->cbks->forget)
- xl->cbks->forget (xl, inode);
- }
- }
+ for (index = 0; index < inode->table->xl->ctx->xl_count; index++) {
+ if (inode->_ctx[index].key) {
+ xl = (xlator_t *)(long)inode->_ctx[index].key;
+ if (xl->cbks->forget)
+ xl->cbks->forget (xl, inode);
+ }
+ }
- FREE (inode->_ctx);
+ FREE (inode->_ctx);
noctx:
LOCK_DESTROY (&inode->lock);
// memset (inode, 0xb, sizeof (*inode));
@@ -390,9 +380,7 @@ inode_ref (inode_t *inode)
static dentry_t *
-__dentry_create (inode_t *inode,
- inode_t *parent,
- const char *name)
+__dentry_create (inode_t *inode, inode_t *parent, const char *name)
{
dentry_t *newd = NULL;
@@ -436,8 +424,8 @@ __inode_create (inode_table_t *table)
list_add (&newi->list, &table->lru);
table->lru_size++;
- newi->_ctx = CALLOC (1, (sizeof (struct _inode_ctx) *
- table->xl->ctx->xl_count));
+ newi->_ctx = CALLOC (1, (sizeof (struct _inode_ctx) *
+ table->xl->ctx->xl_count));
return newi;
}
@@ -483,11 +471,9 @@ __inode_forget (inode_t *inode, uint64_t nlookup)
inode_t *
-inode_search (inode_table_t *table,
- ino_t ino,
- const char *name)
+inode_search (inode_table_t *table, ino_t ino, const char *name)
{
- inode_t *inode = NULL;
+ inode_t *inode = NULL;
dentry_t *dentry = NULL;
pthread_mutex_lock (&table->lock);
@@ -569,15 +555,13 @@ __inode_replace (inode_t *oldi, inode_t *newi)
__inode_unhash (oldi);
- if (newi->ino == 1)
- newi->table->root = newi;
+ if (newi->ino == 1)
+ newi->table->root = newi;
}
static inode_t *
-__inode_link (inode_t *inode,
- inode_t *parent,
- const char *name,
+__inode_link (inode_t *inode, inode_t *parent, const char *name,
struct stat *stbuf)
{
dentry_t *dentry = NULL;
@@ -587,8 +571,8 @@ __inode_link (inode_t *inode,
table = inode->table;
- if (inode->ino)
- assert (inode->ino == stbuf->st_ino);
+ if (inode->ino)
+ assert (inode->ino == stbuf->st_ino);
inode->ino = stbuf->st_ino;
inode->st_mode = stbuf->st_mode;
@@ -615,18 +599,16 @@ __inode_link (inode_t *inode,
__dentry_hash (dentry);
} else if (inode->ino != 1) {
- gf_log (table->name, GF_LOG_DEBUG,
- "child (%"PRId64") without a parent!", inode->ino);
- }
-
+ gf_log (table->name, GF_LOG_DEBUG,
+ "child (%"PRId64") without a parent!", inode->ino);
+ }
+
return inode;
}
int
-inode_link (inode_t *inode,
- inode_t *parent,
- const char *name,
+inode_link (inode_t *inode, inode_t *parent, const char *name,
struct stat *stbuf)
{
inode_table_t *table = NULL;
@@ -649,18 +631,18 @@ int
inode_lookup (inode_t *inode)
{
inode_table_t *table = NULL;
- inode_t *lookup_inode = NULL;
+ inode_t *lookup_inode = NULL;
table = inode->table;
- lookup_inode = inode;
+ lookup_inode = inode;
pthread_mutex_lock (&table->lock);
{
- if (!__is_inode_hashed (inode)) {
- lookup_inode = __inode_search (table, inode->ino);
+ if (!__is_inode_hashed (inode)) {
+ lookup_inode = __inode_search (table, inode->ino);
if (lookup_inode == NULL)
lookup_inode = inode;
- }
+ }
__inode_lookup (lookup_inode);
}
@@ -674,20 +656,20 @@ int
inode_forget (inode_t *inode, uint64_t nlookup)
{
inode_table_t *table = NULL;
- inode_t *forget_inode = NULL;
+ inode_t *forget_inode = NULL;
table = inode->table;
- forget_inode = inode;
+ forget_inode = inode;
pthread_mutex_lock (&table->lock);
{
- if (!__is_inode_hashed (inode)) {
- forget_inode = __inode_search (table, inode->ino);
+ if (!__is_inode_hashed (inode)) {
+ forget_inode = __inode_search (table, inode->ino);
if (forget_inode == NULL)
forget_inode = inode;
- }
+ }
- __inode_forget (forget_inode, nlookup);
+ __inode_forget (forget_inode, nlookup);
}
pthread_mutex_unlock (&table->lock);
@@ -698,38 +680,34 @@ inode_forget (inode_t *inode, uint64_t nlookup)
static void
-__inode_unlink (inode_t *inode,
- inode_t *parent,
- const char *name)
+__inode_unlink (inode_t *inode, inode_t *parent, const char *name)
{
dentry_t *dentry = NULL;
dentry = __dentry_search_for_inode (inode, parent->ino, name);
- /* dentry NULL for corrupted backend */
- if (dentry)
- __dentry_unset (dentry);
+ /* dentry NULL for corrupted backend */
+ if (dentry)
+ __dentry_unset (dentry);
}
-
+
void
-inode_unlink (inode_t *inode,
- inode_t *parent,
- const char *name)
+inode_unlink (inode_t *inode, inode_t *parent, const char *name)
{
inode_table_t *table = NULL;
- inode_t *unlink_inode = NULL;
+ inode_t *unlink_inode = NULL;
table = inode->table;
- unlink_inode = inode;
+ unlink_inode = inode;
pthread_mutex_lock (&table->lock);
{
- if (!__is_inode_hashed (inode)) {
- unlink_inode = __inode_search (table, inode->ino);
+ if (!__is_inode_hashed (inode)) {
+ unlink_inode = __inode_search (table, inode->ino);
if (unlink_inode == NULL)
unlink_inode = inode;
- }
+ }
__inode_unlink (unlink_inode, parent, name);
}
@@ -740,30 +718,26 @@ inode_unlink (inode_t *inode,
int
-inode_rename (inode_table_t *table,
- inode_t *srcdir,
- const char *srcname,
- inode_t *dstdir,
- const char *dstname,
- inode_t *inode,
+inode_rename (inode_table_t *table, inode_t *srcdir, const char *srcname,
+ inode_t *dstdir, const char *dstname, inode_t *inode,
struct stat *stbuf)
{
- dentry_t *old_dst = NULL;
- inode_t *rename_inode = NULL;
+ dentry_t *old_dst = NULL;
+ inode_t *rename_inode = NULL;
- rename_inode = inode;
+ rename_inode = inode;
pthread_mutex_lock (&table->lock);
{
- if (!__is_inode_hashed (inode)) {
- rename_inode = __inode_search (table, inode->ino);
+ if (!__is_inode_hashed (inode)) {
+ rename_inode = __inode_search (table, inode->ino);
if (rename_inode == NULL)
rename_inode = inode;
- }
+ }
- old_dst = __dentry_search (table, dstdir->ino, dstname);
- if (old_dst)
- __dentry_unset (old_dst);
+ old_dst = __dentry_search (table, dstdir->ino, dstname);
+ if (old_dst)
+ __dentry_unset (old_dst);
__inode_unlink (rename_inode, srcdir, srcname);
__inode_link (rename_inode, dstdir, dstname, stbuf);
@@ -779,24 +753,24 @@ inode_rename (inode_table_t *table,
static dentry_t *
__dentry_search_arbit (inode_t *inode)
{
- dentry_t *dentry = NULL;
- dentry_t *trav = NULL;
-
- list_for_each_entry (trav, &inode->dentry_list, inode_list) {
- if (__is_dentry_hashed (trav)) {
- dentry = trav;
- break;
- }
- }
-
- if (!dentry) {
- list_for_each_entry (trav, &inode->dentry_list, inode_list) {
- dentry = trav;
- break;
- }
- }
-
- return dentry;
+ dentry_t *dentry = NULL;
+ dentry_t *trav = NULL;
+
+ list_for_each_entry (trav, &inode->dentry_list, inode_list) {
+ if (__is_dentry_hashed (trav)) {
+ dentry = trav;
+ break;
+ }
+ }
+
+ if (!dentry) {
+ list_for_each_entry (trav, &inode->dentry_list, inode_list) {
+ dentry = trav;
+ break;
+ }
+ }
+
+ return dentry;
}
@@ -826,18 +800,16 @@ inode_parent (inode_t *inode, ino_t par, const char *name)
}
-int32_t
-inode_path (inode_t *inode,
- const char *name,
- char **bufp)
+int
+inode_path (inode_t *inode, const char *name, char **bufp)
{
inode_table_t *table = NULL;
dentry_t *trav = NULL;
size_t i = 0, size = 0;
int64_t ret = 0;
int len = 0;
- char *buf = NULL;
-
+ char *buf = NULL;
+
table = inode->table;
pthread_mutex_lock (&table->lock);
@@ -854,15 +826,15 @@ inode_path (inode_t *inode,
goto unlock;
}
}
-
- if ((inode->ino != 1) &&
- (i == 0)) {
- gf_log (table->name, GF_LOG_DEBUG,
- "no dentry for non-root inode %"PRId64,
- inode->ino);
- ret = -ENOENT;
- goto unlock;
- }
+
+ if ((inode->ino != 1) &&
+ (i == 0)) {
+ gf_log (table->name, GF_LOG_DEBUG,
+ "no dentry for non-root inode %"PRId64,
+ inode->ino);
+ ret = -ENOENT;
+ goto unlock;
+ }
if (name) {
i++;
@@ -870,8 +842,8 @@ inode_path (inode_t *inode,
}
ret = i;
- size = i + 1;
- buf = CALLOC (size, sizeof (char));
+ size = i + 1;
+ buf = CALLOC (size, sizeof (char));
if (buf) {
buf[size - 1] = 0;
@@ -890,31 +862,31 @@ inode_path (inode_t *inode,
buf[i-len-1] = '/';
i -= (len + 1);
}
- *bufp = buf;
+ *bufp = buf;
} else {
- gf_log (table->name, GF_LOG_ERROR,
- "out of memory");
- ret = -ENOMEM;
- }
+ gf_log (table->name, GF_LOG_ERROR,
+ "out of memory");
+ ret = -ENOMEM;
+ }
}
unlock:
pthread_mutex_unlock (&table->lock);
- if (inode->ino == 1 && !name) {
- ret = 1;
- if (buf) {
- FREE (buf);
- }
- buf = CALLOC (ret + 1, sizeof (char));
- if (buf) {
- strcpy (buf, "/");
- *bufp = buf;
- } else {
- gf_log (table->name, GF_LOG_ERROR,
- "out of memory");
- ret = -ENOMEM;
- }
- }
+ if (inode->ino == 1 && !name) {
+ ret = 1;
+ if (buf) {
+ FREE (buf);
+ }
+ buf = CALLOC (ret + 1, sizeof (char));
+ if (buf) {
+ strcpy (buf, "/");
+ *bufp = buf;
+ } else {
+ gf_log (table->name, GF_LOG_ERROR,
+ "out of memory");
+ ret = -ENOMEM;
+ }
+ }
return ret;
}
@@ -924,9 +896,9 @@ inode_table_prune (inode_table_t *table)
{
int ret = 0;
struct list_head purge = {0, };
- inode_t *del = NULL;
- inode_t *tmp = NULL;
- inode_t *entry = NULL;
+ inode_t *del = NULL;
+ inode_t *tmp = NULL;
+ inode_t *entry = NULL;
INIT_LIST_HEAD (&purge);
@@ -945,7 +917,7 @@ inode_table_prune (inode_table_t *table)
}
list_splice_init (&table->purge, &purge);
- table->purge_size = 0;
+ table->purge_size = 0;
}
pthread_mutex_unlock (&table->lock);
@@ -1028,7 +1000,7 @@ inode_table_new (size_t lru_limit, xlator_t *xl)
;
}
- __inode_table_init_root (new);
+ __inode_table_init_root (new);
pthread_mutex_init (&new->lock, NULL);
@@ -1039,52 +1011,52 @@ inode_table_new (size_t lru_limit, xlator_t *xl)
inode_t *
inode_from_path (inode_table_t *itable, const char *path)
{
- inode_t *inode = NULL;
- inode_t *parent = NULL;
- inode_t *root = NULL;
- inode_t *curr = NULL;
- char *pathname = NULL;
- char *component = NULL, *next_component = NULL;
- char *strtokptr = NULL;
-
- /* top-down approach */
- root = itable->root;
- parent = inode_ref (root);
- pathname = strdup (path);
- component = strtok_r (pathname, "/", &strtokptr);
-
- if (component == NULL)
- /* root inode */
- inode = inode_ref (parent);
-
- while (component) {
- curr = inode_search (itable, parent->ino, component);
-
- if (curr == NULL) {
- component = strtok_r (NULL, "/", &strtokptr);
- break;
- }
-
- next_component = strtok_r (NULL, "/", &strtokptr);
-
- if (next_component) {
- inode_unref (parent);
- parent = curr;
- curr = NULL;
- } else {
- inode = curr;
- }
-
- component = next_component;
- }
-
- if (parent)
- inode_unref (parent);
-
- if (pathname)
- free (pathname);
-
- return inode;
+ inode_t *inode = NULL;
+ inode_t *parent = NULL;
+ inode_t *root = NULL;
+ inode_t *curr = NULL;
+ char *pathname = NULL;
+ char *component = NULL, *next_component = NULL;
+ char *strtokptr = NULL;
+
+ /* top-down approach */
+ root = itable->root;
+ parent = inode_ref (root);
+ pathname = strdup (path);
+ component = strtok_r (pathname, "/", &strtokptr);
+
+ if (component == NULL)
+ /* root inode */
+ inode = inode_ref (parent);
+
+ while (component) {
+ curr = inode_search (itable, parent->ino, component);
+
+ if (curr == NULL) {
+ component = strtok_r (NULL, "/", &strtokptr);
+ break;
+ }
+
+ next_component = strtok_r (NULL, "/", &strtokptr);
+
+ if (next_component) {
+ inode_unref (parent);
+ parent = curr;
+ curr = NULL;
+ } else {
+ inode = curr;
+ }
+
+ component = next_component;
+ }
+
+ if (parent)
+ inode_unref (parent);
+
+ if (pathname)
+ free (pathname);
+
+ return inode;
}
int
@@ -1106,7 +1078,7 @@ __inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)
break;
}
}
-
+
if (put_idx == -1) {
ret = -1;
goto out;;
@@ -1123,8 +1095,8 @@ inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)
{
int ret = 0;
- if (!inode || !xlator)
- return -1;
+ if (!inode || !xlator)
+ return -1;
LOCK (&inode->lock);
{
@@ -1132,14 +1104,15 @@ inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)
}
UNLOCK (&inode->lock);
- return ret;
+ return ret;
}
int
__inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)
{
- int index = 0;
+ int index = 0;
int ret = 0;
+
for (index = 0; index < xlator->ctx->xl_count; index++) {
if (inode->_ctx[index].key == (uint64_t)(long)xlator)
break;
@@ -1162,8 +1135,8 @@ inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)
{
int ret = 0;
- if (!inode || !xlator)
- return -1;
+ if (!inode || !xlator)
+ return -1;
LOCK (&inode->lock);
{
@@ -1171,18 +1144,18 @@ inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)
}
UNLOCK (&inode->lock);
- return ret;
+ return ret;
}
int
inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value)
{
- int index = 0;
+ int index = 0;
int ret = 0;
- if (!inode || !xlator)
- return -1;
+ if (!inode || !xlator)
+ return -1;
LOCK (&inode->lock);
{
@@ -1197,7 +1170,7 @@ inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value)
}
if (value)
- *value = inode->_ctx[index].value;
+ *value = inode->_ctx[index].value;
inode->_ctx[index].key = 0;
inode->_ctx[index].value = 0;
@@ -1205,7 +1178,7 @@ inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value)
unlock:
UNLOCK (&inode->lock);
- return ret;
+ return ret;
}
void
@@ -1219,11 +1192,11 @@ inode_dump (inode_t *inode, char *prefix)
if (!inode)
return;
- ret = TRY_LOCK(&inode->lock);
+ ret = TRY_LOCK(&inode->lock);
if (ret != 0) {
gf_log("", GF_LOG_WARNING, "Unable to dump inode"
- " errno: %d", errno);
+ " errno: %d", errno);
return;
}
@@ -1237,17 +1210,17 @@ inode_dump (inode_t *inode, char *prefix)
gf_proc_dump_write(key, "%ld", inode->ino);
gf_proc_dump_build_key(key, prefix, "st_mode");
gf_proc_dump_write(key, "%d", inode->st_mode);
- UNLOCK(&inode->lock);
- if (!inode->_ctx)
- goto out;
-
- for (i = 0; i < inode->table->xl->ctx->xl_count; i++) {
- if (inode->_ctx[i].key) {
- xl = (xlator_t *)(long)inode->_ctx[i].key;
- if (xl->dumpops && xl->dumpops->inodectx)
- xl->dumpops->inodectx (xl, inode);
- }
- }
+ UNLOCK(&inode->lock);
+ if (!inode->_ctx)
+ goto out;
+
+ for (i = 0; i < inode->table->xl->ctx->xl_count; i++) {
+ if (inode->_ctx[i].key) {
+ xl = (xlator_t *)(long)inode->_ctx[i].key;
+ if (xl->dumpops && xl->dumpops->inodectx)
+ xl->dumpops->inodectx (xl, inode);
+ }
+ }
out:
return;
@@ -1264,11 +1237,11 @@ inode_table_dump (inode_table_t *itable, char *prefix)
return;
memset(key, 0, sizeof(key));
- ret = pthread_mutex_trylock(&itable->lock);
+ ret = pthread_mutex_trylock(&itable->lock);
if (ret != 0) {
gf_log("", GF_LOG_WARNING, "Unable to dump inode table"
- " errno: %d", errno);
+ " errno: %d", errno);
return;
}