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>
This commit is contained in:
parent
79387af286
commit
9b645be90f
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user