From d41bbb6dbaf64a8ef55e40e0550b83daac1eeb7a Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Mon, 10 Aug 2015 18:01:32 +0200 Subject: fuse: add "resolve-gids" mount option to overcome 32-groups limit Add a --resolve-gids commandline option to the glusterfs binary. This option gets set when executing "mount -t glusterfs -o resolve-gids ...". This option is most useful in combination with the "acl" mount option. POSIX ACL permission checking is done on the FUSE-client side to improve performance (in addition to the checking on the bricks). The fuse-bridge reads /proc/$PID/status by default, and this file contains maximum 32 groups. Any local (client-side) permission checking that requires more than the first 32 groups will fail. By enabling the "resolve-gids" option, the fuse-bridge will call getgrouplist() to retrieve all the groups from the user accessing the mountpoint. This is comparable to how "nfs.server-aux-gids" works. Note that when a user belongs to more than ~93 groups, the volume option server.manage-gids needs to be enabled too. Without this option, the RPC-layer will need to reduce the number of groups to make them fit in the RPC-header. Cherry picked from commit 64a5bf3749c67fcc00773a2716d0c7b61b0b4417: > Change-Id: I7ede90d0e41bcf55755cced5747fa0fb1699edb2 > BUG: 1246275 > Signed-off-by: Niels de Vos > Reviewed-on: http://review.gluster.org/11732 > Tested-by: NetBSD Build System > Reviewed-by: Ravishankar N > Tested-by: Gluster Build System > Reviewed-by: jiffin tony Thottan > Reviewed-by: Kaleb KEITHLEY Change-Id: I7ede90d0e41bcf55755cced5747fa0fb1699edb2 BUG: 1246397 Signed-off-by: Niels de Vos Reviewed-on: http://review.gluster.org/11875 Tested-by: Gluster Build System Tested-by: NetBSD Build System Reviewed-by: Pranith Kumar Karampuri --- glusterfsd/src/glusterfsd.c | 17 +++++++++++++++++ glusterfsd/src/glusterfsd.h | 1 + 2 files changed, 18 insertions(+) (limited to 'glusterfsd') diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index ffd1eb48144..c86f5f02617 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -203,6 +203,8 @@ static struct argp_option gf_options[] = { {"gid-timeout", ARGP_GID_TIMEOUT_KEY, "SECONDS", 0, "Set auxilary group list timeout to SECONDS for fuse translator " "[default: 300]"}, + {"resolve-gids", ARGP_RESOLVE_GIDS_KEY, 0, 0, + "Resolve all auxilary groups in fuse translator (max 32 otherwise)"}, {"background-qlen", ARGP_FUSE_BACKGROUND_QLEN_KEY, "N", 0, "Set fuse module's background queue length to N " "[default: 64]"}, @@ -432,6 +434,16 @@ set_fuse_mount_options (glusterfs_ctx_t *ctx, dict_t *options) goto err; } } + + if (cmd_args->resolve_gids) { + ret = dict_set_static_ptr (options, "resolve-gids", "on"); + if (ret < 0) { + gf_msg ("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_4, + "resolve-gids"); + goto err; + } + } + if (cmd_args->background_qlen) { ret = dict_set_int32 (options, "background-qlen", cmd_args->background_qlen); @@ -1080,6 +1092,11 @@ parse_opts (int key, char *arg, struct argp_state *state) argp_failure(state, -1, 0, "unknown group list timeout %s", arg); break; + + case ARGP_RESOLVE_GIDS_KEY: + cmd_args->resolve_gids = 1; + break; + case ARGP_FUSE_BACKGROUND_QLEN_KEY: if (!gf_string2int (arg, &cmd_args->background_qlen)) break; diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index d183b0507fa..f5f0e62c51f 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -95,6 +95,7 @@ enum argp_option_keys { ARGP_LOG_FLUSH_TIMEOUT = 171, ARGP_SECURE_MGMT_KEY = 172, ARGP_GLOBAL_TIMER_WHEEL = 173, + ARGP_RESOLVE_GIDS_KEY = 174, }; struct _gfd_vol_top_priv_t { -- cgit