diff options
| author | Vikas Gorur <vikas@gluster.com> | 2009-10-26 09:15:13 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-27 03:32:32 -0700 | 
| commit | 78c98cac267ef9aebcaa3c35d70ea93c17462e62 (patch) | |
| tree | 01a4afb2d596e905b746f17f601b2afffc661d13 /xlators/cluster | |
| parent | a284bf490cdf6ce334a4e70b22eedd7e639620f9 (diff) | |
cluster/afr: NFS-friendly logic changes
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 145 (NFSv3 related additions to 2.1 task list)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=145
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/afr/src/afr-dir-write.c | 138 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-read.c | 5 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 76 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 4 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.c | 52 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 48 | 
6 files changed, 250 insertions, 73 deletions
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index 10ab2145d..9bea54c44 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -102,11 +102,15 @@ afr_create_unwind (call_frame_t *frame, xlator_t *this)                  unwind_buf->st_ino = local->cont.create.ino; +                local->cont.create.preparent.st_ino  = local->cont.create.parent_ino; +                local->cont.create.postparent.st_ino = local->cont.create.parent_ino; +  		AFR_STACK_UNWIND (create, main_frame,                                    local->op_ret, local->op_errno,  				  local->cont.create.fd,  				  local->cont.create.inode, -				  unwind_buf, NULL, NULL); +				  unwind_buf, &local->cont.create.preparent, +                                  &local->cont.create.postparent);          }  	return 0; @@ -176,6 +180,8 @@ afr_create_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.create.read_child_buf = *buf; +                                local->cont.create.preparent      = *preparent; +                                local->cont.create.postparent     = *postparent;                          }  			local->cont.create.inode = inode; @@ -303,6 +309,9 @@ afr_create (call_frame_t *frame, xlator_t *this,  	local->cont.create.mode  = mode;  	local->cont.create.fd    = fd_ref (fd); +        if (loc->parent) +                local->cont.create.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_create_wind;  	local->transaction.done   = afr_create_done;  	local->transaction.unwind = afr_create_unwind; @@ -358,10 +367,14 @@ afr_mknod_unwind (call_frame_t *frame, xlator_t *this)                  unwind_buf->st_ino = local->cont.mknod.ino; +                local->cont.mknod.preparent.st_ino  = local->cont.mknod.parent_ino; +                local->cont.mknod.postparent.st_ino = local->cont.mknod.parent_ino; +  		AFR_STACK_UNWIND (mknod, main_frame,                                    local->op_ret, local->op_errno,  				  local->cont.mknod.inode, -				  unwind_buf, NULL, NULL); +				  unwind_buf, &local->cont.mknod.preparent, +                                  &local->cont.mknod.postparent);          }  	return 0; @@ -418,6 +431,8 @@ afr_mknod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.mknod.read_child_buf = *buf; +                                local->cont.mknod.preparent      = *preparent; +                                local->cont.mknod.postparent     = *postparent;                          }  			local->cont.mknod.inode = inode; @@ -540,6 +555,9 @@ afr_mknod (call_frame_t *frame, xlator_t *this,  	local->cont.mknod.mode  = mode;  	local->cont.mknod.dev   = dev; +        if (loc->parent) +                local->cont.mknod.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_mknod_wind;  	local->transaction.done   = afr_mknod_done;  	local->transaction.unwind = afr_mknod_unwind; @@ -596,10 +614,14 @@ afr_mkdir_unwind (call_frame_t *frame, xlator_t *this)                  unwind_buf->st_ino = local->cont.mkdir.ino; +                local->cont.mkdir.preparent.st_ino  = local->cont.mkdir.parent_ino; +                local->cont.mkdir.postparent.st_ino = local->cont.mkdir.parent_ino; +  		AFR_STACK_UNWIND (mkdir, main_frame,                                    local->op_ret, local->op_errno,  				  local->cont.mkdir.inode, -				  unwind_buf, NULL, NULL); +				  unwind_buf, &local->cont.mkdir.preparent, +                        &local->cont.mkdir.postparent);          }  	return 0; @@ -657,6 +679,8 @@ afr_mkdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.mkdir.read_child_buf = *buf; +                                local->cont.mkdir.preparent      = *preparent; +                                local->cont.mkdir.postparent     = *postparent;                          }  			local->cont.mkdir.inode = inode; @@ -779,6 +803,9 @@ afr_mkdir (call_frame_t *frame, xlator_t *this,  	local->cont.mkdir.mode  = mode; +        if (loc->parent) +                local->cont.mkdir.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_mkdir_wind;  	local->transaction.done   = afr_mkdir_done;  	local->transaction.unwind = afr_mkdir_unwind; @@ -836,10 +863,14 @@ afr_link_unwind (call_frame_t *frame, xlator_t *this)  		unwind_buf->st_ino = local->cont.link.ino; +                local->cont.link.preparent.st_ino  = local->cont.link.parent_ino; +                local->cont.link.postparent.st_ino = local->cont.link.parent_ino; +  		AFR_STACK_UNWIND (link, main_frame,                                    local->op_ret, local->op_errno,   				  local->cont.link.inode, -				  unwind_buf, NULL, NULL); +				  unwind_buf, &local->cont.link.preparent, +                                  &local->cont.link.postparent);  	}  	return 0; @@ -885,6 +916,8 @@ afr_link_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.link.read_child_buf = *buf; +                                local->cont.link.preparent      = *preparent; +                                local->cont.link.postparent     = *postparent;                          }  			local->cont.link.inode    = inode; @@ -1007,6 +1040,9 @@ afr_link (call_frame_t *frame, xlator_t *this,  	local->cont.link.ino = oldloc->inode->ino; +        if (oldloc->parent) +                local->cont.link.parent_ino = oldloc->parent->ino; +  	local->transaction.fop    = afr_link_wind;  	local->transaction.done   = afr_link_done;  	local->transaction.unwind = afr_link_unwind; @@ -1064,10 +1100,14 @@ afr_symlink_unwind (call_frame_t *frame, xlator_t *this)                  unwind_buf->st_ino = local->cont.symlink.ino; +                local->cont.symlink.preparent.st_ino  = local->cont.symlink.parent_ino; +                local->cont.symlink.postparent.st_ino = local->cont.symlink.parent_ino; +  		AFR_STACK_UNWIND (symlink, main_frame,                                    local->op_ret, local->op_errno,  				  local->cont.symlink.inode, -				  unwind_buf, NULL, NULL); +				  unwind_buf, &local->cont.symlink.preparent, +                                  &local->cont.symlink.postparent);          }  	return 0; @@ -1123,6 +1163,8 @@ afr_symlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.symlink.read_child_buf = *buf; +                                local->cont.symlink.preparent      = *preparent; +                                local->cont.symlink.postparent     = *postparent;                          }  			local->cont.symlink.inode    = inode; @@ -1246,6 +1288,9 @@ afr_symlink (call_frame_t *frame, xlator_t *this,  	local->cont.symlink.linkpath = strdup (linkpath); +        if (loc->parent) +                local->cont.symlink.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_symlink_wind;  	local->transaction.done   = afr_symlink_done;  	local->transaction.unwind = afr_symlink_unwind; @@ -1301,10 +1346,18 @@ afr_rename_unwind (call_frame_t *frame, xlator_t *this)  		unwind_buf->st_ino = local->cont.rename.ino; +                local->cont.rename.preoldparent.st_ino  = local->cont.rename.oldparent_ino; +                local->cont.rename.postoldparent.st_ino = local->cont.rename.oldparent_ino; +                local->cont.rename.prenewparent.st_ino  = local->cont.rename.newparent_ino; +                local->cont.rename.postnewparent.st_ino = local->cont.rename.newparent_ino; +  		AFR_STACK_UNWIND (rename, main_frame,                                    local->op_ret, local->op_errno,   				  unwind_buf, -                                  NULL, NULL, NULL, NULL); +                                  &local->cont.rename.preoldparent, +                                  &local->cont.rename.postoldparent, +                                  &local->cont.rename.prenewparent, +                                  &local->cont.rename.postnewparent);  	}  	return 0; @@ -1346,6 +1399,11 @@ afr_rename_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          if (child_index == local->read_child_index) {                                  local->cont.rename.read_child_buf = *buf; + +                                local->cont.rename.preoldparent  = *preoldparent; +                                local->cont.rename.postoldparent = *postoldparent; +                                local->cont.rename.prenewparent  = *prenewparent; +                                local->cont.rename.postnewparent = *postnewparent;                          }                  } @@ -1459,6 +1517,11 @@ afr_rename (call_frame_t *frame, xlator_t *this,  	local->cont.rename.ino = oldloc->inode->ino; +        if (oldloc->parent) +                local->cont.rename.oldparent_ino = oldloc->parent->ino; +        if (newloc->parent) +                local->cont.rename.newparent_ino = newloc->parent->ino; +  	local->transaction.fop    = afr_rename_wind;  	local->transaction.done   = afr_rename_done;  	local->transaction.unwind = afr_rename_unwind; @@ -1506,10 +1569,15 @@ afr_unlink_unwind (call_frame_t *frame, xlator_t *this)  	}  	UNLOCK (&frame->lock); -	if (main_frame) +	if (main_frame) { +                local->cont.unlink.preparent.st_ino  = local->cont.unlink.parent_ino; +                local->cont.unlink.postparent.st_ino = local->cont.unlink.parent_ino; +  		AFR_STACK_UNWIND (unlink, main_frame,                                    local->op_ret, local->op_errno, -                                  NULL, NULL); +                                  &local->cont.unlink.preparent, +                                  &local->cont.unlink.postparent); +        }  	return 0;  } @@ -1526,22 +1594,38 @@ afr_unlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	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 == local->read_child_index) { +                        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.unlink.preparent  = *preparent; +                                local->cont.unlink.postparent = *postparent;  			} + +                        if (child_index == local->read_child_index) { +                                local->cont.unlink.preparent  = *preparent; +                                local->cont.unlink.postparent = *postparent; +                        } +  			local->success_count++; -			if (local->success_count == priv->wait_count) { +			if ((local->success_count == priv->wait_count) +                            && local->read_child_returned) {  				need_unwind = 1;  			}  		} @@ -1651,6 +1735,9 @@ afr_unlink (call_frame_t *frame, xlator_t *this,  	loc_copy (&local->loc, loc); +        if (loc->parent) +                local->cont.unlink.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_unlink_wind;  	local->transaction.done   = afr_unlink_done;  	local->transaction.unwind = afr_unlink_unwind; @@ -1697,10 +1784,15 @@ afr_rmdir_unwind (call_frame_t *frame, xlator_t *this)  	}  	UNLOCK (&frame->lock); -	if (main_frame) +	if (main_frame) { +                local->cont.rmdir.preparent.st_ino  = local->cont.rmdir.parent_ino; +                local->cont.rmdir.postparent.st_ino = local->cont.rmdir.parent_ino; +  		AFR_STACK_UNWIND (rmdir, main_frame,                                    local->op_ret, local->op_errno, -                                  NULL, NULL); +                                  &local->cont.rmdir.preparent, +                                  &local->cont.rmdir.postparent); +        }  	return 0;  } @@ -1717,22 +1809,39 @@ afr_rmdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	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.rmdir.preparent  = *preparent; +                                local->cont.rmdir.postparent = *postparent; +  			} + +                        if (child_index == read_child) { +                                local->cont.rmdir.preparent  = *preparent; +                                local->cont.rmdir.postparent = *postparent; +                        } +  			local->success_count++; -			if (local->success_count == priv->wait_count) +			if ((local->success_count == priv->wait_count) +                            && local->read_child_returned)  				need_unwind = 1;  		} @@ -1841,6 +1950,9 @@ afr_rmdir (call_frame_t *frame, xlator_t *this,  	loc_copy (&local->loc, loc); +        if (loc->parent) +                local->cont.rmdir.parent_ino = loc->parent->ino; +  	local->transaction.fop    = afr_rmdir_wind;  	local->transaction.done   = afr_rmdir_done;  	local->transaction.unwind = afr_rmdir_unwind; diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c index 5d8ba44d9..3b89da9ab 100644 --- a/xlators/cluster/afr/src/afr-inode-read.c +++ b/xlators/cluster/afr/src/afr-inode-read.c @@ -470,6 +470,9 @@ afr_readlink_cbk (call_frame_t *frame, void *cookie,  out:  	if (unwind) { +                if (sbuf) +                        sbuf->st_ino = local->cont.readlink.ino; +  		AFR_STACK_UNWIND (readlink, frame, op_ret, op_errno, buf, sbuf);  	} @@ -525,7 +528,9 @@ afr_readlink (call_frame_t *frame, xlator_t *this,          }  	loc_copy (&local->loc, loc); +  	local->cont.readlink.size       = size; +        local->cont.readlink.ino        = loc->inode->ino;  	STACK_WIND_COOKIE (frame, afr_readlink_cbk,  			   (void *) (long) call_child, diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index f840a1da4..7dcc06708 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -57,8 +57,6 @@ afr_writev_unwind (call_frame_t *frame, xlator_t *this)  	afr_private_t * priv  = NULL;  	call_frame_t   *main_frame = NULL; -        struct stat *   unwind_buf = NULL; -  	local = frame->local;  	priv  = this->private; @@ -71,16 +69,13 @@ afr_writev_unwind (call_frame_t *frame, xlator_t *this)  	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.writev.ino; +                local->cont.writev.prebuf.st_ino  = local->cont.writev.ino; +                local->cont.writev.postbuf.st_ino = local->cont.writev.ino; -		AFR_STACK_UNWIND (writev, main_frame, local->op_ret, -                                  local->op_errno, unwind_buf, NULL); +		AFR_STACK_UNWIND (writev, main_frame, +                                  local->op_ret, local->op_errno, +                                  &local->cont.writev.prebuf, +                                  &local->cont.writev.postbuf);  	}  	return 0;  } @@ -115,12 +110,14 @@ 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 = *postbuf; +				local->op_ret              = op_ret; +				local->cont.writev.prebuf  = *prebuf; +				local->cont.writev.postbuf = *postbuf;  			}                          if (child_index == read_child) { -                                local->cont.writev.read_child_buf = *postbuf; +                                local->cont.writev.prebuf  = *prebuf; +                                local->cont.writev.postbuf = *postbuf;                          }  			local->success_count++; @@ -245,11 +242,11 @@ 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->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_writev_wind;  	local->transaction.done   = afr_writev_done; @@ -291,8 +288,6 @@ afr_truncate_unwind (call_frame_t *frame, xlator_t *this)  	afr_private_t * priv  = NULL;  	call_frame_t   *main_frame = NULL; -        struct stat *   unwind_buf = NULL; -  	local = frame->local;  	priv  = this->private; @@ -305,17 +300,13 @@ 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; -                } else { -                        unwind_buf = &local->cont.truncate.buf; -                } - -                unwind_buf->st_ino = local->cont.truncate.ino; +                local->cont.truncate.prebuf.st_ino  = local->cont.truncate.ino; +                local->cont.truncate.postbuf.st_ino = local->cont.truncate.ino;                  AFR_STACK_UNWIND (truncate, main_frame, local->op_ret,                                    local->op_errno, -                                  unwind_buf, NULL); +                                  &local->cont.truncate.prebuf, +                                  &local->cont.truncate.postbuf);          }  	return 0; @@ -352,11 +343,13 @@ 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 = *postbuf; +				local->cont.truncate.prebuf  = *prebuf; +				local->cont.truncate.postbuf = *postbuf;  			}                          if (child_index == read_child) { -                                local->cont.truncate.read_child_buf = *postbuf; +                                local->cont.truncate.prebuf  = *prebuf; +                                local->cont.truncate.postbuf = *postbuf;                          }  			local->success_count++; @@ -514,8 +507,6 @@ afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this)  	afr_private_t * priv  = NULL;  	call_frame_t   *main_frame = NULL; -        struct stat *   unwind_buf = NULL; -  	local = frame->local;  	priv  = this->private; @@ -528,16 +519,13 @@ 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; -                } - -                unwind_buf->st_ino = local->cont.ftruncate.ino; +                local->cont.ftruncate.prebuf.st_ino  = local->cont.ftruncate.ino; +                local->cont.ftruncate.postbuf.st_ino = local->cont.ftruncate.ino;  		AFR_STACK_UNWIND (ftruncate, main_frame, local->op_ret, -                                  local->op_errno, unwind_buf, NULL); +                                  local->op_errno, +                                  &local->cont.ftruncate.prebuf, +                                  &local->cont.ftruncate.postbuf);  	}  	return 0;  } @@ -573,11 +561,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 = *postbuf; +				local->cont.ftruncate.prebuf  = *prebuf; +				local->cont.ftruncate.postbuf = *postbuf;  			}                          if (child_index == read_child) { -                                local->cont.ftruncate.read_child_buf = *postbuf; +                                local->cont.ftruncate.prebuf  = *prebuf; +                                local->cont.ftruncate.postbuf = *postbuf;                          }  			local->success_count++; diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 6d4802fd6..b23eea391 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1417,7 +1417,7 @@ afr_bgsh_completion_cbk (call_frame_t *bgsh_frame, xlator_t *this)                                    local->cont.lookup.inode,                                    &local->cont.lookup.buf,                                    local->cont.lookup.xattr, -                                  NULL); +                                  &local->cont.lookup.postparent);          }          LOCK (&priv->lock); @@ -1457,7 +1457,7 @@ afr_bgsh_unwind (call_frame_t *bgsh_frame, xlator_t *this)                            local->cont.lookup.inode,                            &local->cont.lookup.buf,                            local->cont.lookup.xattr, -                          NULL); +                          &local->cont.lookup.postparent);  	return 0;  } diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 433f73b7d..ea69cc816 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -420,7 +420,7 @@ afr_self_heal_cbk (call_frame_t *frame, xlator_t *this)  			  local->cont.lookup.inode,  			  &local->cont.lookup.buf,  			  local->cont.lookup.xattr, -                          NULL); +                          &local->cont.lookup.postparent);  	return 0;  } @@ -508,6 +508,7 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,  			local->cont.lookup.inode = inode;  			local->cont.lookup.xattr = dict_ref (xattr); +                        local->cont.lookup.postparent = *postparent;  			*lookup_buf = *buf; @@ -562,6 +563,7 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,                                  local->cont.lookup.inode = inode;                                  local->cont.lookup.xattr = dict_ref (xattr); +                                local->cont.lookup.postparent = *postparent;                                  *lookup_buf = *buf; @@ -586,6 +588,8 @@ unlock:  	call_count = afr_frame_return (frame);  	if (call_count == 0) { +                local->cont.lookup.postparent.st_ino  = local->cont.lookup.parent_ino; +                  if (local->cont.lookup.ino) {                          local->cont.lookup.buf.st_ino = local->cont.lookup.ino;                  } @@ -629,7 +633,7 @@ unlock:  					  local->cont.lookup.inode,   					  &local->cont.lookup.buf,  					  local->cont.lookup.xattr, -                                          NULL); +                                          &local->cont.lookup.postparent);  		}  	} @@ -1146,22 +1150,49 @@ afr_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	int call_count = -1; +        int child_index = (long) cookie; +        int read_child  = 0; +  	local = frame->local; +        read_child = afr_read_child (this, local->fd->inode); +  	LOCK (&frame->lock);  	{ -		if (op_ret == 0) +                if (child_index == read_child) { +                        local->read_child_returned = _gf_true; +                } + +		if (op_ret == 0) {  			local->op_ret = 0; +			if (local->success_count == 0) { +				local->cont.fsync.prebuf  = *prebuf; +				local->cont.fsync.postbuf = *postbuf; +			} + +                        if (child_index == read_child) { +                                local->cont.fsync.prebuf  = *prebuf; +                                local->cont.fsync.postbuf = *postbuf; +                        } + +			local->success_count++; +                } +  		local->op_errno = op_errno;  	}  	UNLOCK (&frame->lock);  	call_count = afr_frame_return (frame); -	if (call_count == 0) +	if (call_count == 0) { +                local->cont.fsync.prebuf.st_ino  = local->cont.fsync.ino; +                local->cont.fsync.postbuf.st_ino = local->cont.fsync.ino; +  		AFR_STACK_UNWIND (fsync, frame, local->op_ret, local->op_errno, -                                  NULL, NULL); +                                  &local->cont.fsync.prebuf, +                                  &local->cont.fsync.postbuf); +        }  	return 0;  } @@ -1198,12 +1229,15 @@ afr_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd,  	call_count = local->call_count;  	frame->local = local; +        local->cont.fsync.ino = fd->inode->ino; +  	for (i = 0; i < priv->child_count; i++) {  		if (local->child_up[i]) { -			STACK_WIND (frame, afr_fsync_cbk, -				    priv->children[i], -				    priv->children[i]->fops->fsync, -				    fd, datasync); +			STACK_WIND_COOKIE (frame, afr_fsync_cbk, +                                           (void *) (long) i, +                                           priv->children[i], +                                           priv->children[i]->fops->fsync, +                                           fd, datasync);  			if (!--call_count)  				break;  		} diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index f0b5e2ede..0177cd3c7 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -207,7 +207,9 @@ typedef struct _afr_local {  			inode_t *inode;  			struct stat buf;                          struct stat read_child_buf; +                        struct stat postparent;                          ino_t ino; +                        ino_t parent_ino;  			dict_t *xattr;  		} lookup; @@ -246,6 +248,7 @@ typedef struct _afr_local {  		struct {  			size_t size;  			int last_tried; +                        ino_t ino;  		} readlink;  		struct { @@ -322,8 +325,8 @@ typedef struct _afr_local {  		struct {  			ino_t ino; -			struct stat buf; -			struct stat read_child_buf; +			struct stat prebuf; +			struct stat postbuf;  			int32_t op_ret; @@ -333,18 +336,24 @@ typedef struct _afr_local {  			off_t offset;  		} writev; +                struct { +                        ino_t ino; +                        struct stat prebuf; +                        struct stat postbuf; +                } fsync; +  		struct {  			ino_t ino;  			off_t offset; -			struct stat buf; -                        struct stat read_child_buf; +			struct stat prebuf; +                        struct stat postbuf;  		} truncate;  		struct {  			ino_t ino;  			off_t offset; -			struct stat buf; -                        struct stat read_child_buf; +			struct stat prebuf; +                        struct stat postbuf;  		} ftruncate;  		struct { @@ -383,60 +392,87 @@ typedef struct _afr_local {  		struct {  			ino_t ino; +                        ino_t parent_ino;  			fd_t *fd;  			int32_t flags;  			mode_t mode;  			inode_t *inode;  			struct stat buf; +                        struct stat preparent; +                        struct stat postparent;                          struct stat read_child_buf;  		} create;  		struct {  			ino_t ino; +                        ino_t parent_ino;  			dev_t dev;  			mode_t mode;  			inode_t *inode;  			struct stat buf; +                        struct stat preparent; +                        struct stat postparent;                          struct stat read_child_buf;  		} mknod;  		struct {  			ino_t ino; +                        ino_t parent_ino;  			int32_t mode;  			inode_t *inode;  			struct stat buf;                          struct stat read_child_buf; +                        struct stat preparent; +                        struct stat postparent;  		} mkdir;  		struct { +                        ino_t parent_ino;  			int32_t op_ret;  			int32_t op_errno; +                        struct stat preparent; +                        struct stat postparent;  		} unlink;  		struct { +                        ino_t parent_ino;  			int32_t op_ret;  			int32_t op_errno; +                        struct stat preparent; +                        struct stat postparent;  		} rmdir;  		struct { +                        ino_t oldparent_ino; +                        ino_t newparent_ino;  			ino_t ino;  			struct stat buf;                          struct stat read_child_buf; +                        struct stat preoldparent; +                        struct stat prenewparent; +                        struct stat postoldparent; +                        struct stat postnewparent;  		} rename;  		struct {  			ino_t ino; +                        ino_t parent_ino;  			inode_t *inode;  			struct stat buf;                          struct stat read_child_buf; +                        struct stat preparent; +                        struct stat postparent;  		} link;  		struct {  			ino_t ino; +                        ino_t parent_ino;  			inode_t *inode;  			struct stat buf;                          struct stat read_child_buf;  			char *linkpath; +                        struct stat preparent; +                        struct stat postparent;  		} symlink;  		struct {  | 
