diff options
author | Niels de Vos <ndevos@redhat.com> | 2014-07-05 11:44:30 +0200 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-07-07 10:28:47 -0700 |
commit | ec74ceedaa41047b88d270c00eeb071b73e19664 (patch) | |
tree | 515c4b6e17ebf0ba0567b2f69f94e10aae2c55c8 /xlators/nfs/server/src | |
parent | d6cc24f748c2287d7607de355ef236132c169a15 (diff) |
nfs: prevent assertion error with MOUNT over UDP
The MOUNT service over UDP runs in a separate thread. This thread does
not have the correct *THIS xlator set. *THIS points to the global (base)
xlator structure, but GF_CALLOC() requires it to be the NFS-xlator so
that assertions can get validated correctly.
This is solved by passing the NFS-xlator to the pthread function, and
setting the *THIS pointer explicitly in the new thread.
It seems that on occasion (needs further investigation) MOUNT over UDP
does not unregister itself. There can also be issues when the kernel NLM
implementation has been registered at portmap/rpcbind, so adding some
unregister procedures in the cleanup of the test-cases.
Change-Id: I3be5a420fc800bbcc14198d0b6faf4cf2c7300b1
BUG: 1116503
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: http://review.gluster.org/8241
Reviewed-by: Santosh Pradhan <spradhan@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/nfs/server/src')
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 2 | ||||
-rw-r--r-- | xlators/nfs/server/src/mount3udp_svc.c | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index d40cb37a864..677b4be7238 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -2660,7 +2660,7 @@ mnt3svc_init (xlator_t *nfsx) } if (nfs->mount_udp) { - pthread_create (&udp_thread, NULL, mount3udp_thread, NULL); + pthread_create (&udp_thread, NULL, mount3udp_thread, nfsx); } return &mnt3prog; err: diff --git a/xlators/nfs/server/src/mount3udp_svc.c b/xlators/nfs/server/src/mount3udp_svc.c index fb59e282c8e..70aead67edb 100644 --- a/xlators/nfs/server/src/mount3udp_svc.c +++ b/xlators/nfs/server/src/mount3udp_svc.c @@ -170,8 +170,17 @@ mountudp_program_3(struct svc_req *rqstp, register SVCXPRT *transp) void * mount3udp_thread (void *argv) { + xlator_t *nfsx = argv; register SVCXPRT *transp = NULL; + GF_ASSERT (nfsx); + + if (glusterfs_this_set(nfsx)) { + gf_log (GF_MNT, GF_LOG_ERROR, "failed to set xlator, " + "nfs.mount-udp will not work"); + return NULL; + } + transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { gf_log (GF_MNT, GF_LOG_ERROR, "svcudp_create error"); |