/**
* collectd - src/nfs.c
- * Copyright (C) 2005 Jason Pepas
+ * Copyright (C) 2005,2006 Jason Pepas
+ * Copyright (C) 2012,2013 Florian Forster
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
+ * Free Software Foundation; only version 2 of the License is applicable.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
*
* Authors:
* Jason Pepas <cell at ices.utexas.edu>
- * Florian octo Forster <octo at verplant.org>
+ * Florian octo Forster <octo at collectd.org>
+ * Cosmin Ioiart <cioiart at gmail.com>
**/
#include "collectd.h"
#include "common.h"
#include "plugin.h"
-#define MODULE_NAME "nfs"
-
-#if defined(KERNEL_LINUX) || defined(HAVE_LIBKSTAT)
-# define NFS_HAVE_READ 1
-#else
-# define NFS_HAVE_READ 0
+#if HAVE_KSTAT_H
+#include <kstat.h>
#endif
-static char *nfs2_procedures_file = "nfs2_procedures-%s.rrd";
-static char *nfs3_procedures_file = "nfs3_procedures-%s.rrd";
-
/*
see /proc/net/rpc/nfs
see http://www.missioncriticallinux.com/orph/NFS-Statistics
21 commit
*/
-static char *nfs2_procedures_ds_def[] =
+static const char *nfs2_procedures_names[] =
+{
+ "null",
+ "getattr",
+ "setattr",
+ "root",
+ "lookup",
+ "readlink",
+ "read",
+ "wrcache",
+ "write",
+ "create",
+ "remove",
+ "rename",
+ "link",
+ "symlink",
+ "mkdir",
+ "rmdir",
+ "readdir",
+ "fsstat"
+};
+static size_t nfs2_procedures_names_num = STATIC_ARRAY_SIZE (nfs2_procedures_names);
+
+static const char *nfs3_procedures_names[] =
+{
+ "null",
+ "getattr",
+ "setattr",
+ "lookup",
+ "access",
+ "readlink",
+ "read",
+ "write",
+ "create",
+ "mkdir",
+ "symlink",
+ "mknod",
+ "remove",
+ "rmdir",
+ "rename",
+ "link",
+ "readdir",
+ "readdirplus",
+ "fsstat",
+ "fsinfo",
+ "pathconf",
+ "commit"
+};
+static size_t nfs3_procedures_names_num = STATIC_ARRAY_SIZE (nfs3_procedures_names);
+
+#if HAVE_LIBKSTAT
+static const char *nfs4_procedures_names[] =
+{
+ "null",
+ "compound",
+ "reserved",
+ "access",
+ "close",
+ "commit",
+ "create",
+ "delegpurge",
+ "delegreturn",
+ "getattr",
+ "getfh",
+ "link",
+ "lock",
+ "lockt",
+ "locku",
+ "lookup",
+ "lookupp",
+ "nverify",
+ "open",
+ "openattr",
+ "open_confirm",
+ "open_downgrade",
+ "putfh",
+ "putpubfh",
+ "putrootfh",
+ "read",
+ "readdir",
+ "readlink",
+ "remove",
+ "rename",
+ "renew",
+ "restorefh",
+ "savefh",
+ "secinfo",
+ "setattr",
+ "setclientid",
+ "setclientid_confirm",
+ "verify",
+ "write"
+};
+static size_t nfs4_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_procedures_names);
+#endif
+
+#if KERNEL_LINUX
+static const char *nfs4_server40_procedures_names[] =
+{
+ "null",
+ "compound",
+ "reserved",
+ "access",
+ "close",
+ "commit",
+ "create",
+ "delegpurge",
+ "delegreturn",
+ "getattr",
+ "getfh",
+ "link",
+ "lock",
+ "lockt",
+ "locku",
+ "lookup",
+ "lookupp",
+ "nverify",
+ "open",
+ "openattr",
+ "open_confirm",
+ "open_downgrade",
+ "putfh",
+ "putpubfh",
+ "putrootfh",
+ "read",
+ "readdir",
+ "readlink",
+ "remove",
+ "rename",
+ "renew",
+ "restorefh",
+ "savefh",
+ "secinfo",
+ "setattr",
+ "setclientid",
+ "setcltid_confirm",
+ "verify",
+ "write",
+ "release_lockowner"
+};
+
+static size_t nfs4_server40_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_server40_procedures_names);
+
+static const char *nfs4_server41_procedures_names[] =
{
- "DS:null:COUNTER:25:0:U",
- "DS:getattr:COUNTER:25:0:U",
- "DS:setattr:COUNTER:25:0:U",
- "DS:root:COUNTER:25:0:U",
- "DS:lookup:COUNTER:25:0:U",
- "DS:readlink:COUNTER:25:0:U",
- "DS:read:COUNTER:25:0:U",
- "DS:wrcache:COUNTER:25:0:U",
- "DS:write:COUNTER:25:0:U",
- "DS:create:COUNTER:25:0:U",
- "DS:remove:COUNTER:25:0:U",
- "DS:rename:COUNTER:25:0:U",
- "DS:link:COUNTER:25:0:U",
- "DS:symlink:COUNTER:25:0:U",
- "DS:mkdir:COUNTER:25:0:U",
- "DS:rmdir:COUNTER:25:0:U",
- "DS:readdir:COUNTER:25:0:U",
- "DS:fsstat:COUNTER:25:0:U",
- NULL
+ "backchannel_ctl",
+ "bind_conn_to_session",
+ "exchange_id",
+ "create_session",
+ "destroy_session",
+ "free_stateid",
+ "get_dir_delegation",
+ "getdeviceinfo",
+ "getdevicelist",
+ "layoutcommit",
+ "layoutget",
+ "layoutreturn",
+ "secinfo_no_name",
+ "sequence",
+ "set_ssv",
+ "test_stateid",
+ "want_delegation",
+ "destroy_clientid",
+ "reclaim_complete",
};
-static int nfs2_procedures_ds_num = 18;
-static char *nfs3_procedures_ds_def[] =
+static size_t nfs4_server41_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_server41_procedures_names);
+
+#define NFS4_SERVER40_NUM_PROC ( \
+ STATIC_ARRAY_SIZE (nfs4_server40_procedures_names) )
+
+#define NFS4_SERVER41_NUM_PROC ( \
+ STATIC_ARRAY_SIZE (nfs4_server40_procedures_names) + \
+ STATIC_ARRAY_SIZE (nfs4_server41_procedures_names) )
+
+#define NFS4_SERVER_MAX_PROC (NFS4_SERVER41_NUM_PROC)
+
+static const char *nfs4_client40_procedures_names[] =
{
- "DS:null:COUNTER:25:0:U",
- "DS:getattr:COUNTER:25:0:U",
- "DS:setattr:COUNTER:25:0:U",
- "DS:lookup:COUNTER:25:0:U",
- "DS:access:COUNTER:25:0:U",
- "DS:readlink:COUNTER:25:0:U",
- "DS:read:COUNTER:25:0:U",
- "DS:write:COUNTER:25:0:U",
- "DS:create:COUNTER:25:0:U",
- "DS:mkdir:COUNTER:25:0:U",
- "DS:symlink:COUNTER:25:0:U",
- "DS:mknod:COUNTER:25:0:U",
- "DS:remove:COUNTER:25:0:U",
- "DS:rmdir:COUNTER:25:0:U",
- "DS:rename:COUNTER:25:0:U",
- "DS:link:COUNTER:25:0:U",
- "DS:readdir:COUNTER:25:0:U",
- "DS:readdirplus:COUNTER:25:0:U",
- "DS:fsstat:COUNTER:25:0:U",
- "DS:fsinfo:COUNTER:25:0:U",
- "DS:pathconf:COUNTER:25:0:U",
- "DS:commit:COUNTER:25:0:U",
- NULL
+ "null",
+ "read",
+ "write",
+ "commit",
+ "open",
+ "open_confirm",
+ "open_noattr",
+ "open_downgrade",
+ "close",
+ "setattr",
+ "fsinfo",
+ "renew",
+ "setclientid",
+ "setclientid_confirm",
+ "lock",
+ "lockt",
+ "locku",
+ "access",
+ "getattr",
+ "lookup",
+ "lookupp",
+ "remove",
+ "rename",
+ "link",
+ "symlink",
+ "create",
+ "pathconf",
+ "statfs",
+ "readlink",
+ "readdir",
+ "server_caps",
+ "delegreturn",
+ "getacl",
+ "setacl",
+ "fs_locations", /* |35| 2.6.18 */
+ "release_lockowner", /* |42| 2.6.36 */
+ "secinfo", /* |46| 2.6.39 */
+ "fsid_present" /* |54| 3.13 */
};
-static int nfs3_procedures_ds_num = 22;
-#ifdef HAVE_LIBKSTAT
+static const char *nfs4_client41_procedures_names[] =
+{
+ "exchange_id", /* |40| 2.6.30 */
+ "create_session", /* |40| 2.6.30 */
+ "destroy_session", /* |40| 2.6.30 */
+ "sequence", /* |40| 2.6.30 */
+ "get_lease_time", /* |40| 2.6.30 */
+ "reclaim_complete", /* |41| 2.6.33 */
+ "layoutget", /* |44| 2.6.37 */
+ "getdeviceinfo", /* |44| 2.6.37 */
+ "layoutcommit", /* |46| 2.6.39 */
+ "layoutreturn", /* |47| 3.0 */
+ "secinfo_no_name", /* |51| 3.1 */
+ "test_stateid", /* |51| 3.1 */
+ "free_stateid", /* |51| 3.1 */
+ "getdevicelist", /* |51| 3.1 */
+ "bind_conn_to_session", /* |53| 3.5 */
+ "destroy_clientid" /* |53| 3.5 */
+};
+
+#define NFS4_CLIENT40_NUM_PROC ( \
+ STATIC_ARRAY_SIZE (nfs4_client40_procedures_names) )
+
+#define NFS4_CLIENT41_NUM_PROC ( \
+ STATIC_ARRAY_SIZE (nfs4_client40_procedures_names) + \
+ STATIC_ARRAY_SIZE (nfs4_client41_procedures_names) )
+
+#define NFS4_CLIENT_MAX_PROC (NFS4_CLIENT41_NUM_PROC)
+
+#endif
+
+#if HAVE_LIBKSTAT
extern kstat_ctl_t *kc;
static kstat_t *nfs2_ksp_client;
static kstat_t *nfs2_ksp_server;
static kstat_t *nfs4_ksp_server;
#endif
-/* Possibly TODO: NFSv4 statistics */
+#if KERNEL_LINUX
+static int nfs_init (void)
+{
+ return (0);
+}
+/* #endif KERNEL_LINUX */
-void nfs_init (void)
+#elif HAVE_LIBKSTAT
+static int nfs_init (void)
{
-#ifdef HAVE_LIBKSTAT
- kstat_t *ksp_chain;
+ kstat_t *ksp_chain = NULL;
nfs2_ksp_client = NULL;
nfs2_ksp_server = NULL;
nfs3_ksp_server = NULL;
nfs4_ksp_client = NULL;
nfs4_ksp_server = NULL;
-
+
if (kc == NULL)
- return;
+ return (-1);
for (ksp_chain = kc->kc_chain; ksp_chain != NULL;
ksp_chain = ksp_chain->ks_next)
else if (strncmp (ksp_chain->ks_name, "rfsreqcnt_v4", 12) == 0)
nfs4_ksp_client = ksp_chain;
}
+
+ return (0);
+} /* int nfs_init */
#endif
- return;
-}
+static void nfs_procedures_submit (const char *plugin_instance,
+ const char **type_instances,
+ value_t *values, size_t values_num)
+{
+ value_list_t vl = VALUE_LIST_INIT;
+ size_t i;
+
+ vl.values_len = 1;
+ sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+ sstrncpy (vl.plugin, "nfs", sizeof (vl.plugin));
+ sstrncpy (vl.plugin_instance, plugin_instance,
+ sizeof (vl.plugin_instance));
+ sstrncpy (vl.type, "nfs_procedure", sizeof (vl.type));
+
+ for (i = 0; i < values_num; i++)
+ {
+ vl.values = values + i;
+ sstrncpy (vl.type_instance, type_instances[i],
+ sizeof (vl.type_instance));
+ plugin_dispatch_values (&vl);
+ }
+} /* void nfs_procedures_submit */
-#define BUFSIZE 1024
-void nfs2_procedures_write (char *host, char *inst, char *val)
+#if KERNEL_LINUX
+static void nfs_submit_fields (int nfs_version, const char *instance,
+ char **fields, size_t fields_num, const char **proc_names)
{
- char filename[BUFSIZE];
+ char plugin_instance[DATA_MAX_NAME_LEN];
+ value_t values[fields_num];
+ size_t i;
- if (snprintf (filename, BUFSIZE, nfs2_procedures_file, inst) > BUFSIZE)
- return;
+ ssnprintf (plugin_instance, sizeof (plugin_instance), "v%i%s",
+ nfs_version, instance);
+
+ for (i = 0; i < fields_num; i++)
+ (void) parse_value (fields[i], &values[i], DS_TYPE_DERIVE);
- rrd_update_file (host, filename, val, nfs2_procedures_ds_def,
- nfs2_procedures_ds_num);
+ nfs_procedures_submit (plugin_instance, proc_names, values,
+ fields_num);
}
-void nfs3_procedures_write (char *host, char *inst, char *val)
+static int nfs_submit_fields_safe (int nfs_version, const char *instance,
+ char **fields, size_t fields_num,
+ const char **proc_names, size_t proc_names_num)
{
- char filename[BUFSIZE];
+ if (fields_num != proc_names_num)
+ {
+ WARNING ("nfs plugin: Wrong number of fields for "
+ "NFSv%i %s statistics. Expected %zu, got %zu.",
+ nfs_version, instance,
+ proc_names_num, fields_num);
+ return (EINVAL);
+ }
- if (snprintf (filename, BUFSIZE, nfs3_procedures_file, inst) > BUFSIZE)
- return;
+ nfs_submit_fields (nfs_version, instance, fields, fields_num,
+ proc_names);
- rrd_update_file (host, filename, val, nfs3_procedures_ds_def,
- nfs3_procedures_ds_num);
+ return (0);
}
-void nfs2_procedures_submit (unsigned long long *val, char *inst)
+static int nfs_submit_nfs4_server (const char *instance, char **fields,
+ size_t fields_num)
{
- char buf[BUFSIZE];
- int retval = 0;
+ static int suppress_warning = 0;
- retval = snprintf (buf, BUFSIZE, "%u:%llu:%llu:%llu:%llu:%llu:%llu:"
- "%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:"
- "%llu:%llu:%llu", /* 18x %llu */
- (unsigned int) curtime,
- val[0], val[1], val[2], val[3], val[4], val[5], val[6],
- val[7], val[8], val[9], val[10], val[11], val[12],
- val[13], val[14], val[15], val[16], val[17]);
+ if (fields_num != NFS4_SERVER40_NUM_PROC &&
+ fields_num != NFS4_SERVER41_NUM_PROC)
+ {
+ if (!suppress_warning)
+ {
+ WARNING ("nfs plugin: Unexpected number of fields for "
+ "NFSv4 %s statistics: %zu. ",
+ instance, fields_num);
+ }
+ if (fields_num > NFS4_SERVER_MAX_PROC)
+ {
+ fields_num = NFS4_SERVER_MAX_PROC;
+ suppress_warning = 1;
+ }
+ else
+ {
+ return (EINVAL);
+ }
+ }
- if (retval >= BUFSIZE)
- return;
- else if (retval < 0)
+ nfs_submit_fields (4, instance, fields,
+ nfs4_server40_procedures_names_num,
+ nfs4_server40_procedures_names);
+
+ if (fields_num >= NFS4_SERVER41_NUM_PROC)
{
- syslog (LOG_ERR, "nfs: snprintf's format failed: %s", strerror (errno));
- return;
+ fields += nfs4_server40_procedures_names_num;
+
+ nfs_submit_fields (4, instance, fields,
+ nfs4_server41_procedures_names_num,
+ nfs4_server41_procedures_names);
}
- plugin_submit ("nfs2_procedures", inst, buf);
+ return (0);
}
-void nfs3_procedures_submit (unsigned long long *val, char *inst)
+static int nfs_submit_nfs4_client (const char *instance, char **fields,
+ size_t fields_num)
{
- char buf[BUFSIZE];
- int retval = 0;
-
- retval = snprintf(buf, BUFSIZE, "%u:%llu:%llu:%llu:%llu:%llu:%llu:"
- "%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:"
- "%llu:%llu:%llu:%llu:%llu:%llu:%llu", /* 22x %llu */
- (unsigned int) curtime,
- val[0], val[1], val[2], val[3], val[4], val[5], val[6],
- val[7], val[8], val[9], val[10], val[11], val[12],
- val[13], val[14], val[15], val[16], val[17], val[18],
- val[19], val[20], val[21]);
-
- if (retval >= BUFSIZE)
- return;
- else if (retval < 0)
+ size_t proc40_names_num, proc41_names_num;
+
+ static int suppress_warning = 0;
+
+ switch (fields_num)
{
- syslog (LOG_ERR, "nfs: snprintf's format failed: %s", strerror (errno));
- return;
+ case 34:
+ case 35:
+ case 36:
+ case 37:
+ case 38:
+ /* 4.0-only configuration */
+ proc40_names_num = fields_num;
+ break;
+ case 40:
+ case 41:
+ proc40_names_num = 35;
+ break;
+ case 42:
+ case 44:
+ proc40_names_num = 36;
+ case 46:
+ case 47:
+ case 51:
+ case 53:
+ proc40_names_num = 37;
+ break;
+ case 54:
+ proc40_names_num = 38;
+ break;
+ default:
+ if (!suppress_warning)
+ {
+ WARNING ("nfs plugin: Unexpected number of "
+ "fields for NFSv4 %s "
+ "statistics: %zu. ",
+ instance, fields_num);
+ }
+
+ if (fields_num > 34)
+ {
+ /* safe fallback to basic nfs40 procedures */
+ fields_num = 34;
+ proc40_names_num = 34;
+
+ suppress_warning = 1;
+ }
+ else
+ {
+ return (EINVAL);
+ }
+ }
+
+ nfs_submit_fields (4, instance, fields, proc40_names_num,
+ nfs4_client40_procedures_names);
+
+ if (fields_num > proc40_names_num)
+ {
+ proc41_names_num = fields_num - proc40_names_num;
+ fields += proc40_names_num;
+
+ nfs_submit_fields (4, instance, fields,proc41_names_num,
+ nfs4_client41_procedures_names);
}
- plugin_submit("nfs3_procedures", inst, buf);
+ return (0);
}
-#if defined(KERNEL_LINUX)
-void nfs_read_stats_file (FILE *fh, char *inst)
+static void nfs_read_linux (FILE *fh, char *inst)
{
- char buffer[BUFSIZE];
+ char buffer[1024];
- char *fields[48];
- int numfields = 0;
+ char *fields[64];
+ int fields_num = 0;
if (fh == NULL)
return;
- while (fgets (buffer, BUFSIZE, fh) != NULL)
+ while (fgets (buffer, sizeof (buffer), fh) != NULL)
{
- numfields = strsplit (buffer, fields, 48);
+ fields_num = strsplit (buffer,
+ fields, STATIC_ARRAY_SIZE (fields));
- if (numfields < 2)
+ if (fields_num < 3)
continue;
- if (strncmp (fields[0], "proc2", 5) == 0)
+ if (strcmp (fields[0], "proc2") == 0)
{
- int i;
- unsigned long long *values;
-
- if (numfields - 2 != nfs2_procedures_ds_num)
- {
- syslog (LOG_WARNING, "nfs: Wrong number of fields (= %i) for NFS2 statistics.", numfields - 2);
- continue;
- }
-
- if ((values = (unsigned long long *) malloc (nfs2_procedures_ds_num * sizeof (unsigned long long))) == NULL)
- {
- syslog (LOG_ERR, "nfs: malloc: %s", strerror (errno));
- continue;
- }
-
- for (i = 0; i < nfs2_procedures_ds_num; i++)
- values[i] = atoll (fields[i + 2]);
-
- nfs2_procedures_submit (values, inst);
-
- free (values);
+ nfs_submit_fields_safe (/* version = */ 2, inst,
+ fields + 2, (size_t) (fields_num - 2),
+ nfs2_procedures_names,
+ nfs2_procedures_names_num);
}
else if (strncmp (fields[0], "proc3", 5) == 0)
{
- int i;
- unsigned long long *values;
+ nfs_submit_fields_safe (/* version = */ 3, inst,
+ fields + 2, (size_t) (fields_num - 2),
+ nfs3_procedures_names,
+ nfs3_procedures_names_num);
+ }
+ else if (strcmp (fields[0], "proc4ops") == 0)
+ {
+ if (inst[0] == 's')
+ nfs_submit_nfs4_server (inst, fields + 2,
+ (size_t) (fields_num - 2));
+ }
+ else if (strcmp (fields[0], "proc4") == 0)
+ {
+ if (inst[0] == 'c')
+ nfs_submit_nfs4_client (inst, fields + 2,
+ (size_t) (fields_num - 2));
+ }
+ } /* while (fgets) */
+} /* void nfs_read_linux */
+#endif /* KERNEL_LINUX */
- if (numfields - 2 != nfs3_procedures_ds_num)
- {
- syslog (LOG_WARNING, "nfs: Wrong number of fields (= %i) for NFS3 statistics.", numfields - 2);
- continue;
- }
+#if HAVE_LIBKSTAT
+static int nfs_read_kstat (kstat_t *ksp, int nfs_version, char *inst,
+ char const **proc_names, size_t proc_names_num)
+{
+ char plugin_instance[DATA_MAX_NAME_LEN];
+ value_t values[proc_names_num];
+ size_t i;
- if ((values = (unsigned long long *) malloc (nfs3_procedures_ds_num * sizeof (unsigned long long))) == NULL)
- {
- syslog (LOG_ERR, "nfs: malloc: %s", strerror (errno));
- continue;
- }
+ if (ksp == NULL)
+ return (EINVAL);
- for (i = 0; i < nfs3_procedures_ds_num; i++)
- values[i] = atoll (fields[i + 2]);
+ ssnprintf (plugin_instance, sizeof (plugin_instance), "v%i%s",
+ nfs_version, inst);
- nfs3_procedures_submit (values, inst);
+ kstat_read(kc, ksp, NULL);
+ for (i = 0; i < proc_names_num; i++)
+ {
+ /* The name passed to kstat_data_lookup() doesn't have the
+ * "const" modifier, so we need to copy the name here. */
+ char name[32];
+ sstrncpy (name, proc_names[i], sizeof (name));
- free (values);
- }
+ values[i].counter = (derive_t) get_kstat_value (ksp, name);
}
-}
-#endif /* defined(KERNEL_LINUX) */
-#undef BUFSIZE
-#ifdef HAVE_LIBKSTAT
-void nfs2_read_kstat (kstat_t *ksp, char *inst)
-{
- unsigned long long values[18];
-
- values[0] = get_kstat_value (ksp, "null");
- values[1] = get_kstat_value (ksp, "getattr");
- values[2] = get_kstat_value (ksp, "setattr");
- values[3] = get_kstat_value (ksp, "root");
- values[4] = get_kstat_value (ksp, "lookup");
- values[5] = get_kstat_value (ksp, "readlink");
- values[6] = get_kstat_value (ksp, "read");
- values[7] = get_kstat_value (ksp, "wrcache");
- values[8] = get_kstat_value (ksp, "write");
- values[9] = get_kstat_value (ksp, "create");
- values[10] = get_kstat_value (ksp, "remove");
- values[11] = get_kstat_value (ksp, "rename");
- values[12] = get_kstat_value (ksp, "link");
- values[13] = get_kstat_value (ksp, "symlink");
- values[14] = get_kstat_value (ksp, "mkdir");
- values[15] = get_kstat_value (ksp, "rmdir");
- values[16] = get_kstat_value (ksp, "readdir");
- values[17] = get_kstat_value (ksp, "statfs");
-
- nfs2_procedures_submit (values, inst);
+ nfs_procedures_submit (plugin_instance, proc_names, values,
+ proc_names_num);
+ return (0);
}
#endif
-#if NFS_HAVE_READ
-void nfs_read (void)
+#if KERNEL_LINUX
+static int nfs_read (void)
{
-#if defined(KERNEL_LINUX)
FILE *fh;
if ((fh = fopen ("/proc/net/rpc/nfs", "r")) != NULL)
{
- nfs_read_stats_file (fh, "client");
+ nfs_read_linux (fh, "client");
fclose (fh);
}
if ((fh = fopen ("/proc/net/rpc/nfsd", "r")) != NULL)
{
- nfs_read_stats_file (fh, "server");
+ nfs_read_linux (fh, "server");
fclose (fh);
}
-/* #endif defined(KERNEL_LINUX) */
-
-#elif defined(HAVE_LIBKSTAT)
- if (nfs2_ksp_client != NULL)
- nfs2_read_kstat (nfs2_ksp_client, "client");
- if (nfs2_ksp_server != NULL)
- nfs2_read_kstat (nfs2_ksp_server, "server");
-#endif /* defined(HAVE_LIBKSTAT) */
+ return (0);
}
-#endif /* NFS_HAVE_READ */
+/* #endif KERNEL_LINUX */
-void module_register (void)
+#elif HAVE_LIBKSTAT
+static int nfs_read (void)
{
- plugin_register (MODULE_NAME, nfs_init,
-#if NFS_HAVE_READ
- nfs_read,
-#else
- NULL,
-#endif
- NULL);
- plugin_register ("nfs2_procedures", NULL, NULL, nfs2_procedures_write);
- plugin_register ("nfs3_procedures", NULL, NULL, nfs3_procedures_write);
+ nfs_read_kstat (nfs2_ksp_client, /* version = */ 2, "client",
+ nfs2_procedures_names, nfs2_procedures_names_num);
+ nfs_read_kstat (nfs2_ksp_server, /* version = */ 2, "server",
+ nfs2_procedures_names, nfs2_procedures_names_num);
+ nfs_read_kstat (nfs3_ksp_client, /* version = */ 3, "client",
+ nfs3_procedures_names, nfs3_procedures_names_num);
+ nfs_read_kstat (nfs3_ksp_server, /* version = */ 3, "server",
+ nfs3_procedures_names, nfs3_procedures_names_num);
+ nfs_read_kstat (nfs4_ksp_client, /* version = */ 4, "client",
+ nfs4_procedures_names, nfs4_procedures_names_num);
+ nfs_read_kstat (nfs4_ksp_server, /* version = */ 4, "server",
+ nfs4_procedures_names, nfs4_procedures_names_num);
+
+ return (0);
}
+#endif /* HAVE_LIBKSTAT */
-#undef MODULE_NAME
+void module_register (void)
+{
+ plugin_register_init ("nfs", nfs_init);
+ plugin_register_read ("nfs", nfs_read);
+} /* void module_register */