This patch removes the calls to 'die' from set_sysfs and adds error
reporting: It now returns -1 with errno set. All callers of this
function are also updated to check for errors.

Signed-off-by: Andrew Price <[email protected]>
---
 gfs2/libgfs2/libgfs2.h |    2 +-
 gfs2/libgfs2/misc.c    |   20 ++++++++++----------
 gfs2/quota/check.c     |    8 ++++++--
 gfs2/quota/main.c      |   14 +++++++++++---
 gfs2/tool/misc.c       |   29 +++++++++++++++++++++++------
 gfs2/tool/tune.c       |    6 +++++-
 6 files changed, 56 insertions(+), 23 deletions(-)

diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 8ea23f5..a89c25c 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -635,7 +635,7 @@ extern char *find_debugfs_mount(void);
 extern char *mp2fsname(char *mp);
 extern char *get_sysfs(char *fsname, char *filename);
 extern unsigned int get_sysfs_uint(char *fsname, char *filename);
-extern void set_sysfs(char *fsname, char *filename, char *val);
+extern int set_sysfs(char *fsname, char *filename, char *val);
 extern int is_fsname(char *name);
 
 /* recovery.c */
diff --git a/gfs2/libgfs2/misc.c b/gfs2/libgfs2/misc.c
index 6cd9335..d5ce490 100644
--- a/gfs2/libgfs2/misc.c
+++ b/gfs2/libgfs2/misc.c
@@ -240,31 +240,31 @@ unsigned int get_sysfs_uint(char *fsname, char *filename)
        return x;
 }
 
-void set_sysfs(char *fsname, char *filename, char *val)
+int set_sysfs(char *fsname, char *filename, char *val)
 {
        char path[PATH_MAX];
        int fd, rv, len;
 
        len = strlen(val) + 1;
-       if (len > PAGE_SIZE)
-               die("value for %s is too larger for sysfs\n", path);
+       if (len > PAGE_SIZE) {
+               errno = EINVAL;
+               return -1;
+       }
 
        memset(path, 0, PATH_MAX);
        snprintf(path, PATH_MAX - 1, "%s/%s/%s", SYS_BASE, fsname, filename);
 
        fd = open(path, O_WRONLY);
        if (fd < 0)
-               die("can't open %s: %s\n", path, strerror(errno));
+               return -1;
 
        rv = write(fd, val, len);
-       if (rv != len){
-               if (rv < 0)
-                       die("can't write to %s: %s", path, strerror(errno));
-               else
-                       die("tried to write %d bytes to path, wrote %d\n",
-                           len, rv);
+       if (rv != len) {
+               close(fd);
+               return -1;
        }
        close(fd);
+       return 0;
 }
 
 /**
diff --git a/gfs2/quota/check.c b/gfs2/quota/check.c
index fdb3b42..1c577b1 100644
--- a/gfs2/quota/check.c
+++ b/gfs2/quota/check.c
@@ -502,8 +502,12 @@ set_list(struct gfs2_sbd *sdp, commandline_t *comline, int 
user,
                /* Write the id to sysfs quota refresh file to refresh gfs 
quotas */
                fs = mp2fsname(comline->filesystem);
                sprintf(id_str, "%d", comline->id);
-               set_sysfs(fs, (user) ? "quota_refresh_user" :
-                         "quota_refresh_group", id_str);
+               if (set_sysfs(fs, (user) ? "quota_refresh_user" : 
"quota_refresh_group",
+                                       id_str)) {
+                       fprintf(stderr, "Error writing id to sysfs quota 
refresh file: %s\n",
+                                       strerror(errno));
+                       exit(-1);
+               }
        }
 
 out:
diff --git a/gfs2/quota/main.c b/gfs2/quota/main.c
index 544c793..5cdf118 100644
--- a/gfs2/quota/main.c
+++ b/gfs2/quota/main.c
@@ -771,7 +771,11 @@ do_sync_one(struct gfs2_sbd *sdp, char *filesystem)
        char *fsname;
 
        fsname = mp2fsname(filesystem);
