From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: linux-nfs-owner@vger.kernel.org Received: from mail-qy0-f174.google.com ([209.85.216.174]:46265 "EHLO mail-qy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756490Ab2BAPpK (ORCPT ); Wed, 1 Feb 2012 10:45:10 -0500 Received: by mail-qy0-f174.google.com with SMTP id w6so740319qcq.19 for ; Wed, 01 Feb 2012 07:45:09 -0800 (PST) From: Jeff Layton To: steved@redhat.com Cc: linux-nfs@vger.kernel.org Subject: [PATCH v5 6/9] nfsdcld: add function to remove unreclaimed client records Date: Wed, 1 Feb 2012 10:44:53 -0500 Message-Id: <1328111096-28430-7-git-send-email-jlayton@redhat.com> In-Reply-To: <1328111096-28430-1-git-send-email-jlayton@redhat.com> References: <1328111096-28430-1-git-send-email-jlayton@redhat.com> Sender: linux-nfs-owner@vger.kernel.org List-ID: 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 --- utils/nfsdcld/nfsdcld.c | 34 ++++++++++++++++++++++++++++++++++ utils/nfsdcld/sqlite.c | 28 ++++++++++++++++++++++++++++ utils/nfsdcld/sqlite.h | 1 + 3 files changed, 63 insertions(+), 0 deletions(-) diff --git a/utils/nfsdcld/nfsdcld.c b/utils/nfsdcld/nfsdcld.c index eb01d23..d2a5f2c 100644 --- a/utils/nfsdcld/nfsdcld.c +++ b/utils/nfsdcld/nfsdcld.c @@ -234,6 +234,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; @@ -267,6 +298,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); diff --git a/utils/nfsdcld/sqlite.c b/utils/nfsdcld/sqlite.c index 01bba1a..9e35774 100644 --- a/utils/nfsdcld/sqlite.c +++ b/utils/nfsdcld/sqlite.c @@ -38,6 +38,7 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ +#include #include #include #include @@ -360,3 +361,30 @@ out_err: sqlite3_finalize(stmt); return ret; } + +/* + * remove any client records that were not reclaimed since grace_start. + */ +int +sqlite_remove_unreclaimed(time_t grace_start) +{ + int ret; + char *err = NULL; + + ret = snprintf(buf, sizeof(buf), "DELETE FROM clients WHERE time < %ld", + grace_start); + if (ret < 0) { + return ret; + } else if ((size_t)ret >= sizeof(buf)) { + ret = -EINVAL; + return ret; + } + + ret = sqlite3_exec(dbh, buf, NULL, NULL, &err); + if (ret != SQLITE_OK) + xlog(L_ERROR, "%s: delete failed: %s", __func__, err); + + xlog(D_GENERAL, "%s: returning %d", __func__, ret); + sqlite3_free(err); + return ret; +} diff --git a/utils/nfsdcld/sqlite.h b/utils/nfsdcld/sqlite.h index 59ebd72..c85e7d6 100644 --- a/utils/nfsdcld/sqlite.h +++ b/utils/nfsdcld/sqlite.h @@ -24,5 +24,6 @@ int sqlite_maindb_init(char *topdir); int sqlite_insert_client(const unsigned char *clname, const size_t namelen); int sqlite_remove_client(const unsigned char *clname, const size_t namelen); int sqlite_check_client(const unsigned char *clname, const size_t namelen); +int sqlite_remove_unreclaimed(const time_t grace_start); #endif /* _SQLITE_H */ -- 1.7.7.6