diff options
author | Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> | 2016-03-16 12:11:50 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2016-03-16 12:21:55 -0400 |
commit | 425f81f82a1743465480599d2bf761d92f0aacf3 (patch) | |
tree | d3ad2fbb00a76d6dbfc04891e6d6e229600ceb7f /utils/exportfs | |
parent | 55c12c837feaa909de8cbd6d5fe23378b85efeff (diff) | |
download | nfs-utils-425f81f82a1743465480599d2bf761d92f0aacf3.tar.gz nfs-utils-425f81f82a1743465480599d2bf761d92f0aacf3.tar.xz nfs-utils-425f81f82a1743465480599d2bf761d92f0aacf3.zip |
statd: Don't unregister statd service on failing to execute callout
statd calls atexit(statd_unregister) to unregister statd service on
exit, which actually has a side-effect that ha_callout() unregisters statd
service even when the child callout process exits on execl() failure.
Certain clustering software's deployment script adds -H option with its
specified file non-existent, when it is configured not to use callout.
In other words, -H seems to be used no matter if callout is needed or
not, but when callout is unnecessary, the specified callout program is not
deployed.
This causes statd not to work once a lock is requested by its NFS
client,
as execl() in ha_callout() results in ENOENT and exit() of the child
process calls exit-handler statd_unregister(). Eventually, the NFS
client
gets stuck with messages "lockd: cannot monitor xxx" on the NFS server.
Also, execl() could fail for other reasons like ENFILE or EIO as well.
A forked child must not unregister the statd RPC server, so use
_exit(), which does not call any exit-handlers, instead of exit().
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/exportfs')
0 files changed, 0 insertions, 0 deletions