diff options
author | Jeff Layton <jlayton@redhat.com> | 2012-04-26 11:48:52 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2012-04-26 13:25:04 -0400 |
commit | 09d9011c66e518ca7fd01d41607845b940f58c8f (patch) | |
tree | b4cddb31438f80171f5f8053d06da76d1168fd12 /utils/nfsdcld/nfsdcld.c | |
parent | 1b0d2b29df2e089bbcabc37a4cd716a448d48a5e (diff) | |
download | nfs-utils-09d9011c66e518ca7fd01d41607845b940f58c8f.tar.gz nfs-utils-09d9011c66e518ca7fd01d41607845b940f58c8f.tar.xz nfs-utils-09d9011c66e518ca7fd01d41607845b940f58c8f.zip |
nfsdcld: add function to remove unreclaimed client records
This should remove any client record that has a timestamp prior to
the given time.
Eventually, this call will need to be made cluster aware when this is
run in a clustered configuration. For now, this is only suitable for
single-host configurations.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/nfsdcld/nfsdcld.c')
-rw-r--r-- | utils/nfsdcld/nfsdcld.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/utils/nfsdcld/nfsdcld.c b/utils/nfsdcld/nfsdcld.c index 2dfd7ec..2d11868 100644 --- a/utils/nfsdcld/nfsdcld.c +++ b/utils/nfsdcld/nfsdcld.c @@ -232,6 +232,37 @@ cld_check(struct cld_client *clnt) } static void +cld_gracedone(struct cld_client *clnt) +{ + int ret; + ssize_t bsize, wsize; + struct cld_msg *cmsg = &clnt->cl_msg; + + xlog(D_GENERAL, "%s: grace done. cm_gracetime=%ld", __func__, + cmsg->cm_u.cm_gracetime); + + ret = sqlite_remove_unreclaimed(cmsg->cm_u.cm_gracetime); + + /* set up reply: downcall with 0 status */ + cmsg->cm_status = ret ? -EREMOTEIO : ret; + + bsize = sizeof(*cmsg); + + xlog(D_GENERAL, "Doing downcall with status %d", cmsg->cm_status); + wsize = atomicio((void *)write, clnt->cl_fd, cmsg, bsize); + if (wsize != bsize) { + xlog(L_ERROR, "%s: problem writing to cld pipe (%ld): %m", + __func__, wsize); + ret = cld_pipe_open(clnt); + if (ret) { + xlog(L_FATAL, "%s: unable to reopen pipe: %d", + __func__, ret); + exit(ret); + } + } +} + +static void cldcb(int UNUSED(fd), short which, void *data) { ssize_t len; @@ -265,6 +296,9 @@ cldcb(int UNUSED(fd), short which, void *data) case Cld_Check: cld_check(clnt); break; + case Cld_GraceDone: + cld_gracedone(clnt); + break; default: xlog(L_WARNING, "%s: command %u is not yet implemented", __func__, cmsg->cm_cmd); |