diff options
author | Krishnan Parthasarathi <kparthas@redhat.com> | 2012-09-02 15:22:34 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-09-14 01:28:45 -0700 |
commit | dc772ca6b0fcba8dc4ff4506ac7c171e289bd78a (patch) | |
tree | 1da2eaa342150da9d28a06b315e232efb1ff411a /xlators/storage/posix/src/posix.c | |
parent | df731a50f222fdf3a25e48a0f9ff6d97fc8772b1 (diff) |
storage/posix: Option to set brick(of a volume)'s root dir's uid/gid
CLI
---
gluster volume set VOLNAME owner-uid uid
gluster volume set VOLNAME owner-gid gid
where uid,gid are the owner's user id and group id respectively that
would be set on the root of all brick (backend) fs.
TODO: uid/gid should not be -1. Today we don't validate that in CLI.
Change-Id: Ib6a2fb5e404691c5fe105a89faaeff3e1ab72e91
BUG: 853842
Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-on: http://review.gluster.org/3891
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 2ca4e9b8a60..b6a8a99682d 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -1531,7 +1531,7 @@ posix_link (call_frame_t *frame, xlator_t *this, /* * 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 + * is nonexistent, it will fail. linkat(2) operates on the * symlink instead of its target when the AT_SYMLINK_FOLLOW * flag is not supplied. */ @@ -3973,15 +3973,37 @@ mem_acct_init (xlator_t *this) return ret; } +static int +posix_set_owner (xlator_t *this, uid_t uid, gid_t gid) +{ + struct posix_private *priv = NULL; + int ret = -1; + + priv = this->private; + + ret = sys_chown (priv->base_path, uid, gid); + if (ret) + gf_log (this->name, GF_LOG_ERROR, "Failed to set " + "uid/gid for brick path %s, %s", + priv->base_path, strerror (errno)); + + return ret; +} int reconfigure (xlator_t *this, dict_t *options) { int ret = -1; struct posix_private *priv = NULL; + uid_t uid = -1; + gid_t gid = -1; 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 ("linux-aio", priv->aio_configured, options, bool, out); @@ -4017,6 +4039,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; dir_data = dict_get (this->options, "directory"); @@ -4335,6 +4359,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 ("linux-aio", _private->aio_configured, bool, out); if (_private->aio_configured) { @@ -4446,10 +4474,20 @@ struct volume_options options[] = { { .key = {"glusterd-uuid"}, .type = GF_OPTION_TYPE_STR }, { - .key = {"linux-aio"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = "off", - .description = "Support for native Linux AIO" + .key = {"linux-aio"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .description = "Support for native Linux AIO" }, + { + .key = {"brick-uid"}, + .type = GF_OPTION_TYPE_INT, + .description = "Support for setting uid of brick's root" + }, + { + .key = {"brick-gid"}, + .type = GF_OPTION_TYPE_INT, + .description = "Support for setting gid of brick's root" + }, { .key = {NULL} } }; |