-       set_sysfs(fsname, "quota_sync", "1");
+       if (set_sysfs(fsname, "quota_sync", "1")) {
+               fprintf(stderr, "Error writing to sysfs quota sync file: %s\n",
+                               strerror(errno));
+               exit(-1);
+       }
 }
 
 /**
@@ -973,8 +977,12 @@ do_set(struct gfs2_sbd *sdp, commandline_t *comline)
 
        fs = mp2fsname(comline->filesystem);
        sprintf(id_str, "%d", comline->id);
-       set_sysfs(fs, comline->id_type == GQ_ID_USER ?
-                 "quota_refresh_user" : "quota_refresh_group", id_str);
+       if (set_sysfs(fs, comline->id_type == GQ_ID_USER ?
+                 "quota_refresh_user" : "quota_refresh_group", id_str)) {
+               fprintf(stderr, "Error writing to sysfs quota refresh file: 
%s\n",
+                               strerror(errno));
+               exit(-1);
+       }
        
        if (adj_flag)
                adjust_quota_list(fd, comline);
diff --git a/gfs2/tool/misc.c b/gfs2/tool/misc.c
index 44e5126..2e57cd1 100644
--- a/gfs2/tool/misc.c
+++ b/gfs2/tool/misc.c
@@ -41,10 +41,19 @@ do_freeze(int argc, char **argv)
 
        name = mp2fsname(argv[optind]);
 
-       if (strcmp(command, "freeze") == 0)
-               set_sysfs(name, "freeze", "1");
-       else if (strcmp(command, "unfreeze") == 0)
-               set_sysfs(name, "freeze", "0");
+       if (strcmp(command, "freeze") == 0) {
+               if (set_sysfs(name, "freeze", "1")) {
+                       fprintf(stderr, "Error writing to sysfs freeze file: 
%s\n",
+                                       strerror(errno));
+                       exit(-1);
+               }
+       } else if (strcmp(command, "unfreeze") == 0) {
+               if (set_sysfs(name, "freeze", "0")) {
+                       fprintf(stderr, "Error writing to sysfs freeze file: 
%s\n",
+                                       strerror(errno));
+                       exit(-1);
+               }
+       }
 
        sync();
 }
@@ -387,7 +396,11 @@ do_shrink(int argc, char **argv)
        }
        fs = mp2fsname(argv[optind]);
        
-       set_sysfs(fs, "shrink", "1");
+       if (set_sysfs(fs, "shrink", "1")) {
+               fprintf(stderr, "Error writing to sysfs shrink file: %s\n",
+                               strerror(errno));
+               exit(-1);
+       }
 }
 
 /**
@@ -417,6 +430,10 @@ do_withdraw(int argc, char **argv)
        }
        name = mp2fsname(argv[optind]);
 
-       set_sysfs(name, "withdraw", "1");
+       if (set_sysfs(name, "withdraw", "1")) {
+               fprintf(stderr, "Error writing to sysfs withdraw file: %s\n",
+                               strerror(errno));
+               exit(-1);
+       }
 }
 
diff --git a/gfs2/tool/tune.c b/gfs2/tool/tune.c
index 6a8dcda..b4b24d8 100644
--- a/gfs2/tool/tune.c
+++ b/gfs2/tool/tune.c
@@ -118,5 +118,9 @@ set_tune(int argc, char **argv)
                sprintf(buf, "%u %u", (unsigned int)(s * 10000.0 + 0.5), 10000);
                value = buf;
        }
-       set_sysfs(fs, strcat(tune_base, param), value);
+       if (set_sysfs(fs, strcat(tune_base, param), value)) {
+               fprintf(stderr, "Error writing to sysfs %s tune file: %s\n",
+                               param, strerror(errno));
+               exit(-1);
+       }
 }
-- 
1.5.6.5

Reply via email to