diff options
| author | Anand Avati <avati@redhat.com> | 2013-04-28 12:22:54 -0700 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2013-05-25 11:36:21 -0700 | 
| commit | 9b645be90f76e71f3d1587db66c0c1f9599e5b2d (patch) | |
| tree | 534ec7dd25f0972029d872c1abaedd8b1d884527 | |
| parent | 79387af286421c0668f21a2c34adc9f18f6da464 (diff) | |
gfapi: link inodes in relevant entry FOPs
Do not let inode linking to happen only in lookup(). While
that works, it is inefficient.
Change-Id: I51bbfb6255ec4324ab17ff00566375f49d120c06
BUG: 953694
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/4931
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
| -rw-r--r-- | api/src/glfs-fops.c | 73 | ||||
| -rw-r--r-- | libglusterfs/src/syncop.c | 32 | ||||
| -rw-r--r-- | libglusterfs/src/syncop.h | 9 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 6 | 
4 files changed, 105 insertions, 15 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index fe230e6a9bf..0bea82a04cb 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -26,6 +26,41 @@  	}						\  	} while (0) + +static int +glfs_loc_link (loc_t *loc, struct iatt *iatt) +{ +	int ret = -1; +	inode_t *linked_inode = NULL; + +	if (!loc->inode) { +		errno = EINVAL; +		return -1; +	} + +	linked_inode = inode_link (loc->inode, loc->parent, loc->name, iatt); +	if (linked_inode) { +		inode_lookup (linked_inode); +		inode_unref (linked_inode); +		ret = 0; +	} else { +		ret = -1; +		errno = ENOMEM; +	} + +	return ret; +} + + +static int +glfs_loc_unlink (loc_t *loc) +{ +	inode_unlink (loc->inode, loc->parent, loc->name); + +	return 0; +} + +  struct glfs_fd *  glfs_open (struct glfs *fs, const char *path, int flags)  { @@ -302,9 +337,13 @@ retry:  		goto out;  	} -	ret = syncop_create (subvol, &loc, flags, mode, glfd->fd, xattr_req); +	ret = syncop_create (subvol, &loc, flags, mode, glfd->fd, +			     xattr_req, &iatt);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_link (&loc, &iatt);  out:  	loc_wipe (&loc); @@ -998,9 +1037,12 @@ retry:  		goto out;  	} -	ret = syncop_symlink (subvol, &loc, data, xattr_req); +	ret = syncop_symlink (subvol, &loc, data, xattr_req, &iatt);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_link (&loc, &iatt);  out:  	loc_wipe (&loc); @@ -1115,9 +1157,12 @@ retry:  		goto out;  	} -	ret = syncop_mknod (subvol, &loc, mode, dev, xattr_req); +	ret = syncop_mknod (subvol, &loc, mode, dev, xattr_req, &iatt);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_link (&loc, &iatt);  out:  	loc_wipe (&loc); @@ -1191,9 +1236,12 @@ retry:  		goto out;  	} -	ret = syncop_mkdir (subvol, &loc, mode, xattr_req); +	ret = syncop_mkdir (subvol, &loc, mode, xattr_req, &iatt);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_link (&loc, &iatt);  out:  	loc_wipe (&loc); @@ -1238,6 +1286,9 @@ retry:  	ret = syncop_unlink (subvol, &loc);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_unlink (&loc);  out:  	loc_wipe (&loc); @@ -1279,6 +1330,9 @@ retry:  	ret = syncop_rmdir (subvol, &loc);  	ESTALE_RETRY (ret, errno, reval, &loc, retry); + +	if (ret == 0) +		ret = glfs_loc_unlink (&loc);  out:  	loc_wipe (&loc); @@ -1341,6 +1395,11 @@ retrynew:  			goto retry;  		}  	} + +	if (ret == 0) +		inode_rename (oldloc.parent->table, oldloc.parent, oldloc.name, +			      newloc.parent, newloc.name, oldloc.inode, +			      &oldiatt);  out:  	loc_wipe (&oldloc);  	loc_wipe (&newloc); @@ -1401,6 +1460,8 @@ retrynew:  			goto retry;  	} +	if (ret == 0) +		ret = glfs_loc_link (&newloc, &oldiatt);  out:  	loc_wipe (&oldloc);  	loc_wipe (&newloc); @@ -1570,6 +1631,10 @@ glfd_entry_refresh (struct glfs_fd *glfd, int plus)  		/* spurious errno is dangerous for glfd_entry_next() */  		errno = 0; +		if (plus) +			gf_link_inodes_from_dirent (THIS, glfd->fd->inode, +						    &entries); +  		list_splice_init (&glfd->entries, &old.list);  		list_splice_init (&entries.list, &glfd->entries);  	} diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 0a1138b590b..8e5db41fda7 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -1433,6 +1433,9 @@ syncop_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          args->op_ret   = op_ret;          args->op_errno = op_errno; +	if (buf) +		args->iatt1 = *buf; +          __wake (args);          return 0; @@ -1440,7 +1443,7 @@ syncop_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int  syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode, -               fd_t *fd, dict_t *xdata) +               fd_t *fd, dict_t *xdata, struct iatt *iatt)  {          struct syncargs args = {0, }; @@ -1448,6 +1451,9 @@ syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode,                  loc, flags, mode, 0, fd, xdata);          errno = args.op_errno; +	if (iatt) +		*iatt = args.iatt1; +          return args.op_ret;  } @@ -1744,6 +1750,8 @@ syncop_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          args->op_ret   = op_ret;          args->op_errno = op_errno; +	if (buf) +		args->iatt1 = *buf;          __wake (args); @@ -1751,7 +1759,8 @@ syncop_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  }  int -syncop_symlink (xlator_t *subvol, loc_t *loc, const char *newpath, dict_t *dict) +syncop_symlink (xlator_t *subvol, loc_t *loc, const char *newpath, dict_t *dict, +		struct iatt *iatt)  {          struct syncargs args = {0, }; @@ -1759,6 +1768,9 @@ syncop_symlink (xlator_t *subvol, loc_t *loc, const char *newpath, dict_t *dict)                  newpath, loc, 0, dict);          errno = args.op_errno; +	if (iatt) +		*iatt = args.iatt1; +          return args.op_ret;  } @@ -1812,6 +1824,9 @@ syncop_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          args->op_ret   = op_ret;          args->op_errno = op_errno; +	if (buf) +		args->iatt1 = *buf; +          __wake (args);          return 0; @@ -1819,7 +1834,7 @@ syncop_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int  syncop_mknod (xlator_t *subvol, loc_t *loc, mode_t mode, dev_t rdev, -              dict_t *dict) +              dict_t *dict, struct iatt *iatt)  {          struct syncargs args = {0, }; @@ -1827,6 +1842,9 @@ syncop_mknod (xlator_t *subvol, loc_t *loc, mode_t mode, dev_t rdev,                  loc, mode, rdev, 0, dict);          errno = args.op_errno; +	if (iatt) +		*iatt = args.iatt1; +          return args.op_ret;  } @@ -1844,6 +1862,8 @@ syncop_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          args->op_ret   = op_ret;          args->op_errno = op_errno; +	if (buf) +		args->iatt1 = *buf;          __wake (args); @@ -1852,7 +1872,8 @@ syncop_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int -syncop_mkdir (xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *dict) +syncop_mkdir (xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *dict, +	      struct iatt *iatt)  {          struct syncargs args = {0, }; @@ -1860,6 +1881,9 @@ syncop_mkdir (xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *dict)                  loc, mode, 0, dict);          errno = args.op_errno; +	if (iatt) +		*iatt = args.iatt1; +          return args.op_ret;  } diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h index f05db9943a2..98e88ff37d5 100644 --- a/libglusterfs/src/syncop.h +++ b/libglusterfs/src/syncop.h @@ -298,7 +298,7 @@ int syncop_removexattr (xlator_t *subvol, loc_t *loc, const char *name);  int syncop_fremovexattr (xlator_t *subvol, fd_t *fd, const char *name);  int syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode, -                   fd_t *fd, dict_t *dict); +                   fd_t *fd, dict_t *dict, struct iatt *iatt);  int syncop_open (xlator_t *subvol, loc_t *loc, int32_t flags, fd_t *fd);  int syncop_close (fd_t *fd); @@ -324,11 +324,12 @@ int syncop_fstat (xlator_t *subvol, fd_t *fd, struct iatt *stbuf);  int syncop_stat (xlator_t *subvol, loc_t *loc, struct iatt *stbuf);  int syncop_symlink (xlator_t *subvol, loc_t *loc, const char *newpath, -                    dict_t *dict); +                    dict_t *dict, struct iatt *iatt);  int syncop_readlink (xlator_t *subvol, loc_t *loc, char **buffer, size_t size);  int syncop_mknod (xlator_t *subvol, loc_t *loc, mode_t mode, dev_t rdev, -                  dict_t *dict); -int syncop_mkdir (xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *dict); +                  dict_t *dict, struct iatt *iatt); +int syncop_mkdir (xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *dict, +		  struct iatt *iatt);  int syncop_link (xlator_t *subvol, loc_t *oldloc, loc_t *newloc);  int syncop_fsyncdir (xlator_t *subvol, fd_t *fd, int datasync);  int syncop_access (xlator_t *subvol, loc_t *loc, int32_t mask); diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 370118f987b..a9f913c2d4e 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -299,7 +299,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc          /* Create the destination with LINKFILE mode, and linkto xattr,             if the linkfile already exists, it will just open the file */          ret = syncop_create (to, loc, O_RDWR, DHT_LINKFILE_MODE, fd, -                             dict); +                             dict, &new_stbuf);          if (ret < 0) {                  gf_log (this->name, GF_LOG_ERROR,                          "failed to create %s on %s (%s)", @@ -598,7 +598,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc,                          goto out;                  } -                ret = syncop_symlink (to, loc, link, dict); +                ret = syncop_symlink (to, loc, link, dict, 0);                  if (ret) {                          gf_log (this->name, GF_LOG_WARNING,                                  "%s: creating symlink failed (%s)", @@ -612,7 +612,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc,          ret = syncop_mknod (to, loc, st_mode_from_ia (buf->ia_prot,                                                        buf->ia_type),                              makedev (ia_major (buf->ia_rdev), -                                     ia_minor (buf->ia_rdev)), dict); +                                     ia_minor (buf->ia_rdev)), dict, 0);          if (ret) {                  gf_log (this->name, GF_LOG_WARNING, "%s: mknod failed (%s)",                          loc->path, strerror (errno));  | 
