summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r--xlators/storage/posix/src/posix.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index b72cd5e0f..83b689d06 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -1930,18 +1930,9 @@ posix_link (call_frame_t *frame, xlator_t *this,
goto out;
}
-#ifdef HAVE_LINKAT
- /*
- * On most systems (Linux being the notable exception), link(2)
- * first resolves symlinks. If the target is a directory or
- * is nonexistent, it will fail. linkat(2) operates on the
- * symlink instead of its target when the AT_SYMLINK_FOLLOW
- * flag is not supplied.
- */
- op_ret = linkat (AT_FDCWD, real_oldpath, AT_FDCWD, real_newpath, 0);
-#else
- op_ret = link (real_oldpath, real_newpath);
-#endif
+
+ op_ret = sys_link (real_oldpath, real_newpath);
+
if (op_ret == -1) {
op_errno = errno;
gf_log (this->name, GF_LOG_ERROR,
@@ -2950,8 +2941,10 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,
filler.flags = flags;
op_ret = dict_foreach (dict, _handle_setxattr_keyvalue_pair,
&filler);
- if (op_ret < 0)
+ if (op_ret < 0) {
op_errno = -op_ret;
+ op_ret = -1;
+ }
out:
SET_TO_OLD_FS_ID ();
@@ -3430,8 +3423,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
}
goto done;
}
- if (loc->inode && name &&
- (strcmp (name, GF_XATTR_PATHINFO_KEY) == 0)) {
+ if (loc->inode && name && (XATTR_IS_PATHINFO (name))) {
if (LOC_HAS_ABSPATH (loc))
MAKE_REAL_PATH (rpath, this, loc->path);
else
@@ -3451,8 +3443,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
goto done;
}
size = strlen (dyn_rpath) + 1;
- ret = dict_set_dynstr (dict, GF_XATTR_PATHINFO_KEY,
- dyn_rpath);
+ ret = dict_set_dynstr (dict, (char *)name, dyn_rpath);
if (ret < 0) {
gf_log (this->name, GF_LOG_WARNING,
"could not set value (%s) in dictionary",
@@ -3918,8 +3909,10 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
filler.flags = flags;
op_ret = dict_foreach (dict, _handle_fsetxattr_keyvalue_pair,
&filler);
- if (op_ret < 0)
+ if (op_ret < 0) {
op_errno = -op_ret;
+ op_ret = -1;
+ }
out:
SET_TO_OLD_FS_ID ();
@@ -5093,9 +5086,22 @@ posix_set_owner (xlator_t *this, uid_t uid, gid_t gid)
{
struct posix_private *priv = NULL;
int ret = -1;
+ struct stat st = {0,};
priv = this->private;
+ ret = sys_lstat (priv->base_path, &st);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR, "Failed to stat "
+ "brick path %s (%s)",
+ priv->base_path, strerror (errno));
+ return ret;
+ }
+
+ if ((uid == -1 || st.st_uid == uid) &&
+ (gid == -1 || st.st_gid == gid))
+ return 0;
+
ret = sys_chown (priv->base_path, uid, gid);
if (ret)
gf_log (this->name, GF_LOG_ERROR, "Failed to set "
@@ -5131,15 +5137,16 @@ reconfigure (xlator_t *this, dict_t *options)
{
int ret = -1;
struct posix_private *priv = NULL;
- uid_t uid = -1;
- gid_t gid = -1;
+ int32_t uid = -1;
+ int32_t gid = -1;
char *batch_fsync_mode_str = NULL;
priv = this->private;
- GF_OPTION_RECONF ("brick-uid", uid, options, uint32, out);
- GF_OPTION_RECONF ("brick-gid", gid, options, uint32, out);
- posix_set_owner (this, uid, gid);
+ GF_OPTION_RECONF ("brick-uid", uid, options, int32, out);
+ GF_OPTION_RECONF ("brick-gid", gid, options, int32, out);
+ if (uid != -1 || gid != -1)
+ posix_set_owner (this, uid, gid);
GF_OPTION_RECONF ("batch-fsync-delay-usec", priv->batch_fsync_delay_usec,
options, uint32, out);
@@ -5205,8 +5212,8 @@ init (xlator_t *this)
uuid_t gfid = {0,};
uuid_t rootgfid = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
char *guuid = NULL;
- uid_t uid = -1;
- gid_t gid = -1;
+ int32_t uid = -1;
+ int32_t gid = -1;
char *batch_fsync_mode_str;
dir_data = dict_get (this->options, "directory");
@@ -5541,9 +5548,10 @@ init (xlator_t *this)
_private->aio_init_done = _gf_false;
_private->aio_capable = _gf_false;
- GF_OPTION_INIT ("brick-uid", uid, uint32, out);
- GF_OPTION_INIT ("brick-gid", gid, uint32, out);
- posix_set_owner (this, uid, gid);
+ GF_OPTION_INIT ("brick-uid", uid, int32, out);
+ GF_OPTION_INIT ("brick-gid", gid, int32, out);
+ if (uid != -1 || gid != -1)
+ posix_set_owner (this, uid, gid);
GF_OPTION_INIT ("linux-aio", _private->aio_configured, bool, out);
@@ -5704,15 +5712,17 @@ struct volume_options options[] = {
{
.key = {"brick-uid"},
.type = GF_OPTION_TYPE_INT,
- .min = 0,
+ .min = -1,
.validate = GF_OPT_VALIDATE_MIN,
+ .default_value = "-1",
.description = "Support for setting uid of brick's owner"
},
{
.key = {"brick-gid"},
.type = GF_OPTION_TYPE_INT,
- .min = 0,
+ .min = -1,
.validate = GF_OPT_VALIDATE_MIN,
+ .default_value = "-1",
.description = "Support for setting gid of brick's owner"
},
{ .key = {"node-uuid-pathinfo"},