diff options
| author | Amar Tumballi <amar@gluster.com> | 2010-08-09 05:43:01 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-08-11 22:24:38 -0700 | 
| commit | b8779318dd2d99e44f54de741beee32f55553e75 (patch) | |
| tree | 58d4d0dace2484b60c4b870c761d1182b529bfe7 /libglusterfs/src | |
| parent | 0b501ac95edc0ef5945228eb47e6482cfc4efa41 (diff) | |
fuse resolve related changes
Now fuse is fully complaint with DVM, as even if there is a fop
request on inode belonging to old graph, it will be resolved
corresponding to new graph and operations will be performed wrt.
new graph, which makes DVM truely spontaneous.
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 1240 (DVM: after graph change, inodes should resolve to new inode-table)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1240
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/fd.c | 39 | ||||
| -rw-r--r-- | libglusterfs/src/fd.h | 11 | 
2 files changed, 29 insertions, 21 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 231b7c5b00c..c9ac947341f 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -419,9 +419,9 @@ fd_destroy (fd_t *fd)  	 tmp_pool = fd->inode->table->fd_mem_pool;          if (IA_ISDIR (fd->inode->ia_type)) { -		for (i = 0; i < fd->inode->table->xl->graph->xl_count; i++) { +		for (i = 0; i < fd->xl_count; i++) {  			if (fd->_ctx[i].key) { -				xl = (xlator_t *)(long)fd->_ctx[i].key; +				xl = fd->_ctx[i].xl_key;                                  old_THIS = THIS;                                  THIS = xl;  				if (xl->cbks->releasedir) @@ -430,9 +430,9 @@ fd_destroy (fd_t *fd)  			}  		}          } else { -		for (i = 0; i < fd->inode->table->xl->graph->xl_count; i++) { +		for (i = 0; i < fd->xl_count; i++) {  			if (fd->_ctx[i].key) { -				xl = (xlator_t *)(long)fd->_ctx[i].key; +				xl = fd->_ctx[i].xl_key;                                  old_THIS = THIS;                                  THIS = xl;  				if (xl->cbks->release) @@ -513,8 +513,9 @@ fd_create (inode_t *inode, pid_t pid)          if (!fd)                  goto out; -        fd->_ctx = GF_CALLOC (1, (sizeof (struct _fd_ctx) * -                                  inode->table->xl->graph->xl_count), +        fd->xl_count = inode->table->xl->graph->xl_count + 1; + +        fd->_ctx = GF_CALLOC (1, (sizeof (struct _fd_ctx) * fd->xl_count),                                gf_common_mt_fd_ctx);          if (!fd->_ctx) {                  GF_FREE (fd); @@ -596,14 +597,14 @@ __fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)  	if (!fd || !xlator)  		return -1; -        for (index = 0; index < xlator->graph->xl_count; index++) { +        for (index = 0; index < fd->xl_count; index++) {                  if (!fd->_ctx[index].key) {                          if (set_idx == -1)                                  set_idx = index;                          /* dont break, to check if key already exists                             further on */                  } -                if (fd->_ctx[index].key == (uint64_t)(long) xlator) { +                if (fd->_ctx[index].xl_key == xlator) {                          set_idx = index;                          break;                  } @@ -614,8 +615,8 @@ __fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)                  goto out;          } -        fd->_ctx[set_idx].key   = (uint64_t)(long) xlator; -        fd->_ctx[set_idx].value = value; +        fd->_ctx[set_idx].xl_key = xlator; +        fd->_ctx[set_idx].value1  = value;  out:  	return ret; @@ -649,18 +650,18 @@ __fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)  	if (!fd || !xlator)  		return -1; -        for (index = 0; index < xlator->graph->xl_count; index++) { -                if (fd->_ctx[index].key == (uint64_t)(long)xlator) +        for (index = 0; index < fd->xl_count; index++) { +                if (fd->_ctx[index].xl_key == xlator)                          break;          } -        if (index == xlator->graph->xl_count) { +        if (index == fd->xl_count) {                  ret = -1;                  goto out;          }          if (value) -                *value = fd->_ctx[index].value; +                *value = fd->_ctx[index].value1;  out:  	return ret; @@ -694,21 +695,21 @@ __fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)  	if (!fd || !xlator)  		return -1; -        for (index = 0; index < xlator->graph->xl_count; index++) { -                if (fd->_ctx[index].key == (uint64_t)(long)xlator) +        for (index = 0; index < fd->xl_count; index++) { +                if (fd->_ctx[index].xl_key == xlator)                          break;          } -        if (index == xlator->graph->xl_count) { +        if (index == fd->xl_count) {                  ret = -1;                  goto out;          }          if (value) -                *value = fd->_ctx[index].value; +                *value = fd->_ctx[index].value1;          fd->_ctx[index].key   = 0; -        fd->_ctx[index].value = 0; +        fd->_ctx[index].value1 = 0;  out:  	return ret; diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h index c2181d8af17..e01ef753e28 100644 --- a/libglusterfs/src/fd.h +++ b/libglusterfs/src/fd.h @@ -35,8 +35,14 @@ struct _inode;  struct _dict;  struct _fd_ctx { -	uint64_t  key; -	uint64_t  value; +        union { +                uint64_t  key; +                void     *xl_key; +        }; +        union { +                uint64_t  value1; +                void     *ptr1; +        };  };  /* If this structure changes, please have mercy on the booster maintainer @@ -53,6 +59,7 @@ struct _fd {          gf_lock_t         lock; /* used ONLY for manipulating                                     'struct _fd_ctx' array (_ctx).*/  	struct _fd_ctx   *_ctx; +        int               xl_count; /* Number of xl referred in this fd */  };  typedef struct _fd fd_t;  | 
