diff options
| author | Amar Tumballi <amar@gluster.com> | 2009-10-18 14:05:40 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-18 12:39:13 -0700 | 
| commit | 11ddca1cd151479243fe23e579b76c5984f422c3 (patch) | |
| tree | 04d7f60b390c44aafdf45be84673ade0826b0a82 | |
| parent | 3d09fb99093a84a303edc443b68bdf9eb10096b4 (diff) | |
inode_ctx_{get,put,del}2 API support
support for storing multiple values for a key in inode context - used for storing
inode and generation number pairs on the server in protocol/client inode ctx
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 315 (generation number support)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=315
| -rw-r--r-- | libglusterfs/src/inode.c | 94 | ||||
| -rw-r--r-- | libglusterfs/src/inode.h | 30 | 
2 files changed, 98 insertions, 26 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index 18a5a85db50..ee8b3ece83a 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -1102,8 +1102,10 @@ inode_from_path (inode_table_t *itable, const char *path)          return inode;  } +  int -__inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value) +__inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1, +                  uint64_t value2)  {          int ret = 0;          int index = 0; @@ -1116,25 +1118,28 @@ __inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)                          /* dont break, to check if key already exists                             further on */                  } -                if (inode->_ctx[index].key == (uint64_t)(long) xlator) { +                if (inode->_ctx[index].xl_key == xlator) {                          put_idx = index;                          break;                  }          } -         +          if (put_idx == -1) {                  ret = -1;                  goto out;;          } -        inode->_ctx[put_idx].key   = (uint64_t)(long) xlator; -        inode->_ctx[put_idx].value = value; +        inode->_ctx[put_idx].xl_key = xlator; +        inode->_ctx[put_idx].value1 = value1; +        inode->_ctx[put_idx].value2 = value2;  out:          return ret;  } +  int -inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value) +inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1, +                uint64_t value2)  {          int ret = 0; @@ -1143,21 +1148,23 @@ inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)          LOCK (&inode->lock);          { -                ret = __inode_ctx_put (inode, xlator, value); +                ret = __inode_ctx_put2 (inode, xlator, value1, value2);          }          UNLOCK (&inode->lock);          return ret;  } +  int -__inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value) +__inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, +                  uint64_t *value2)  {          int index = 0;          int ret = 0;          for (index = 0; index < xlator->ctx->xl_count; index++) { -                if (inode->_ctx[index].key == (uint64_t)(long)xlator) +                if (inode->_ctx[index].xl_key == xlator)                          break;          } @@ -1166,15 +1173,20 @@ __inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)                  goto out;          } -        if (value)  -                *value = inode->_ctx[index].value; +        if (value1) +                *value1 = inode->_ctx[index].value1; + +        if (value2) +                *value2 = inode->_ctx[index].value2;  out:          return ret;  } -int  -inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value) + +int +inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, +                uint64_t *value2)  {          int ret = 0; @@ -1183,7 +1195,7 @@ inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)          LOCK (&inode->lock);          { -                ret = __inode_ctx_get (inode, xlator, value); +                ret = __inode_ctx_get2 (inode, xlator, value1, value2);          }          UNLOCK (&inode->lock); @@ -1191,8 +1203,9 @@ inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value)  } -int  -inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value) +int +inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, +                uint64_t *value2)  {          int index = 0;          int ret = 0; @@ -1203,7 +1216,7 @@ inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value)          LOCK (&inode->lock);          {                  for (index = 0; index < xlator->ctx->xl_count; index++) { -                        if (inode->_ctx[index].key == (uint64_t)(long)xlator) +                        if (inode->_ctx[index].xl_key == xlator)                                  break;                  } @@ -1212,11 +1225,14 @@ inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value)                          goto unlock;                  } -                if (value) -                        *value = inode->_ctx[index].value;               +                if (value1) +                        *value1 = inode->_ctx[index].value1; +                if (value2) +                        *value2 = inode->_ctx[index].value2; -                inode->_ctx[index].key   = 0; -                inode->_ctx[index].value = 0; +                inode->_ctx[index].key    = 0; +                inode->_ctx[index].value1 = 0; +                inode->_ctx[index].value2 = 0;          }  unlock:          UNLOCK (&inode->lock); @@ -1224,6 +1240,42 @@ unlock:          return ret;  } + +int +__inode_ctx_put (inode_t *inode, xlator_t *key, uint64_t value) +{ +        return __inode_ctx_put2 (inode, key, value, 0); +} + + +int +inode_ctx_put (inode_t *inode, xlator_t *key, uint64_t value) +{ +        return inode_ctx_put2 (inode, key, value, 0); +} + + +int +__inode_ctx_get (inode_t *inode, xlator_t *key, uint64_t *value) +{ +        return __inode_ctx_get2 (inode, key, value, 0); +} + + +int +inode_ctx_get (inode_t *inode, xlator_t *key, uint64_t *value) +{ +        return inode_ctx_get2 (inode, key, value, 0); +} + + +int +inode_ctx_del (inode_t *inode, xlator_t *key, uint64_t *value) +{ +        return inode_ctx_del2 (inode, key, value, 0); +} + +  void  inode_dump (inode_t *inode, char *prefix)  { diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index d1486ca3165..520df7dbcbe 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -73,11 +73,19 @@ struct _dentry {          inode_t           *parent;       /* directory of the entry */  }; -//#define ZR_INODE_CTX_VALUE_LEN 2  struct _inode_ctx { -	uint64_t key; -	uint64_t value; -	//uint64_t value[ZR_INODE_CTX_VALUE_LEN]; +        union { +                uint64_t    key; +                xlator_t   *xl_key; +        }; +        union { +                uint64_t    value1; +                void       *ptr1; +        }; +        union { +                uint64_t    value2; +                void       *ptr2; +        };  };  struct _inode { @@ -155,7 +163,7 @@ __inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value);  int  inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value); -int +int   __inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value);  int  @@ -164,4 +172,16 @@ inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value);  int   inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value); +int +inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1, +                uint64_t value2); + +int +inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, +                uint64_t *value2); + +int +inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, +                uint64_t *value2); +  #endif /* _INODE_H */  | 
