diff options
| author | Shehjar Tikoo <shehjart@gluster.com> | 2009-10-01 06:58:46 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-01 07:22:42 -0700 | 
| commit | 186a86f342625a9dce53fe537f8237c6099d5c54 (patch) | |
| tree | 63ee2f3def75293b9f50acf9e49081fb1caad8ae /xlators/cluster/afr/src/afr-inode-write.c | |
| parent | dca4b2a23cb55e1e15fb393e7cbfd39b59280c9c (diff) | |
Global: Introduce setattr and fsetattr fops
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 146 (Add setattr FOP)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=146
Diffstat (limited to 'xlators/cluster/afr/src/afr-inode-write.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 1079 | 
1 files changed, 213 insertions, 866 deletions
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 6a2774bee72..591f7cd49aa 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -48,11 +48,10 @@  #include "afr-transaction.h" -/* {{{ chmod */ - +/* {{{ writev */  int -afr_chmod_unwind (call_frame_t *frame, xlator_t *this) +afr_writev_unwind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL; @@ -72,13 +71,13 @@ afr_chmod_unwind (call_frame_t *frame, xlator_t *this)  	UNLOCK (&frame->lock);  	if (main_frame) { -                if (local->cont.chmod.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.chmod.read_child_buf; +                if (local->cont.writev.read_child_buf.st_ino) { +                        unwind_buf = &local->cont.writev.read_child_buf;                  } else { -                        unwind_buf = &local->cont.chmod.buf; +                        unwind_buf = &local->cont.writev.buf;                  } -                unwind_buf->st_ino = local->cont.chmod.ino; +                unwind_buf->st_ino = local->cont.writev.ino;  		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno,  				  unwind_buf); @@ -88,234 +87,19 @@ afr_chmod_unwind (call_frame_t *frame, xlator_t *this)  int -afr_chmod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		    int32_t op_ret, int32_t op_errno, struct stat *buf) +afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  +		     int32_t op_ret, int32_t op_errno, struct stat *buf)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL; -	int call_count  = -1;  	int child_index = (long) cookie; -	int need_unwind = 0; -        int read_child  = 0; - -	local = frame->local; -	priv  = this->private; - -        read_child = afr_read_child (this, local->loc.inode); - -	LOCK (&frame->lock); -	{ -                if (child_index == read_child) { -                        local->read_child_returned = _gf_true; -                } - -		if (afr_fop_failed (op_ret, op_errno)) -			afr_transaction_fop_failed (frame, this, child_index); - -		if (op_ret != -1) { -			if (local->success_count == 0) { -				local->op_ret = op_ret; -				local->cont.chmod.buf = *buf; -			} - -                        if (child_index == read_child) { -                                local->cont.chmod.read_child_buf = *buf; -                        } - -			local->success_count++; - -			if ((local->success_count >= priv->wait_count) -                            && local->read_child_returned) { -				need_unwind = 1; -			} -		} - -		local->op_errno = op_errno; -	} -	UNLOCK (&frame->lock); - -	if (need_unwind) -		afr_chmod_unwind (frame, this); - -	call_count = afr_frame_return (frame); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -	} -	 -	return 0; -} - - -int -afr_chmod_wind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -	 -	int i = 0; -	int call_count = -1; - -	local = frame->local; -	priv  = this->private; - -	call_count = afr_up_children_count (priv->child_count, local->child_up); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -		return 0; -	} - -	local->call_count = call_count; - -	for (i = 0; i < priv->child_count; i++) {				 -		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_chmod_wind_cbk, (void *) (long) i, -					   priv->children[i],  -					   priv->children[i]->fops->chmod, -					   &local->loc,  -					   local->cont.chmod.mode);  -		 -			if (!--call_count) -				break; -		} -	} -	 -	return 0; -} - - -int -afr_chmod_done (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t * local = NULL; - -	local = frame->local; - -	local->transaction.unwind (frame, this); - -	AFR_STACK_DESTROY (frame); -	 -	return 0; -} - - -int32_t -afr_chmod (call_frame_t *frame, xlator_t *this, -	   loc_t *loc, mode_t mode) -{ -	afr_private_t * priv  = NULL; -	afr_local_t   * local = NULL; -	call_frame_t  * transaction_frame = NULL; - -	int ret = -1; - -	int op_ret   = -1; -	int op_errno = 0; - -	VALIDATE_OR_GOTO (frame, out); -	VALIDATE_OR_GOTO (this, out); -	VALIDATE_OR_GOTO (this->private, out); - -	priv = this->private; - -	transaction_frame = copy_frame (frame); -	if (!transaction_frame) { -		gf_log (this->name, GF_LOG_ERROR, -			"Out of memory."); -		goto out; -	} - -	ALLOC_OR_GOTO (local, afr_local_t, out); -	ret = AFR_LOCAL_INIT (local, priv); -	if (ret < 0) { -		op_errno = -ret; -		goto out; -	} - -	transaction_frame->local = local; - -	local->cont.chmod.mode = mode; -	local->cont.chmod.ino  = loc->inode->ino; - -	local->transaction.fop    = afr_chmod_wind; -	local->transaction.done   = afr_chmod_done; -	local->transaction.unwind = afr_chmod_unwind; - -	loc_copy (&local->loc, loc); -	 -	local->transaction.main_frame = frame; -	local->transaction.start   = LLONG_MAX - 1; -	local->transaction.len     = 0; - -	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION); - -	op_ret = 0; -out: -	if (op_ret == -1) { -		if (transaction_frame) -			AFR_STACK_DESTROY (transaction_frame); -		AFR_STACK_UNWIND (frame, op_ret, op_errno, NULL); -	} - -	return 0; -} - -/* }}} */ - - -/* {{{ fchmod */ - -int -afr_fchmod_unwind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -	call_frame_t   *main_frame = NULL; -        struct stat    *unwind_buf = NULL; - -	local = frame->local; -	priv  = this->private; - -	LOCK (&frame->lock); -	{ -		if (local->transaction.main_frame) -			main_frame = local->transaction.main_frame; -		local->transaction.main_frame = NULL; -	} -	UNLOCK (&frame->lock); - -	if (main_frame) { -                if (local->cont.fchmod.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.fchmod.read_child_buf; -                } else { -                        unwind_buf = &local->cont.fchmod.buf; -                } - -                unwind_buf->st_ino = local->cont.fchmod.ino; - -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	} -	return 0; -} - - -int -afr_fchmod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		    int32_t op_ret, int32_t op_errno, struct stat *buf) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -  	int call_count  = -1; -	int child_index = (long) cookie;  	int need_unwind = 0;          int read_child  = 0;  	local = frame->local; -	priv  = this->private; +	priv = this->private;          read_child = afr_read_child (this, local->fd->inode); @@ -330,12 +114,12 @@ afr_fchmod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		if (op_ret != -1) {  			if (local->success_count == 0) { -				local->op_ret = op_ret; -				local->cont.fchmod.buf = *buf; +				local->op_ret   = op_ret; +				local->cont.writev.buf = *buf;  			}                          if (child_index == read_child) { -                                local->cont.fchmod.read_child_buf = *buf; +                                local->cont.writev.read_child_buf = *buf;                          }  			local->success_count++; @@ -350,12 +134,11 @@ afr_fchmod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	}  	UNLOCK (&frame->lock); -	if (need_unwind) -		afr_fchmod_unwind (frame, this); -  	call_count = afr_frame_return (frame);  	if (call_count == 0) { +		local->transaction.unwind (frame, this); +  		local->transaction.resume (frame, this);  	} @@ -364,16 +147,16 @@ afr_fchmod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int -afr_fchmod_wind (call_frame_t *frame, xlator_t *this) +afr_writev_wind (call_frame_t *frame, xlator_t *this)  { -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; +	afr_local_t *local = NULL; +	afr_private_t *priv = NULL;  	int i = 0;  	int call_count = -1;  	local = frame->local; -	priv  = this->private; +	priv = this->private;  	call_count = afr_up_children_count (priv->child_count, local->child_up); @@ -386,11 +169,15 @@ afr_fchmod_wind (call_frame_t *frame, xlator_t *this)  	for (i = 0; i < priv->child_count; i++) {				  		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_fchmod_wind_cbk, (void *) (long) i, +			STACK_WIND_COOKIE (frame, afr_writev_wind_cbk,  +					   (void *) (long) i,	  					   priv->children[i],  -					   priv->children[i]->fops->fchmod, +					   priv->children[i]->fops->writev,  					   local->fd,  -					   local->cont.fchmod.mode);  +					   local->cont.writev.vector, +					   local->cont.writev.count,  +					   local->cont.writev.offset, +                                           local->cont.writev.iobref);  			if (!--call_count)  				break; @@ -402,228 +189,15 @@ afr_fchmod_wind (call_frame_t *frame, xlator_t *this)  int -afr_fchmod_done (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t * local = NULL; - -	local = frame->local; - -	local->transaction.unwind (frame, this); - -	AFR_STACK_DESTROY (frame); -	 -	return 0; -} - - -int32_t -afr_fchmod (call_frame_t *frame, xlator_t *this, -	    fd_t *fd, mode_t mode) -{ -	afr_private_t * priv  = NULL; -	afr_local_t   * local = NULL; -	call_frame_t  * transaction_frame = NULL; - -	int ret = -1; - -	int op_ret   = -1; -	int op_errno = 0; - -	VALIDATE_OR_GOTO (frame, out); -	VALIDATE_OR_GOTO (this, out); -	VALIDATE_OR_GOTO (this->private, out); - -	priv = this->private; - -	transaction_frame = copy_frame (frame); -	if (!transaction_frame) { -		gf_log (this->name, GF_LOG_ERROR, -			"Out of memory."); -		goto out; -	} - -	ALLOC_OR_GOTO (local, afr_local_t, out); -	ret = AFR_LOCAL_INIT (local, priv); -	if (ret < 0) { -		op_errno = -ret; -		goto out; -	} - -	transaction_frame->local = local; - -	local->cont.fchmod.mode = mode; -	local->cont.fchmod.ino  = fd->inode->ino; - -	local->transaction.fop    = afr_fchmod_wind; -	local->transaction.done   = afr_fchmod_done; -	local->transaction.unwind = afr_fchmod_unwind; - -	local->fd = fd_ref (fd); -	 -	local->transaction.main_frame = frame; -	local->transaction.start   = LLONG_MAX - 1; -	local->transaction.len     = 0; - -	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION); - -	op_ret = 0; -out: -	if (op_ret == -1) { -		if (transaction_frame) -			AFR_STACK_DESTROY (transaction_frame); -		AFR_STACK_UNWIND (frame, op_ret, op_errno, NULL); -	} - -	return 0; -} - -/* }}} */ - -/* {{{ chown */ - -int -afr_chown_unwind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -	call_frame_t   *main_frame = NULL; - -        struct stat *   unwind_buf = NULL; - -	local = frame->local; -	priv  = this->private; - -	LOCK (&frame->lock); -	{ -		if (local->transaction.main_frame) -			main_frame = local->transaction.main_frame; -		local->transaction.main_frame = NULL; -	} -	UNLOCK (&frame->lock); - -	if (main_frame) { -                if (local->cont.chown.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.chown.read_child_buf; -                } else { -                        unwind_buf = &local->cont.chown.buf; -                } - -                unwind_buf->st_ino = local->cont.chown.ino; - -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	} -	return 0; -} - - -int -afr_chown_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		    int32_t op_ret, int32_t op_errno, struct stat *buf) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -  -	int call_count  = -1; -	int child_index = (long) cookie; -	int need_unwind = 0; -        int read_child  = 0; - -	local = frame->local; -	priv = this->private; - -        read_child = afr_read_child (this, local->loc.inode); - -	LOCK (&frame->lock); -	{ -                if (child_index == read_child) { -                        local->read_child_returned = _gf_true; -                } - -		if (afr_fop_failed (op_ret, op_errno)) -			afr_transaction_fop_failed (frame, this, child_index); - -		if (op_ret != -1) { -			if (local->success_count == 0) { -				local->op_ret = op_ret; -				local->cont.chown.buf = *buf; -			} - -                        if (child_index == read_child) { -                                local->cont.chown.read_child_buf = *buf; -                        } - -			local->success_count++; - -			if ((local->success_count >= priv->wait_count) -                            && local->read_child_returned) { -				need_unwind = 1; -			} -		} - -		local->op_errno = op_errno; -	} -	UNLOCK (&frame->lock); - -	if (need_unwind) { -		local->transaction.unwind (frame, this); -	} - -	call_count = afr_frame_return (frame); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -	} -	 -	return 0; -} - - -int -afr_chown_wind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; - -	int call_count = -1; -	int i = 0; - -	local = frame->local; -	priv  = this->private; - -	call_count = afr_up_children_count (priv->child_count, local->child_up); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -		return 0; -	} - -	local->call_count = call_count; - -	for (i = 0; i < priv->child_count; i++) {				 -		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_chown_wind_cbk, (void *) (long) i, -					   priv->children[i],  -					   priv->children[i]->fops->chown, -					   &local->loc, local->cont.chown.uid, -					   local->cont.chown.gid);  - -			if (!--call_count) -				break; -		} -	} -	 -	return 0; -} - - -int -afr_chown_done (call_frame_t *frame, xlator_t *this) +afr_writev_done (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	local = frame->local; +        iobref_unref (local->cont.writev.iobref); +	local->cont.writev.iobref = NULL; +  	local->transaction.unwind (frame, this);  	AFR_STACK_DESTROY (frame); @@ -633,8 +207,9 @@ afr_chown_done (call_frame_t *frame, xlator_t *this)  int -afr_chown (call_frame_t *frame, xlator_t *this, -	   loc_t *loc, uid_t uid, gid_t gid) +afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,  +	    struct iovec *vector, int32_t count, off_t offset, +            struct iobref *iobref)  {  	afr_private_t * priv  = NULL;  	afr_local_t   * local = NULL; @@ -668,21 +243,29 @@ afr_chown (call_frame_t *frame, xlator_t *this,  	transaction_frame->local = local; -	local->cont.chown.uid  = uid; -	local->cont.chown.gid  = gid; -	local->cont.chown.ino  = loc->inode->ino; +	local->op = GF_FOP_WRITE; +	local->cont.writev.vector  = iov_dup (vector, count); +	local->cont.writev.count   = count; +	local->cont.writev.offset  = offset; +	local->cont.writev.ino     = fd->inode->ino; +        local->cont.writev.iobref  = iobref_ref (iobref); -	local->transaction.fop    = afr_chown_wind; -	local->transaction.done   = afr_chown_done; -	local->transaction.unwind = afr_chown_unwind; +	local->transaction.fop    = afr_writev_wind; +	local->transaction.done   = afr_writev_done; +	local->transaction.unwind = afr_writev_unwind; -	loc_copy (&local->loc, loc); +	local->fd                = fd_ref (fd);  	local->transaction.main_frame = frame; -	local->transaction.start   = LLONG_MAX - 1; -	local->transaction.len     = 0; +	if (fd->flags & O_APPEND) { +		local->transaction.start   = 0; +		local->transaction.len     = 0; +	} else { +		local->transaction.start   = offset; +		local->transaction.len     = iov_length (vector, count); +	} -	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION); +	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION);  	op_ret = 0;  out: @@ -698,10 +281,10 @@ out:  /* }}} */ -/* {{{ chown */ +/* {{{ truncate */  int -afr_fchown_unwind (call_frame_t *frame, xlator_t *this) +afr_truncate_unwind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL; @@ -721,255 +304,39 @@ afr_fchown_unwind (call_frame_t *frame, xlator_t *this)  	UNLOCK (&frame->lock);  	if (main_frame) { -                if (local->cont.fchown.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.fchown.read_child_buf; +                if (local->cont.truncate.read_child_buf.st_ino) { +                        unwind_buf = &local->cont.truncate.read_child_buf;                  } else { -                        unwind_buf = &local->cont.fchown.buf; -                } - -                unwind_buf->st_ino = local->cont.fchown.ino; - -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	} -	return 0; -} - - -int -afr_fchown_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		    int32_t op_ret, int32_t op_errno, struct stat *buf) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -  -	int call_count  = -1; -	int child_index = (long) cookie; -	int need_unwind = 0; -        int read_child  = 0; - -	local = frame->local; -	priv = this->private; - -        read_child = afr_read_child (this, local->fd->inode); - -	LOCK (&frame->lock); -	{ -                if (child_index == read_child) { -                        local->read_child_returned = _gf_true; +                        unwind_buf = &local->cont.truncate.buf;                  } -		if (afr_fop_failed (op_ret, op_errno)) -			afr_transaction_fop_failed (frame, this, child_index); - -		if (op_ret != -1) { -			if (local->success_count == 0) { -				local->op_ret = op_ret; -				local->cont.fchown.buf = *buf; -			} - -                        if (child_index == read_child) { -                                local->cont.fchown.read_child_buf = *buf; -                        } - -			local->success_count++; - -			if ((local->success_count >= priv->wait_count) -                            && local->read_child_returned) { -				need_unwind = 1; -			} -		} - -		local->op_errno = op_errno; -	} -	UNLOCK (&frame->lock); - -	if (need_unwind) { -		local->transaction.unwind (frame, this); -	} - -	call_count = afr_frame_return (frame); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -	} -	 -	return 0; -} - - -int -afr_fchown_wind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; - -	int call_count = -1; -	int i = 0; - -	local = frame->local; -	priv  = this->private; - -	call_count = afr_up_children_count (priv->child_count, local->child_up); - -	if (call_count == 0) { -		local->transaction.resume (frame, this); -		return 0; -	} - -	local->call_count = call_count; - -	for (i = 0; i < priv->child_count; i++) {				 -		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_fchown_wind_cbk, (void *) (long) i, -					   priv->children[i],  -					   priv->children[i]->fops->fchown, -					   local->fd, local->cont.fchown.uid, -					   local->cont.fchown.gid);  - -			if (!--call_count) -				break; -		} -	} -	 -	return 0; -} - - -int -afr_fchown_done (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *local = NULL; - -	local = frame->local; - -	local->transaction.unwind (frame, this); - -	AFR_STACK_DESTROY (frame); - -	return 0; -} - - -int -afr_fchown (call_frame_t *frame, xlator_t *this, -	    fd_t *fd, uid_t uid, gid_t gid) -{ -	afr_private_t * priv  = NULL; -	afr_local_t   * local = NULL; -	call_frame_t   *transaction_frame = NULL; - -	int ret = -1; - -	int op_ret   = -1; -	int op_errno = 0; - -	VALIDATE_OR_GOTO (frame, out); -	VALIDATE_OR_GOTO (this, out); -	VALIDATE_OR_GOTO (this->private, out); - -	priv = this->private; - -	transaction_frame = copy_frame (frame); -	if (!transaction_frame) { -		gf_log (this->name, GF_LOG_ERROR, -			"Out of memory."); -		goto out; -	} - -	ALLOC_OR_GOTO (local, afr_local_t, out); - -	ret = AFR_LOCAL_INIT (local, priv); -	if (ret < 0) { -		op_errno = -ret; -		goto out; -	} - -	transaction_frame->local = local; - -	local->cont.fchown.uid  = uid; -	local->cont.fchown.gid  = gid; -	local->cont.fchown.ino  = fd->inode->ino; - -	local->transaction.fop    = afr_fchown_wind; -	local->transaction.done   = afr_fchown_done; -	local->transaction.unwind = afr_fchown_unwind; - -	local->fd = fd_ref (fd); - -	local->transaction.main_frame = frame; -	local->transaction.start   = LLONG_MAX - 1; -	local->transaction.len     = 0; - -	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION); - -	op_ret = 0; -out: -	if (op_ret == -1) { -		if (transaction_frame) -			AFR_STACK_DESTROY (transaction_frame); -		AFR_STACK_UNWIND (frame, op_ret, op_errno, NULL); -	} - -	return 0; -} - -/* }}} */ - -/* {{{ writev */ - -int -afr_writev_unwind (call_frame_t *frame, xlator_t *this) -{ -	afr_local_t *   local = NULL; -	afr_private_t * priv  = NULL; -	call_frame_t   *main_frame = NULL; - -        struct stat *   unwind_buf = NULL; - -	local = frame->local; -	priv  = this->private; - -	LOCK (&frame->lock); -	{ -		if (local->transaction.main_frame) -			main_frame = local->transaction.main_frame; -		local->transaction.main_frame = NULL; -	} -	UNLOCK (&frame->lock); - -	if (main_frame) { -                if (local->cont.writev.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.writev.read_child_buf; -                } else { -                        unwind_buf = &local->cont.writev.buf; -                } +                unwind_buf->st_ino = local->cont.truncate.ino; -                unwind_buf->st_ino = local->cont.writev.ino; +                AFR_STACK_UNWIND (main_frame, local->op_ret, +                                  local->op_errno, +                                  unwind_buf); +        } -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	}  	return 0;  }  int -afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		     int32_t op_ret, int32_t op_errno, struct stat *buf) +afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  +		       int32_t op_ret, int32_t op_errno, struct stat *buf)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	int child_index = (long) cookie; +        int read_child  = 0;  	int call_count  = -1;  	int need_unwind = 0; -        int read_child  = 0;  	local = frame->local; -	priv = this->private; +	priv  = this->private; -        read_child = afr_read_child (this, local->fd->inode); +        read_child = afr_read_child (this, local->loc.inode);  	LOCK (&frame->lock);  	{ @@ -982,12 +349,12 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		if (op_ret != -1) {  			if (local->success_count == 0) { -				local->op_ret   = op_ret; -				local->cont.writev.buf = *buf; +				local->op_ret = op_ret; +				local->cont.truncate.buf = *buf;  			}                          if (child_index == read_child) { -                                local->cont.writev.read_child_buf = *buf; +                                local->cont.truncate.read_child_buf = *buf;                          }  			local->success_count++; @@ -997,16 +364,16 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  				need_unwind = 1;  			}  		} -  		local->op_errno = op_errno;  	}  	UNLOCK (&frame->lock); +	if (need_unwind) +		local->transaction.unwind (frame, this); +  	call_count = afr_frame_return (frame);  	if (call_count == 0) { -		local->transaction.unwind (frame, this); -  		local->transaction.resume (frame, this);  	} @@ -1014,14 +381,14 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  } -int -afr_writev_wind (call_frame_t *frame, xlator_t *this) +int32_t +afr_truncate_wind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	afr_private_t *priv = NULL; -	int i = 0;  	int call_count = -1; +	int i = 0;  	local = frame->local;  	priv = this->private; @@ -1037,16 +404,13 @@ afr_writev_wind (call_frame_t *frame, xlator_t *this)  	for (i = 0; i < priv->child_count; i++) {				  		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_writev_wind_cbk,  +			STACK_WIND_COOKIE (frame, afr_truncate_wind_cbk,  					   (void *) (long) i,	  					   priv->children[i],  -					   priv->children[i]->fops->writev, -					   local->fd,  -					   local->cont.writev.vector, -					   local->cont.writev.count,  -					   local->cont.writev.offset, -                                           local->cont.writev.iobref); -		 +					   priv->children[i]->fops->truncate, +					   &local->loc,  +					   local->cont.truncate.offset); +  			if (!--call_count)  				break;  		} @@ -1057,15 +421,12 @@ afr_writev_wind (call_frame_t *frame, xlator_t *this)  int -afr_writev_done (call_frame_t *frame, xlator_t *this) +afr_truncate_done (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	local = frame->local; -        iobref_unref (local->cont.writev.iobref); -	local->cont.writev.iobref = NULL; -  	local->transaction.unwind (frame, this);  	AFR_STACK_DESTROY (frame); @@ -1075,9 +436,8 @@ afr_writev_done (call_frame_t *frame, xlator_t *this)  int -afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,  -	    struct iovec *vector, int32_t count, off_t offset, -            struct iobref *iobref) +afr_truncate (call_frame_t *frame, xlator_t *this, +	      loc_t *loc, off_t offset)  {  	afr_private_t * priv  = NULL;  	afr_local_t   * local = NULL; @@ -1111,27 +471,20 @@ afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,  	transaction_frame->local = local; -	local->op = GF_FOP_WRITE; -	local->cont.writev.vector  = iov_dup (vector, count); -	local->cont.writev.count   = count; -	local->cont.writev.offset  = offset; -	local->cont.writev.ino     = fd->inode->ino; -        local->cont.writev.iobref  = iobref_ref (iobref); +	local->op_ret = -1; -	local->transaction.fop    = afr_writev_wind; -	local->transaction.done   = afr_writev_done; -	local->transaction.unwind = afr_writev_unwind; +	local->cont.truncate.offset  = offset; +	local->cont.truncate.ino     = loc->inode->ino; -	local->fd                = fd_ref (fd); +	local->transaction.fop    = afr_truncate_wind; +	local->transaction.done   = afr_truncate_done; +	local->transaction.unwind = afr_truncate_unwind; + +	loc_copy (&local->loc, loc);  	local->transaction.main_frame = frame; -	if (fd->flags & O_APPEND) { -		local->transaction.start   = 0; -		local->transaction.len     = 0; -	} else { -		local->transaction.start   = offset; -		local->transaction.len     = iov_length (vector, count); -	} +	local->transaction.start   = 0; +	local->transaction.len     = offset;  	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION); @@ -1149,10 +502,11 @@ out:  /* }}} */ -/* {{{ truncate */ +/* {{{ ftruncate */ +  int -afr_truncate_unwind (call_frame_t *frame, xlator_t *this) +afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL; @@ -1172,39 +526,37 @@ afr_truncate_unwind (call_frame_t *frame, xlator_t *this)  	UNLOCK (&frame->lock);  	if (main_frame) { -                if (local->cont.truncate.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.truncate.read_child_buf; +                if (local->cont.ftruncate.read_child_buf.st_ino) { +                        unwind_buf = &local->cont.ftruncate.read_child_buf;                  } else { -                        unwind_buf = &local->cont.truncate.buf; +                        unwind_buf = &local->cont.ftruncate.buf;                  } -                unwind_buf->st_ino = local->cont.truncate.ino; - -                AFR_STACK_UNWIND (main_frame, local->op_ret, -                                  local->op_errno, -                                  unwind_buf); -        } +                unwind_buf->st_ino = local->cont.ftruncate.ino; +		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, +				  unwind_buf); +	}  	return 0;  }  int -afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		       int32_t op_ret, int32_t op_errno, struct stat *buf) +afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  +			int32_t op_ret, int32_t op_errno, struct stat *buf)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	int child_index = (long) cookie; -        int read_child  = 0;  	int call_count  = -1;  	int need_unwind = 0; +        int read_child  = 0;  	local = frame->local;  	priv  = this->private; -        read_child = afr_read_child (this, local->loc.inode); +        read_child = afr_read_child (this, local->fd->inode);  	LOCK (&frame->lock);  	{ @@ -1218,11 +570,11 @@ afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		if (op_ret != -1) {  			if (local->success_count == 0) {  				local->op_ret = op_ret; -				local->cont.truncate.buf = *buf; +				local->cont.ftruncate.buf = *buf;  			}                          if (child_index == read_child) { -                                local->cont.truncate.read_child_buf = *buf; +                                local->cont.ftruncate.read_child_buf = *buf;                          }  			local->success_count++; @@ -1249,8 +601,8 @@ afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  } -int32_t -afr_truncate_wind (call_frame_t *frame, xlator_t *this) +int +afr_ftruncate_wind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	afr_private_t *priv = NULL; @@ -1272,12 +624,11 @@ afr_truncate_wind (call_frame_t *frame, xlator_t *this)  	for (i = 0; i < priv->child_count; i++) {				  		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_truncate_wind_cbk, +			STACK_WIND_COOKIE (frame, afr_ftruncate_wind_cbk,  					   (void *) (long) i,	  					   priv->children[i],  -					   priv->children[i]->fops->truncate, -					   &local->loc,  -					   local->cont.truncate.offset); +					   priv->children[i]->fops->ftruncate, +					   local->fd, local->cont.ftruncate.offset);  			if (!--call_count)  				break; @@ -1289,7 +640,7 @@ afr_truncate_wind (call_frame_t *frame, xlator_t *this)  int -afr_truncate_done (call_frame_t *frame, xlator_t *this) +afr_ftruncate_done (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL; @@ -1304,8 +655,8 @@ afr_truncate_done (call_frame_t *frame, xlator_t *this)  int -afr_truncate (call_frame_t *frame, xlator_t *this, -	      loc_t *loc, off_t offset) +afr_ftruncate (call_frame_t *frame, xlator_t *this, +	       fd_t *fd, off_t offset)  {  	afr_private_t * priv  = NULL;  	afr_local_t   * local = NULL; @@ -1339,16 +690,17 @@ afr_truncate (call_frame_t *frame, xlator_t *this,  	transaction_frame->local = local; +	local->op = GF_FOP_FTRUNCATE;  	local->op_ret = -1; -	local->cont.truncate.offset  = offset; -	local->cont.truncate.ino     = loc->inode->ino; +	local->cont.ftruncate.offset  = offset; +	local->cont.ftruncate.ino     = fd->inode->ino; -	local->transaction.fop    = afr_truncate_wind; -	local->transaction.done   = afr_truncate_done; -	local->transaction.unwind = afr_truncate_unwind; +	local->transaction.fop    = afr_ftruncate_wind; +	local->transaction.done   = afr_ftruncate_done; +	local->transaction.unwind = afr_ftruncate_unwind; -	loc_copy (&local->loc, loc); +	local->fd = fd_ref (fd);  	local->transaction.main_frame = frame;  	local->transaction.start   = 0; @@ -1367,21 +719,17 @@ out:  	return 0;  } -  /* }}} */ -/* {{{ ftruncate */ - +/* {{{ setattr */  int -afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this) +afr_setattr_unwind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	call_frame_t   *main_frame = NULL; -        struct stat *   unwind_buf = NULL; -  	local = frame->local;  	priv  = this->private; @@ -1394,37 +742,35 @@ afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this)  	UNLOCK (&frame->lock);  	if (main_frame) { -                if (local->cont.ftruncate.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.ftruncate.read_child_buf; -                } else { -                        unwind_buf = &local->cont.ftruncate.buf; -                } +                local->cont.setattr.preop_buf.st_ino  = local->cont.setattr.ino; +                local->cont.setattr.postop_buf.st_ino = local->cont.setattr.ino; -                unwind_buf->st_ino = local->cont.ftruncate.ino; +                AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, +                                  &local->cont.setattr.preop_buf, +                                  &local->cont.setattr.postop_buf); +        } -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	}  	return 0;  }  int -afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -			int32_t op_ret, int32_t op_errno, struct stat *buf) +afr_setattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                      int32_t op_ret, int32_t op_errno, +                      struct stat *preop, struct stat *postop)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	int child_index = (long) cookie; +        int read_child  = 0;  	int call_count  = -1;  	int need_unwind = 0; -        int read_child  = 0;  	local = frame->local;  	priv  = this->private; -        read_child = afr_read_child (this, local->fd->inode); +        read_child = afr_read_child (this, local->loc.inode);  	LOCK (&frame->lock);  	{ @@ -1438,11 +784,13 @@ afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		if (op_ret != -1) {  			if (local->success_count == 0) {  				local->op_ret = op_ret; -				local->cont.ftruncate.buf = *buf; +				local->cont.setattr.preop_buf  = *preop; +                                local->cont.setattr.postop_buf = *postop;  			}                          if (child_index == read_child) { -                                local->cont.ftruncate.read_child_buf = *buf; +                                local->cont.setattr.preop_buf  = *preop; +                                local->cont.setattr.postop_buf = *postop;                          }  			local->success_count++; @@ -1464,17 +812,17 @@ afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	if (call_count == 0) {  		local->transaction.resume (frame, this);  	} -	 +  	return 0;  } -int -afr_ftruncate_wind (call_frame_t *frame, xlator_t *this) +int32_t +afr_setattr_wind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	afr_private_t *priv = NULL; -	 +  	int call_count = -1;  	int i = 0; @@ -1490,25 +838,27 @@ afr_ftruncate_wind (call_frame_t *frame, xlator_t *this)  	local->call_count = call_count; -	for (i = 0; i < priv->child_count; i++) {				 +	for (i = 0; i < priv->child_count; i++) {  		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_ftruncate_wind_cbk, -					   (void *) (long) i,	 -					   priv->children[i],  -					   priv->children[i]->fops->ftruncate, -					   local->fd, local->cont.ftruncate.offset); +			STACK_WIND_COOKIE (frame, afr_setattr_wind_cbk, +					   (void *) (long) i, +					   priv->children[i], +					   priv->children[i]->fops->setattr, +					   &local->loc, +					   &local->cont.setattr.in_buf, +                                           local->cont.setattr.valid);  			if (!--call_count)  				break;  		}  	} -	 +  	return 0;  }  int -afr_ftruncate_done (call_frame_t *frame, xlator_t *this) +afr_setattr_done (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL; @@ -1523,8 +873,8 @@ afr_ftruncate_done (call_frame_t *frame, xlator_t *this)  int -afr_ftruncate (call_frame_t *frame, xlator_t *this, -	       fd_t *fd, off_t offset) +afr_setattr (call_frame_t *frame, xlator_t *this, +             loc_t *loc, struct stat *buf, int32_t valid)  {  	afr_private_t * priv  = NULL;  	afr_local_t   * local = NULL; @@ -1558,23 +908,24 @@ afr_ftruncate (call_frame_t *frame, xlator_t *this,  	transaction_frame->local = local; -	local->op = GF_FOP_FTRUNCATE;  	local->op_ret = -1; -	local->cont.ftruncate.offset  = offset; -	local->cont.ftruncate.ino     = fd->inode->ino; +	local->cont.setattr.ino     = loc->inode->ino; -	local->transaction.fop    = afr_ftruncate_wind; -	local->transaction.done   = afr_ftruncate_done; -	local->transaction.unwind = afr_ftruncate_unwind; +        local->cont.setattr.in_buf = *buf; +        local->cont.setattr.valid  = valid; -	local->fd = fd_ref (fd); +	local->transaction.fop    = afr_setattr_wind; +	local->transaction.done   = afr_setattr_done; +	local->transaction.unwind = afr_setattr_unwind; + +	loc_copy (&local->loc, loc);  	local->transaction.main_frame = frame; -	local->transaction.start   = 0; -	local->transaction.len     = offset; +	local->transaction.start   = LLONG_MAX - 1; +	local->transaction.len     = 0; -	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION); +	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);  	op_ret = 0;  out: @@ -1587,20 +938,15 @@ out:  	return 0;  } -/* }}} */ - -/* {{{ utimens */ - +/* {{{ fsetattr */  int -afr_utimens_unwind (call_frame_t *frame, xlator_t *this) +afr_fsetattr_unwind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	call_frame_t   *main_frame = NULL; -        struct stat *   unwind_buf = NULL; -  	local = frame->local;  	priv  = this->private; @@ -1613,35 +959,35 @@ afr_utimens_unwind (call_frame_t *frame, xlator_t *this)  	UNLOCK (&frame->lock);  	if (main_frame) { -                if (local->cont.utimens.read_child_buf.st_ino) { -                        unwind_buf = &local->cont.utimens.read_child_buf; -                } else { -                        unwind_buf = &local->cont.utimens.buf; -                } - -                unwind_buf->st_ino = local->cont.utimens.ino; +                local->cont.fsetattr.preop_buf.st_ino  = +                        local->cont.fsetattr.ino; +                local->cont.fsetattr.postop_buf.st_ino = +                        local->cont.fsetattr.ino; + +                AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, +                                  &local->cont.fsetattr.preop_buf, +                                  &local->cont.fsetattr.postop_buf); +        } -		AFR_STACK_UNWIND (main_frame, local->op_ret, local->op_errno, -				  unwind_buf); -	}  	return 0;  }  int -afr_utimens_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  -		      int32_t op_ret, int32_t op_errno, struct stat *buf) +afr_fsetattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                      int32_t op_ret, int32_t op_errno, +                      struct stat *preop, struct stat *postop)  {  	afr_local_t *   local = NULL;  	afr_private_t * priv  = NULL;  	int child_index = (long) cookie; -	int call_count  = -1; -	int need_unwind = 1;          int read_child  = 0; +	int call_count  = -1; +	int need_unwind = 0;  	local = frame->local; -	priv = this->private; +	priv  = this->private;          read_child = afr_read_child (this, local->loc.inode); @@ -1657,11 +1003,13 @@ afr_utimens_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		if (op_ret != -1) {  			if (local->success_count == 0) {  				local->op_ret = op_ret; -				local->cont.utimens.buf = *buf; +				local->cont.fsetattr.preop_buf  = *preop; +                                local->cont.fsetattr.postop_buf = *postop;  			}                          if (child_index == read_child) { -                                local->cont.utimens.read_child_buf = *buf; +                                local->cont.fsetattr.preop_buf  = *preop; +                                local->cont.fsetattr.postop_buf = *postop;                          }  			local->success_count++; @@ -1671,7 +1019,6 @@ afr_utimens_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  				need_unwind = 1;  			}  		} -  		local->op_errno = op_errno;  	}  	UNLOCK (&frame->lock); @@ -1684,17 +1031,17 @@ afr_utimens_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	if (call_count == 0) {  		local->transaction.resume (frame, this);  	} -	 +  	return 0;  } -int -afr_utimens_wind (call_frame_t *frame, xlator_t *this) +int32_t +afr_fsetattr_wind (call_frame_t *frame, xlator_t *this)  {  	afr_local_t *local = NULL;  	afr_private_t *priv = NULL; -	 +  	int call_count = -1;  	int i = 0; @@ -1710,28 +1057,29 @@ afr_utimens_wind (call_frame_t *frame, xlator_t *this)  	local->call_count = call_count; -	for (i = 0; i < priv->child_count; i++) {				 +	for (i = 0; i < priv->child_count; i++) {  		if (local->child_up[i]) { -			STACK_WIND_COOKIE (frame, afr_utimens_wind_cbk, -					   (void *) (long) i,	 -					   priv->children[i],  -					   priv->children[i]->fops->utimens, -					   &local->loc,  -					   local->cont.utimens.tv);  +			STACK_WIND_COOKIE (frame, afr_fsetattr_wind_cbk, +					   (void *) (long) i, +					   priv->children[i], +					   priv->children[i]->fops->fsetattr, +					   local->fd, +					   &local->cont.fsetattr.in_buf, +                                           local->cont.fsetattr.valid);  			if (!--call_count)  				break;  		}  	} -	 +  	return 0;  }  int -afr_utimens_done (call_frame_t *frame, xlator_t *this) +afr_fsetattr_done (call_frame_t *frame, xlator_t *this)  { -	afr_local_t * local = NULL; +	afr_local_t *local = NULL;  	local = frame->local; @@ -1744,8 +1092,8 @@ afr_utimens_done (call_frame_t *frame, xlator_t *this)  int -afr_utimens (call_frame_t *frame, xlator_t *this, -	     loc_t *loc, struct timespec tv[2]) +afr_fsetattr (call_frame_t *frame, xlator_t *this, +              fd_t *fd, struct stat *buf, int32_t valid)  {  	afr_private_t * priv  = NULL;  	afr_local_t   * local = NULL; @@ -1781,17 +1129,17 @@ afr_utimens (call_frame_t *frame, xlator_t *this,  	local->op_ret = -1; -	local->cont.utimens.tv[0] = tv[0]; -	local->cont.utimens.tv[1] = tv[1]; +	local->cont.fsetattr.ino     = fd->inode->ino; -	local->cont.utimens.ino  = loc->inode->ino; +        local->cont.fsetattr.in_buf = *buf; +        local->cont.fsetattr.valid  = valid; -	local->transaction.fop    = afr_utimens_wind; -	local->transaction.done   = afr_utimens_done; -	local->transaction.unwind = afr_utimens_unwind; +	local->transaction.fop    = afr_fsetattr_wind; +	local->transaction.done   = afr_fsetattr_done; +	local->transaction.unwind = afr_fsetattr_unwind; + +        local->fd                 = fd_ref (fd); -	loc_copy (&local->loc, loc); -	  	local->transaction.main_frame = frame;  	local->transaction.start   = LLONG_MAX - 1;  	local->transaction.len     = 0; @@ -1809,7 +1157,6 @@ out:  	return 0;  } -/* }}} */  /* {{{ setxattr */  | 
