From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v2] libgfs2: Remove 'die' calls from __get_sysfs
Date: Thu, 19 Mar 2009 16:21:00 +0000 [thread overview]
Message-ID: <1237479660.9571.957.camel@quoit> (raw)
In-Reply-To: <1237479404-5009-1-git-send-email-andy@andrewprice.me.uk>
Hi,
Ok, that looks good now,
Steve.
On Thu, 2009-03-19 at 16:16 +0000, Andrew Price wrote:
> This patch removes the calls to die from __get_sysfs and adds error
> handling to it and its callers. To enable this, the prototype of
> get_sysfs_uint had to be changed so that error status can be returned.
> Callers to get_sysfs and get_sysfs_uint are also updated to handle error
> cases where appropriate.
>
> Signed-off-by: Andrew Price <andy@andrewprice.me.uk>
> ---
> Thanks for the comments on the previous version, I'm glad one of us is wide
> awake today :-)
>
> gfs2/libgfs2/libgfs2.h | 2 +-
> gfs2/libgfs2/misc.c | 43 +++++++++++++++++++++++++++++++++----------
> gfs2/tool/df.c | 44 +++++++++++++++++++++++++++++++-------------
> gfs2/tool/tune.c | 10 ++++++++--
> 4 files changed, 73 insertions(+), 26 deletions(-)
>
> diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
> index 2e79ad4..d8faf45 100644
> --- a/gfs2/libgfs2/libgfs2.h
> +++ b/gfs2/libgfs2/libgfs2.h
> @@ -634,7 +634,7 @@ extern char *find_debugfs_mount(void);
> extern char *mp2fsname(char *mp);
> extern char *mp2fsname2(char *devname);
> extern char *get_sysfs(char *fsname, char *filename);
> -extern unsigned int get_sysfs_uint(char *fsname, char *filename);
> +extern int get_sysfs_uint(char *fsname, char *filename, unsigned int *val);
> extern int set_sysfs(char *fsname, char *filename, char *val);
> extern int is_fsname(char *name);
>
> diff --git a/gfs2/libgfs2/misc.c b/gfs2/libgfs2/misc.c
> index 320ce84..60b2d4f 100644
> --- a/gfs2/libgfs2/misc.c
> +++ b/gfs2/libgfs2/misc.c
> @@ -216,10 +216,12 @@ static char *__get_sysfs(char *fsname, char *filename)
>
> fd = open(path, O_RDONLY);
> if (fd < 0)
> - die("can't open %s: %s\n", path, strerror(errno));
> + return NULL;
> rv = read(fd, sysfs_buf, PAGE_SIZE);
> - if (rv < 0)
> - die("can't read from %s: %s\n", path, strerror(errno));
> + if (rv < 0) {
> + close(fd);
> + return NULL;
> + }
>
> close(fd);
> return sysfs_buf;
> @@ -227,17 +229,30 @@ static char *__get_sysfs(char *fsname, char *filename)
>
> char *get_sysfs(char *fsname, char *filename)
> {
> - char *p = strchr(__get_sysfs(fsname, filename), '\n');
> + char *s;
> + char *p;
> +
> + s = __get_sysfs(fsname, filename);
> + if (!s)
> + return NULL;
> + p = strchr(s, '\n');
> if (p)
> *p = '\0';
> return sysfs_buf;
> }
>
> -unsigned int get_sysfs_uint(char *fsname, char *filename)
> +int get_sysfs_uint(char *fsname, char *filename, unsigned int *val)
> {
> - unsigned int x;
> - sscanf(__get_sysfs(fsname, filename), "%u", &x);
> - return x;
> + char *s = __get_sysfs(fsname, filename);
> + int ret;
> + if (!s)
> + return -1;
> + ret = sscanf(s, "%u", val);
> + if (1 != ret) {
> + errno = ENOMSG;
> + return -1;
> + }
> + return 0;
> }
>
> int set_sysfs(char *fsname, char *filename, char *val)
> @@ -313,6 +328,7 @@ mp2fsname2(char *mp)
> char buffer[PATH_MAX], device_name[PATH_MAX];
> int fsdump, fspass, ret, found = 0;
> char fspath[PATH_MAX], fsoptions[PATH_MAX], fstype[80];
> + char *id;
>
> /* Take care of trailing '/' */
> if (mp[strlen(mp) - 1] == '/')
> @@ -361,7 +377,10 @@ mp2fsname2(char *mp)
> if (de->d_name[0] == '.')
> continue;
>
> - if (strcmp(get_sysfs(de->d_name, "id"), device_id) == 0) {
> + id = get_sysfs(de->d_name, "id");
> + if (!id)
> + continue;
> + if (strcmp(id, device_id) == 0) {
> fsname = strdup(de->d_name);
> break;
> }
> @@ -399,6 +418,7 @@ char *mp2fsname(char *mp)
> struct stat statbuf;
> DIR *d;
> struct dirent *de;
> + char *id;
>
> if (stat(mp, &statbuf))
> return NULL;
> @@ -415,7 +435,10 @@ char *mp2fsname(char *mp)
> if (de->d_name[0] == '.')
> continue;
>
> - if (strcmp(get_sysfs(de->d_name, "id"), device_id) == 0) {
> + id = get_sysfs(de->d_name, "id");
> + if (!id)
> + continue;
> + if (strcmp(id, device_id) == 0) {
> fsname = strdup(de->d_name);
> break;
> }
> diff --git a/gfs2/tool/df.c b/gfs2/tool/df.c
> index 7d2875d..c817813 100644
> --- a/gfs2/tool/df.c
> +++ b/gfs2/tool/df.c
> @@ -147,22 +147,40 @@ do_df_one(char *path)
> printf(" Block size = %u\n", sbd.sd_sb.sb_bsize);
> printf(" Journals = %u\n", journals);
> printf(" Resource Groups = %"PRIu64"\n", rgrps);
> - printf(" Mounted lock proto = \"%s\"\n",
> - ((value = get_sysfs(fs, "args/lockproto"))[0])
> - ? value : sbd.sd_sb.sb_lockproto);
> - printf(" Mounted lock table = \"%s\"\n",
> - ((value = get_sysfs(fs, "args/locktable"))[0])
> - ? value : sbd.sd_sb.sb_locktable);
> + value = get_sysfs(fs, "args/lockproto");
> + if (value)
> + printf(" Mounted lock proto = \"%s\"\n",
> + value[0] ? value : sbd.sd_sb.sb_lockproto);
> + else
> + printf(" Mounted lock proto = (Not found: %s)\n",
> + strerror(errno));
> +
> + value = get_sysfs(fs, "args/locktable");
> + if (value)
> + printf(" Mounted lock table = \"%s\"\n",
> + value[0] ? value : sbd.sd_sb.sb_locktable);
> + else
> + printf(" Mounted lock table = (Not found: %s)\n",
> + strerror(errno));
> +
> printf(" Mounted host data = \"%s\"\n",
> get_sysfs(fs, "args/hostdata"));
> printf(" Journal number = %s\n", get_sysfs(fs, "lockstruct/jid"));
> - flags = get_sysfs_uint(fs, "lockstruct/flags");
> - printf(" Lock module flags = %x", flags);
> - printf("\n");
> - printf(" Local flocks = %s\n",
> - (get_sysfs_uint(fs, "args/localflocks")) ? "TRUE" : "FALSE");
> - printf(" Local caching = %s\n",
> - (get_sysfs_uint(fs, "args/localcaching")) ? "TRUE" : "FALSE");
> +
> + if (get_sysfs_uint(fs, "lockstruct/flags", &flags))
> + printf(" Lock module flags = (Not found: %s)\n", strerror(errno));
> + else
> + printf(" Lock module flags = %x\n", flags);
> +
> + if (get_sysfs_uint(fs, "args/localflocks", &flags))
> + printf(" Lock flocks = (Not found: %s)\n", strerror(errno));
> + else
> + printf(" Local flocks = %s\n", flags ? "TRUE" : "FALSE");
> +
> + if (get_sysfs_uint(fs, "args/localcaching", &flags))
> + printf(" Lock caching = (Not found: %s)\n", strerror(errno));
> + else
> + printf(" Local caching = %s\n", flags ? "TRUE" : "FALSE");
>
> /* Read the master statfs file */
> if (mount_gfs2_meta(&sbd)) {
> diff --git a/gfs2/tool/tune.c b/gfs2/tool/tune.c
> index b4b24d8..29c529b 100644
> --- a/gfs2/tool/tune.c
> +++ b/gfs2/tool/tune.c
> @@ -39,6 +39,7 @@ get_tune(int argc, char **argv)
> double ratio;
> unsigned int num, den;
> struct gfs2_sbd sbd;
> + char *value;
>
> if (optind == argc)
> die("Usage: gfs2_tool gettune <mountpoint>\n");
> @@ -65,8 +66,13 @@ get_tune(int argc, char **argv)
> continue;
> snprintf(path, PATH_MAX - 1, "tune/%s", de->d_name);
> if (strcmp(de->d_name, "quota_scale") == 0) {
> - sscanf(get_sysfs(fs, "tune/quota_scale"), "%u %u",
> - &num, &den);
> + value = get_sysfs(fs, "tune/quota_scale");
> + if (!value) {
> + printf("quota_scale = (Not found: %s)\n",
> + strerror(errno));
> + continue;
> + }
> + sscanf(value, "%u %u", &num, &den);
> ratio = (double)num / den;
> printf("quota_scale = %.4f (%u, %u)\n", ratio, num,
> den);
prev parent reply other threads:[~2009-03-19 16:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-19 15:30 [Cluster-devel] [PATCH] libgfs2: Remove 'die' calls from __get_sysfs Andrew Price
2009-03-19 15:41 ` Steven Whitehouse
2009-03-19 16:16 ` [Cluster-devel] [PATCH v2] " Andrew Price
2009-03-19 16:21 ` Steven Whitehouse [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1237479660.9571.957.camel@quoit \
--to=swhiteho@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.