CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: [EMAIL PROTECTED] 2007-11-13 17:06:33
Modified files: gfs2/edit : hexedit.h gfs2/fsck : initialize.c util.h gfs2/libgfs2 : buf.c libgfs2.h misc.c gfs2/mkfs : gfs2_mkfs.h gfs2/quota : check.c gfs2_quota.h main.c gfs2/tool : Makefile gfs2_tool.h main.c sb.c Removed files: gfs2/tool : util.c Log message: Resolves: bz 364741: GFS2: gfs2_quota doesn't work unless lock table specified Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.4&r2=1.4.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/initialize.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.6.2.4&r2=1.6.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/util.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2&r2=1.2.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/buf.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3&r2=1.3.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/libgfs2.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.7.2.14&r2=1.7.2.15 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/misc.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.3&r2=1.2.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/gfs2_mkfs.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.9&r2=1.9.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/quota/check.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.4&r2=1.2.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/quota/gfs2_quota.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.4&r2=1.1.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/quota/main.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.6&r2=1.2.2.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.1&r2=1.5.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/gfs2_tool.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.4&r2=1.5.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/main.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.2&r2=1.4.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/sb.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.2.2.1&r2=1.2.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/tool/util.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.3&r2=NONE --- cluster/gfs2/edit/hexedit.h 2007/10/11 20:32:35 1.4.2.4 +++ cluster/gfs2/edit/hexedit.h 2007/11/13 17:06:32 1.4.2.5 @@ -178,31 +178,6 @@ #define SCREEN_HEIGHT (16) #define SCREEN_WIDTH (16) -/* I/O macros */ - -#define do_lseek(fd, off) \ -{ \ - if (lseek((fd), (off), SEEK_SET) != (off)) \ - die("bad seek: %s on line %d of file %s\n", \ - strerror(errno),__LINE__, __FILE__); \ -} - -#define do_read(fd, buff, len) \ -{ \ - if (read((fd), (buff), (len)) != (len)) \ - die("bad read: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} - -#define do_write(fd, buff, len) \ -{ \ - if (write((fd), (buff), (len)) != (len)) \ - die("bad write: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} - - - /* Memory macros */ #define type_zalloc(ptr, type, count) \ --- cluster/gfs2/fsck/initialize.c 2007/10/19 15:07:58 1.6.2.4 +++ cluster/gfs2/fsck/initialize.c 2007/11/13 17:06:32 1.6.2.5 @@ -169,7 +169,7 @@ last_data_block = rmax; first_data_block = rmin; - if(do_lseek(sdp->device_fd, (last_fs_block * sdp->sd_sb.sb_bsize))){ + if(fsck_lseek(sdp->device_fd, (last_fs_block * sdp->sd_sb.sb_bsize))){ log_crit("Can't seek to last block in file system: %" PRIu64" (0x%" PRIx64 ")\n", last_fs_block, last_fs_block); goto fail; --- cluster/gfs2/fsck/util.h 2006/06/06 14:49:31 1.2 +++ cluster/gfs2/fsck/util.h 2007/11/13 17:06:32 1.2.2.1 @@ -16,16 +16,9 @@ #include "libgfs2.h" -#define do_lseek(fd, off) \ +#define fsck_lseek(fd, off) \ ((lseek((fd), (off), SEEK_SET) == (off)) ? 0 : -1) -#define do_read(fd, buff, len) \ - ((read((fd), (buff), (len)) == (len)) ? 0 : -1) - -#define do_write(fd, buff, len) \ - ((write((fd), (buff), (len)) == (len)) ? 0 : -1) - - int compute_height(struct gfs2_sbd *sdp, uint64_t sz); struct di_info *search_list(osi_list_t *list, uint64_t addr); void warm_fuzzy_stuff(uint64_t block); --- cluster/gfs2/libgfs2/buf.c 2006/06/08 21:02:15 1.3 +++ cluster/gfs2/libgfs2/buf.c 2007/11/13 17:06:32 1.3.2.1 @@ -25,27 +25,6 @@ #include "libgfs2.h" -#define do_lseek(sdp, off) \ -do { \ - if (lseek((sdp)->device_fd, (off), SEEK_SET) != (off)) \ - die("bad seek: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} while (0) - -#define do_read(sdp, buf, len) \ -do { \ - if (read((sdp)->device_fd, (buf), (len)) != (len)) \ - die("bad read: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} while (0) - -#define do_write(sdp, buf, len) \ -do { \ - if (write((sdp)->device_fd, (buf), (len)) != (len)) \ - die("bad write: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} while (0) - static __inline__ osi_list_t * blkno2head(struct gfs2_sbd *sdp, uint64_t blkno) { @@ -59,8 +38,8 @@ osi_list_del(&bh->b_hash); sdp->num_bufs--; if (bh->b_changed) { - do_lseek(sdp, bh->b_blocknr * sdp->bsize); - do_write(sdp, bh->b_data, sdp->bsize); + do_lseek(sdp->device_fd, bh->b_blocknr * sdp->bsize); + do_write(sdp->device_fd, bh->b_data, sdp->bsize); sdp->writes++; } free(bh); @@ -126,8 +105,8 @@ bh->b_data = (char *)bh + sizeof(struct gfs2_buffer_head); bh->b_size = sdp->bsize; if (read_disk) { - do_lseek(sdp, num * sdp->bsize); - do_read(sdp, bh->b_data, sdp->bsize); + do_lseek(sdp->device_fd, num * sdp->bsize); + do_read(sdp->device_fd, bh->b_data, sdp->bsize); } add_buffer(sdp, bh); bh->b_changed = FALSE; @@ -196,8 +175,8 @@ if (!bh->b_count) /* if not reserved for later */ write_buffer(sdp, bh); /* write the data, free the memory */ else if (bh->b_changed) { /* if buffer has changed */ - do_lseek(sdp, bh->b_blocknr * sdp->bsize); - do_write(sdp, bh->b_data, sdp->bsize); /* write it out */ + do_lseek(sdp->device_fd, bh->b_blocknr * sdp->bsize); + do_write(sdp->device_fd, bh->b_data, sdp->bsize); /* write it out */ bh->b_changed = FALSE; /* no longer changed */ } } --- cluster/gfs2/libgfs2/libgfs2.h 2007/10/19 15:07:59 1.7.2.14 +++ cluster/gfs2/libgfs2/libgfs2.h 2007/11/13 17:06:32 1.7.2.15 @@ -40,6 +40,27 @@ exit(EXIT_FAILURE); \ } while (0) +#define do_lseek(fd, off) \ +{ \ + if (lseek((fd), (off), SEEK_SET) != (off)) \ + die("bad seek: %s on line %d of file %s\n", \ + strerror(errno),__LINE__, __FILE__); \ +} + +#define do_read(fd, buff, len) \ +{ \ + if (read((fd), (buff), (len)) < 0) \ + die("bad read: %s on line %d of file %s\n", \ + strerror(errno), __LINE__, __FILE__); \ +} + +#define do_write(fd, buff, len) \ +{ \ + if (write((fd), (buff), (len)) != (len)) \ + die("bad write: %s on line %d of file %s\n", \ + strerror(errno), __LINE__, __FILE__); \ +} + #define zalloc(ptr, size) \ do { \ (ptr) = malloc((size)); \ @@ -507,6 +528,8 @@ const char *format, ...); /* misc.c */ +#define SYS_BASE "/sys/fs/gfs2" + void compute_constants(struct gfs2_sbd *sdp); int find_gfs2_meta(struct gfs2_sbd *sdp); int dir_exists(const char *dir); @@ -514,6 +537,20 @@ void mount_gfs2_meta(struct gfs2_sbd *sdp); void lock_for_admin(struct gfs2_sbd *sdp); void cleanup_metafs(struct gfs2_sbd *sdp); +char *get_list(void); +char **str2lines(char *str); +char *find_debugfs_mount(void); +char *mp2fsname(char *mp); +char *name2value(char *str, char *name); +uint32_t name2u32(char *str, char *name); +uint64_t name2u64(char *str, char *name); +char *__get_sysfs(char *fsname, char *filename); +char *get_sysfs(char *fsname, char *filename); +unsigned int get_sysfs_uint(char *fsname, char *filename); +void set_sysfs(char *fsname, char *filename, char *val); +char *do_basename(char *device); +char *mp2devname(char *mp); +int is_fsname(char *name); /* recovery.c */ void gfs2_replay_incr_blk(struct gfs2_inode *ip, unsigned int *blk); --- cluster/gfs2/libgfs2/misc.c 2007/10/25 14:14:47 1.2.2.3 +++ cluster/gfs2/libgfs2/misc.c 2007/11/13 17:06:32 1.2.2.4 @@ -25,9 +25,15 @@ #include <sys/mount.h> #include <linux/types.h> #include <sys/file.h> +#include <dirent.h> +#include <linux/kdev_t.h> #include "libgfs2.h" +#define PAGE_SIZE (4096) + +static char sysfs_buf[PAGE_SIZE]; + void compute_constants(struct gfs2_sbd *sdp) { @@ -275,3 +281,432 @@ } } +char *__get_sysfs(char *fsname, char *filename) +{ + char path[PATH_MAX]; + int fd, rv; + + memset(path, 0, PATH_MAX); + memset(sysfs_buf, 0, PAGE_SIZE); + snprintf(path, PATH_MAX - 1, "%s/%s/%s", SYS_BASE, fsname, filename); + + fd = open(path, O_RDONLY); + if (fd < 0) + die("can't open %s: %s\n", path, strerror(errno)); + rv = read(fd, sysfs_buf, PAGE_SIZE); + if (rv < 0) + die("can't read from %s: %s\n", path, strerror(errno)); + + close(fd); + return sysfs_buf; +} + +char * +get_sysfs(char *fsname, char *filename) +{ + char *p = strchr(__get_sysfs(fsname, filename), '\n'); + if (p) + *p = '\0'; + return sysfs_buf; +} + +unsigned int +get_sysfs_uint(char *fsname, char *filename) +{ + unsigned int x; + sscanf(__get_sysfs(fsname, filename), "%u", &x); + return x; +} + +void +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); + + 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)); + + 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); + } + close(fd); +} + +/** + * get_list - Get the list of GFS2 filesystems + * + * Returns: a NULL terminated string + */ + +#define LIST_SIZE 1048576 + +char * +get_list(void) +{ + char path[PATH_MAX]; + char s_id[PATH_MAX]; + char *list, *p; + int rv, fd, x = 0, total = 0; + DIR *d; + struct dirent *de; + + list = malloc(LIST_SIZE); + if (!list) + die("out of memory\n"); + + memset(path, 0, PATH_MAX); + snprintf(path, PATH_MAX, "%s", SYS_BASE); + + d = opendir(path); + if (!d) + die("can't open %s: %s\n", SYS_BASE, strerror(errno)); + + while ((de = readdir(d))) { + if (de->d_name[0] == '.') + continue; + + memset(path, 0, PATH_MAX); + snprintf(path, PATH_MAX, "%s/%s/id", SYS_BASE, de->d_name); + + fd = open(path, O_RDONLY); + if (fd < 0) + die("can't open %s: %s\n", path, strerror(errno)); + + memset(s_id, 0, PATH_MAX); + + rv = read(fd, s_id, sizeof(s_id)); + if (rv < 0) + die("can't read %s: %s\n", path, strerror(errno)); + + close(fd); + + p = strstr(s_id, "\n"); + if (p) + *p = '\0'; + + total += strlen(s_id) + strlen(de->d_name) + 2; + if (total > LIST_SIZE) + break; + + x += sprintf(list + x, "%s %s\n", s_id, de->d_name); + + } + + closedir(d); + + return list; +} + +/** + * str2lines - parse a string into lines + * @list: the list + * + * Returns: An array of character pointers + */ + +char ** +str2lines(char *str) +{ + char *p; + unsigned int n = 0; + char **lines; + unsigned int x = 0; + + for (p = str; *p; p++) + if (*p == '\n') + n++; + + lines = malloc((n + 1) * sizeof(char *)); + if (!lines) + die("out of memory\n"); + + for (lines[x] = p = str; *p; p++) + if (*p == '\n') { + *p = 0; + lines[++x] = p + 1; + } + + return lines; +} + +/** + * do_basename - Create dm-N style name for the device + * @device: + * + * Returns: Pointer to dm name or basename + */ + +char * +do_basename(char *device) +{ + FILE *file; + int found = FALSE; + char line[PATH_MAX], major_name[PATH_MAX]; + unsigned int major_number; + struct stat st; + + file = fopen("/proc/devices", "r"); + if (!file) + goto punt; + + while (fgets(line, PATH_MAX, file)) { + if (sscanf(line, "%u %s", &major_number, major_name) != 2) + continue; + if (strcmp(major_name, "device-mapper") != 0) + continue; + found = TRUE; + break; + } + + fclose(file); + + if (!found) + goto punt; + + if (stat(device, &st)) + goto punt; + if (major(st.st_rdev) == major_number) { + static char realname[16]; + snprintf(realname, 16, "dm-%u", minor(st.st_rdev)); + return realname; + } + + punt: + return basename(device); +} + +char * +mp2devname(char *mp) +{ + FILE *file; + char line[PATH_MAX]; + static char device[PATH_MAX]; + char *name = NULL; + char *realname; + + realname = realpath(mp, NULL); + if (!realname) + die("Unable to allocate memory for name resolution.\n"); + file = fopen("/proc/mounts", "r"); + if (!file) + die("can't open /proc/mounts: %s\n", strerror(errno)); + + while (fgets(line, PATH_MAX, file)) { + char path[PATH_MAX], type[PATH_MAX]; + + if (sscanf(line, "%s %s %s", device, path, type) != 3) + continue; + if (strcmp(path, realname)) + continue; + if (strcmp(type, "gfs2")) + die("%s is not a GFS2 filesystem\n", mp); + + name = do_basename(device); + + break; + } + + free(realname); + fclose(file); + + return name; +} + +char * +find_debugfs_mount(void) +{ + FILE *file; + char line[PATH_MAX]; + char device[PATH_MAX], type[PATH_MAX]; + char *path; + + file = fopen("/proc/mounts", "rt"); + if (!file) + die("can't open /proc/mounts: %s\n", strerror(errno)); + + path = malloc(PATH_MAX); + if (!path) + die("Can't allocate memory for debugfs.\n"); + while (fgets(line, PATH_MAX, file)) { + + if (sscanf(line, "%s %s %s", device, path, type) != 3) + continue; + if (!strcmp(type, "debugfs")) { + fclose(file); + return path; + } + } + + free(path); + fclose(file); + return NULL; +} + +/* The fsname can be substituted for the mountpoint on the command line. + This is necessary when we can't resolve a devname from /proc/mounts + to a fsname. */ + +int is_fsname(char *name) +{ + int rv = 0; + DIR *d; + struct dirent *de; + + d = opendir(SYS_BASE); + if (!d) + die("can't open %s: %s\n", SYS_BASE, strerror(errno)); + + while ((de = readdir(d))) { + if (de->d_name[0] == '.') + continue; + + if (strcmp(de->d_name, name) == 0) { + rv = 1; + break; + } + } + + closedir(d); + + return rv; +} + +/** + * mp2fsname - Find the name for a filesystem given its mountpoint + * + * We do this by iterating through gfs2 dirs in /sys/fs/gfs2/ looking for + * one where the "id" attribute matches the device id returned by stat for + * the mount point. The reason we go through all this is simple: the + * kernel's sysfs is named after the VFS s_id, not the device name. + * So it's perfectly legal to do something like this to simulate user + * conditions without the proper hardware: + * # rm /dev/sdb1 + * # mkdir /dev/cciss + * # mknod /dev/cciss/c0d0p1 b 8 17 + * # mount -tgfs2 /dev/cciss/c0d0p1 /mnt/gfs2 + * # gfs2_tool gettune /mnt/gfs2 + * In this example the tuning variables are in a directory named after the + * VFS s_id, which in this case would be /sys/fs/gfs2/sdb1/ + * + * Returns: the fsname + */ + +char * +mp2fsname(char *mp) +{ + char device_id[PATH_MAX], *fsname = NULL; + struct stat statbuf; + DIR *d; + struct dirent *de; + + if (stat(mp, &statbuf)) + return NULL; + + memset(device_id, 0, sizeof(device_id)); + sprintf(device_id, "%u:%u", (uint32_t)MAJOR(statbuf.st_dev), + (uint32_t)MINOR(statbuf.st_dev)); + + d = opendir(SYS_BASE); + if (!d) + die("can't open %s: %s\n", SYS_BASE, strerror(errno)); + + while ((de = readdir(d))) { + if (de->d_name[0] == '.') + continue; + + if (strcmp(get_sysfs(de->d_name, "id"), device_id) == 0) { + fsname = strdup(de->d_name); + break; + } + } + + closedir(d); + + return fsname; +} + +/** + * name2value - find the value of a name-value pair in a string + * @str_in: + * @name: + * + * Returns: the value string in a static buffer + */ + +char * +name2value(char *str_in, char *name) +{ + char str[strlen(str_in) + 1]; + static char value[PATH_MAX]; + char **lines; + unsigned int x; + unsigned int len = strlen(name); + + strcpy(str, str_in); + value[0] = 0; + + lines = str2lines(str); + + for (x = 0; *lines[x]; x++) + if (memcmp(lines[x], name, len) == 0 && + lines[x][len] == ' ') { + strcpy(value, lines[x] + len + 1); + break; + } + + free(lines); + + return value; +} + +/** + * name2u32 - find the value of a name-value pair in a string + * @str_in: + * @name: + * + * Returns: the value uint32 + */ + +uint32_t +name2u32(char *str, char *name) +{ + char *value = name2value(str, name); + uint32_t x = 0; + + sscanf(value, "%u", &x); + + return x; +} + +/** + * name2u64 - find the value of a name-value pair in a string + * @str_in: + * @name: + * + * Returns: the value uint64 + */ + +uint64_t +name2u64(char *str, char *name) +{ + char *value = name2value(str, name); + uint64_t x = 0; + + sscanf(value, "%"SCNu64, &x); + + return x; +} --- cluster/gfs2/mkfs/gfs2_mkfs.h 2006/10/26 18:42:25 1.9 +++ cluster/gfs2/mkfs/gfs2_mkfs.h 2007/11/13 17:06:33 1.9.2.1 @@ -35,46 +35,6 @@ /* main_shrink */ void main_shrink(int argc, char *argv[]); -static inline int __do_read(int fd, char *buff, size_t len, - const char *file, int line) -{ - int ret = read(fd, buff, len); - if (ret < 0) { - die("bad read: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return ret; -} - -#define do_read(fd, buf, len) \ - __do_read((fd), (buf), (len), __FILE__, __LINE__) - -static inline int __do_write(int fd, char *buff, size_t len, - const char *file, int line) -{ - int ret = write(fd, buff, len); - if (ret != len) { - die("bad write: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return ret; -} - -#define do_write(fd, buf, len) \ - __do_write((fd), (buf), (len), __FILE__, __LINE__) - -static inline int __do_lseek(int fd, off_t off, const char *file, int line) -{ - if (lseek(fd, off, SEEK_SET) != off) { - die("bad seek: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return 0; -} - -#define do_lseek(fd, off) \ - __do_lseek((fd), (off), __FILE__, __LINE__) - /* * The following inode IOCTL macros and inode flags * are copied from linux/fs.h, because we have duplicate --- cluster/gfs2/quota/check.c 2007/08/24 06:08:21 1.2.2.4 +++ cluster/gfs2/quota/check.c 2007/11/13 17:06:33 1.2.2.5 @@ -455,15 +455,15 @@ set_list(struct gfs2_sbd *sdp, commandline_t *comline, int user, osi_list_t *list, int64_t multiplier) { - int fd, fd1; + int fd; osi_list_t *tmp; values_t *v; uint64_t offset; int64_t value; int error; char quota_file[BUF_SIZE]; - char sys_q_refresh[BUF_SIZE]; char id_str[16]; + char *fs; strcpy(sdp->path_name, comline->filesystem); check_for_gfs2(sdp); @@ -503,27 +503,10 @@ } /* Write the id to sysfs quota refresh file to refresh gfs quotas */ - sprintf(sys_q_refresh, "%s%s%s", "/sys/fs/gfs2/", - sdp->sd_sb.sb_locktable, - (user) ? "/quota_refresh_user" : - "/quota_refresh_group"); - - fd1 = open(sys_q_refresh, O_WRONLY); - if (fd1 < 0) { - fprintf(stderr, "can't open file %s: %s\n", - sys_q_refresh, strerror(errno)); - goto out; - } - + fs = mp2fsname(comline->filesystem); sprintf(id_str, "%d", comline->id); - - if (write(fd1,(void*)id_str, strlen(id_str)) != strlen(id_str)) { - close(fd1); - fprintf(stderr, "failed to write to %s: %s\n", - sys_q_refresh, strerror(errno)); - goto out; - } - close(fd1); + set_sysfs(fs, (user) ? "quota_refresh_user" : + "quota_refresh_group", id_str); } out: --- cluster/gfs2/quota/gfs2_quota.h 2007/08/24 06:08:21 1.1.2.4 +++ cluster/gfs2/quota/gfs2_quota.h 2007/11/13 17:06:33 1.1.2.5 @@ -18,21 +18,6 @@ #include "linux_endian.h" #include <linux/gfs2_ondisk.h> -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#define die(fmt, args...) \ -do { \ - fprintf(stderr, "%s: ", prog_name); \ - fprintf(stderr, fmt, ##args); \ - exit(EXIT_FAILURE); \ -} while (0) - #define type_zalloc(ptr, type, count) \ do { \ (ptr) = (type *)malloc(sizeof(type) * (count)); \ @@ -116,45 +101,4 @@ uint32_t name_to_id(int user, char *name, int numbers); char *id_to_name(int user, uint32_t id, int numbers); - -static inline int __do_read(int fd, char *buff, size_t len, - const char *file, int line) -{ - int ret = read(fd, buff, len); - if (ret < 0) { - die("bad read: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return ret; -} - -#define do_read(fd, buf, len) \ - __do_read((fd), (buf), (len), __FILE__, __LINE__) - -static inline int __do_write(int fd, char *buff, size_t len, - const char *file, int line) -{ - int ret = write(fd, buff, len); - if (ret != len) { - die("bad write: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return ret; -} - -#define do_write(fd, buf, len) \ - __do_write((fd), (buf), (len), __FILE__, __LINE__) - -static inline int __do_lseek(int fd, off_t off, const char *file, int line) -{ - if (lseek(fd, off, SEEK_SET) != off) { - die("bad seek: %s on line %d of file %s\n", - strerror(errno), line, file); - } - return 0; -} - -#define do_lseek(fd, off) \ - __do_lseek((fd), (off), __FILE__, __LINE__) - #endif /* __GFS2_QUOTA_DOT_H__ */ --- cluster/gfs2/quota/main.c 2007/10/11 20:32:37 1.2.2.6 +++ cluster/gfs2/quota/main.c 2007/11/13 17:06:33 1.2.2.7 @@ -746,24 +746,10 @@ static void do_sync_one(struct gfs2_sbd *sdp, char *filesystem) { - int fd; - char sys_quota_sync[PATH_MAX]; + char *fsname; - strcpy(sdp->path_name, filesystem); - check_for_gfs2(sdp); - read_superblock(&sdp->sd_sb, sdp); - sprintf(sys_quota_sync, "%s%s%s", - "/sys/fs/gfs2/", sdp->sd_sb.sb_locktable, "/quota_sync"); - - fd = open(sys_quota_sync, O_WRONLY); - if (fd < 0) - die("can't open file %s: %s\n", sys_quota_sync, strerror(errno)); - - if (write(fd,(void*)"1", 1) != 1) - die("failed to write to %s: %s\n", - sys_quota_sync, strerror(errno)); - - close(fd); + fsname = mp2fsname(filesystem); + set_sysfs(fsname, "quota_sync", "1"); } /** @@ -809,14 +795,14 @@ static void do_set(struct gfs2_sbd *sdp, commandline_t *comline) { - int fd, fd1; + int fd; uint64_t offset; uint64_t new_value; int error, adj_flag = 0;; char quota_file[BUF_SIZE]; - char sys_q_refresh[BUF_SIZE]; char id_str[16]; struct stat stat_buf; + char *fs; if (!*comline->filesystem) die("need a filesystem to work on\n"); @@ -958,28 +944,11 @@ } } - /* Write the id to sysfs quota refresh file to refresh gfs quotas */ - sprintf(sys_q_refresh, "%s%s%s", "/sys/fs/gfs2/", - sdp->sd_sb.sb_locktable, - comline->id_type == GQ_ID_USER ? "/quota_refresh_user" : - "/quota_refresh_group"); - - fd1 = open(sys_q_refresh, O_WRONLY); - if (fd1 < 0) { - fprintf(stderr, "can't open file %s: %s\n", sys_q_refresh, - strerror(errno)); - goto out; - } - + 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 (write(fd1,(void*)id_str, strlen(id_str)) != strlen(id_str)) { - close(fd1); - fprintf(stderr, "failed to write to %s: %s\n", - sys_q_refresh, strerror(errno)); - goto out; - } - close(fd1); if (adj_flag) adjust_quota_list(fd, comline); out: --- cluster/gfs2/tool/Makefile 2007/10/25 14:14:47 1.5.2.1 +++ cluster/gfs2/tool/Makefile 2007/11/13 17:06:33 1.5.2.2 @@ -30,7 +30,7 @@ .PHONY: all clean distclean -SOURCES= counters.c df.c layout.c main.c misc.c ondisk.c sb.c tune.c util.c +SOURCES= counters.c df.c layout.c main.c misc.c ondisk.c sb.c tune.c OBJECTS=$(subst .c,.o,${SOURCES}) --- cluster/gfs2/tool/gfs2_tool.h 2007/11/07 14:59:28 1.5.2.4 +++ cluster/gfs2/tool/gfs2_tool.h 2007/11/13 17:06:33 1.5.2.5 @@ -15,23 +15,6 @@ #define __GFS2_TOOL_DOT_H__ -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#define die(fmt, args...) \ -do { \ - fprintf(stderr, "%s: ", prog_name); \ - fprintf(stderr, fmt, ##args); \ - exit(EXIT_FAILURE); \ -} while (0) - -#define SYS_BASE "/sys/fs/gfs2" - extern char *prog_name; extern char *action; extern int override; @@ -90,20 +73,4 @@ void get_tune(int argc, char **argv); void set_tune(int argc, char **argv); - -/* From util.c */ - -char *get_list(void); -char **str2lines(char *str); -char *find_debugfs_mount(void); -char *mp2fsname(char *mp); -char *name2value(char *str, char *name); -uint32_t name2u32(char *str, char *name); -uint64_t name2u64(char *str, char *name); -char *__get_sysfs(char *fsname, char *filename); -char *get_sysfs(char *fsname, char *filename); -unsigned int get_sysfs_uint(char *fsname, char *filename); -void set_sysfs(char *fsname, char *filename, char *val); - - #endif /* __GFS2_TOOL_DOT_H__ */ --- cluster/gfs2/tool/main.c 2007/10/30 14:08:33 1.4.2.2 +++ cluster/gfs2/tool/main.c 2007/11/13 17:06:33 1.4.2.3 @@ -28,6 +28,7 @@ #include "copyright.cf" #include "gfs2_tool.h" +#include "libgfs2.h" char *prog_name; char *action = NULL; --- cluster/gfs2/tool/sb.c 2007/06/18 21:50:00 1.2.2.1 +++ cluster/gfs2/tool/sb.c 2007/11/13 17:06:33 1.2.2.2 @@ -29,12 +29,7 @@ #include <linux/gfs2_ondisk.h> #include "gfs2_tool.h" - -/* From libgfs2 */ -extern int gfs2_sb_in(struct gfs2_sb *sb, char *buf); -extern void gfs2_sb_print(struct gfs2_sb *sb); -extern int gfs2_sb_out(struct gfs2_sb *sb, char *buf); - +#include "libgfs2.h" void print_it(const char *label, const char *fmt, const char *fmt2, ...) { @@ -47,27 +42,6 @@ va_end(args); } -#define do_lseek(fd, off) \ -do { \ - if (lseek((fd), (off), SEEK_SET) != (off)) \ - die("bad seek: %s on line %d of file %s\n", \ - strerror(errno),__LINE__, __FILE__); \ -} while (0) - -#define do_read(fd, buff, len) \ -do { \ - if (read((fd), (buff), (len)) != (len)) \ - die("bad read: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} while (0) - -#define do_write(fd, buff, len) \ -do { \ - if (write((fd), (buff), (len)) != (len)) \ - die("bad write: %s on line %d of file %s\n", \ - strerror(errno), __LINE__, __FILE__); \ -} while (0) - /** * do_sb - examine/modify a unmounted FS' superblock * @argc: