summaryrefslogtreecommitdiffstats
path: root/utils/nfsdcld/nfsdcld.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2012-04-26 11:48:52 -0400
committerSteve Dickson <steved@redhat.com>2012-04-26 13:25:04 -0400
commit09d9011c66e518ca7fd01d41607845b940f58c8f (patch)
treeb4cddb31438f80171f5f8053d06da76d1168fd12 /utils/nfsdcld/nfsdcld.c
parent1b0d2b29df2e089bbcabc37a4cd716a448d48a5e (diff)
downloadnfs-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.c34
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);