From mboxrd@z Thu Jan 1 00:00:00 1970 From: adas@sourceware.org Date: 10 Jul 2006 22:51:10 -0000 Subject: [Cluster-devel] cluster/gfs2/mkfs main.c main_mkfs.c gfs2_mkfs ... Message-ID: <20060710225110.26205.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: adas at sourceware.org 2006-07-10 22:51:10 Modified files: gfs2/mkfs : main.c main_mkfs.c gfs2_mkfs.h Makefile Added files: gfs2/mkfs : main_jadd.c Log message: Initial commit of gfs2_jadd. Doesn't work fully. Needs to be tested with GFS2 filesystem. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/main_jadd.c.diff?cvsroot=cluster&r1=1.5&r2=1.6 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/main.c.diff?cvsroot=cluster&r1=1.6&r2=1.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/main_mkfs.c.diff?cvsroot=cluster&r1=1.7&r2=1.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/gfs2_mkfs.h.diff?cvsroot=cluster&r1=1.7&r2=1.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mkfs/Makefile.diff?cvsroot=cluster&r1=1.9&r2=1.10 --- cluster/gfs2/mkfs/main_jadd.c 2006/02/08 14:32:47 1.5 +++ cluster/gfs2/mkfs/main_jadd.c 2006/07/10 22:51:10 1.6 @@ -1,43 +1,106 @@ -/****************************************************************************** -******************************************************************************* -** -** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -** Copyright (C) 2004 Red Hat, Inc. All rights reserved. -** -** This copyrighted material is made available to anyone wishing to use, -** modify, copy, or redistribute it subject to the terms and conditions -** of the GNU General Public License v.2. -** -******************************************************************************* -******************************************************************************/ - #include #include #include #include #include #include +#include #include +#include +#include +#include +#include #include #include #include -#include -#include #include +#include -#define __user #include -#include -#include - +#include +#include "libgfs2.h" #include "gfs2_mkfs.h" +#define BUF_SIZE 4096 + +static char device_name[PATH_MAX]; +static char fspath[BUF_SIZE]; +static char fsoptions[BUF_SIZE]; +static char metafs_path[BUF_SIZE]; +static char lock_table[PATH_MAX]; +static char meta_mount[PATH_MAX] = "/tmp/.gfs2meta"; +static int metafs_fd; +static int metafs_mounted = 0; /* If metafs was already mounted */ + +void +make_jdata(int fd, char *value) +{ + int err; + uint32_t val; + + err = ioctl(fd, IFLAGS_GET_IOC, &val); + if (err) + die("error doing get flags (%d): %s\n", err, strerror(errno)); + if (strcmp(value, "set") == 0) + val |= IFLAG_JOURNAL_DATA; + if (strcmp(value, "clear") == 0) + val &= ~IFLAG_JOURNAL_DATA; + err = ioctl(fd, IFLAGS_SET_IOC, &val); + if (err) + die("error doing set flags (%d): %s\n", err, strerror(errno)); +} + +int +rename2system(struct gfs2_sbd *sdp, char *new_dir, char *new_name) +{ + char oldpath[PATH_MAX], newpath[PATH_MAX]; + int error = 0; + error = snprintf(oldpath, PATH_MAX, "%s/new_inode", + metafs_path); + if (error >= PATH_MAX) + die("rename2system (1)\n"); + + error = snprintf(newpath, PATH_MAX, "%s/%s/%s", + metafs_path, new_dir, new_name); + if (error >= PATH_MAX) + die("rename2system (2)\n"); + + return rename(oldpath, newpath); +} + +void +lock_for_admin(struct gfs2_sbd *sdp) +{ + int error; + + if (sdp->debug) + printf("\nTrying to get admin lock...\n"); + + for (;;) { + + metafs_fd = open(metafs_path, O_RDONLY | O_NOFOLLOW); + if (metafs_fd < 0) + die("can't open %s: %s\n", + metafs_path, strerror(errno)); + + error = flock(metafs_fd, LOCK_EX); + if (error) + die("can't flock %s: %s\n", metafs_path, + strerror(errno)); + + break; + } + + if (sdp->debug) + printf("Got it.\n"); +} + /** * print_usage - print out usage information * */ -static void +static void print_usage(void) { printf("Usage:\n"); @@ -46,15 +109,14 @@ printf("\n"); printf("Options:\n"); printf("\n"); - printf(" -c Size of quota change file\n"); - printf(" -D Enable debugging code\n"); - printf(" -h Print this help, then exit\n"); - printf(" -J Size of journals\n"); - printf(" -j Number of journals\n"); - printf(" -q Don't print anything\n"); - printf(" -T Test, do everything except update FS\n"); - printf(" -u Size of unlinked file\n"); - printf(" -V Print program version information, then exit\n"); + printf(" -c Size of quota change file\n"); + printf(" -D Enable debugging code\n"); + printf(" -h Print this help, then exit\n"); + printf(" -J Size of journals\n"); + printf(" -j Number of journals\n"); + printf(" -q Don't print anything\n"); + printf(" -T Test, do everything except update FS\n"); + printf(" -V Print program version information, then exit\n"); } /** @@ -70,65 +132,50 @@ { int cont = TRUE; int optchar; - + while (cont) { optchar = getopt(argc, argv, "c:DhJ:j:qTu:VX"); - + switch (optchar) { case 'c': sdp->qcsize = atoi(optarg); break; - case 'D': sdp->debug = TRUE; break; - case 'h': print_usage(); exit(EXIT_SUCCESS); break; - case 'J': sdp->jsize = atoi(optarg); break; - case 'j': - sdp->journals = atoi(optarg); + sdp->md.journals = atoi(optarg); break; - case 'q': sdp->quiet = TRUE; break; - case 'T': sdp->test = TRUE; break; - - case 'u': - sdp->utsize = atoi(optarg); - break; - case 'V': - printf("gfs2_grow %s (built %s %s)\n", GFS2_RELEASE_NAME, + printf("gfs2_jadd %s (built %s %s)\n", GFS2_RELEASE_NAME, __DATE__, __TIME__); printf("%s\n", REDHAT_COPYRIGHT); exit(EXIT_SUCCESS); break; - case 'X': sdp->expert = TRUE; break; - case ':': case '?': fprintf(stderr, "Please use '-h' for usage.\n"); exit(EXIT_FAILURE); break; - case EOF: cont = FALSE; break; - default: die("unknown option: %c\n", optchar); break; @@ -140,7 +187,7 @@ optind++; } else die("no path specified (try -h for help)\n"); - + if (optind < argc) die("Unrecognized option: %s\n", argv[optind]); @@ -148,26 +195,20 @@ printf("Command Line Arguments:\n"); printf(" qcsize = %u\n", sdp->qcsize); printf(" jsize = %u\n", sdp->jsize); - printf(" journals = %u\n", sdp->journals); + printf(" journals = %u\n", sdp->md.journals); printf(" quiet = %d\n", sdp->quiet); printf(" test = %d\n", sdp->test); - printf(" utsize = %u\n", sdp->utsize); printf(" path = %s\n", sdp->path_name); } } -static void +static void verify_arguments(struct gfs2_sbd *sdp) { - if (!sdp->journals) + if (!sdp->md.journals) die("no journals specified\n"); - - if (sdp->jsize < 8 || sdp->jsize > 1024) + if (sdp->jsize < 32 || sdp->jsize > 1024) die("bad journal size\n"); - - if (!sdp->utsize || sdp->utsize > 64) - die("bad unlinked size\n"); - if (!sdp->qcsize || sdp->qcsize > 64) die("bad quota change size\n"); } @@ -178,7 +219,7 @@ * */ -static void +static void print_results(struct gfs2_sbd *sdp) { if (sdp->debug) @@ -187,26 +228,26 @@ return; if (sdp->test) - printf("Test mode: on\n"); + printf("Test mode: on\n"); if (sdp->expert) - printf("Expert mode: on\n"); + printf("Expert mode: on\n"); - printf("Filesystem: %s\n", sdp->path_name); - printf("Old Journals %u\n", sdp->orig_journals); - printf("New Journals %u\n", sdp->journals); + printf("Filesystem: %s\n", sdp->path_name); + printf("Old Journals %u\n", sdp->orig_journals); + printf("New Journals %u\n", sdp->md.journals); if (sdp->test) printf("\nThe filesystem was not modified.\n"); } -int +int create_new_inode(struct gfs2_sbd *sdp) { char name[PATH_MAX]; int fd; int error; - error = snprintf(name, PATH_MAX, "%s/.gfs2_admin/new_inode", sdp->path_name); + error = snprintf(name, PATH_MAX, "%s/new_inode", metafs_path); if (error >= PATH_MAX) die("create_new_inode (1)\n"); @@ -220,14 +261,13 @@ die("can't unlink %s: %s\n", name, strerror(errno)); } else - die("can't create %s: %s\n", - name, strerror(errno)); + die("can't create %s: %s\n", name, strerror(errno)); } - + return fd; } -void +void add_ir(struct gfs2_sbd *sdp) { int fd; @@ -238,57 +278,48 @@ { struct gfs2_inum_range ir; - make_jdata(fd, "set"); - memset(&ir, 0, sizeof(struct gfs2_inum_range)); - error = write(fd, &ir, sizeof(struct gfs2_inum_range)); - if (error != sizeof(struct gfs2_inum_range)) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + do_write(fd, (void*)&ir, sizeof(struct gfs2_inum_range)); } close(fd); - - sprintf(new_name, "inum_range%u", sdp->journals); + + sprintf(new_name, "inum_range%u", sdp->md.journals); error = rename2system(sdp, "per_node", new_name); if (error < 0 && errno != EEXIST) - die("can't rename2system %s (%d): %s\n", + die("can't rename2system %s (%d): %s\n", new_name, error, strerror(errno)); } -void +void add_sc(struct gfs2_sbd *sdp) { int fd; char new_name[256]; int error; - + fd = create_new_inode(sdp); - + { struct gfs2_statfs_change sc; - make_jdata(fd, "set"); memset(&sc, 0, sizeof(struct gfs2_statfs_change)); - error = write(fd, &sc, sizeof(struct gfs2_statfs_change)); - if (error != sizeof(struct gfs2_statfs_change)) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + do_write(fd, (void*)&sc, sizeof(struct gfs2_statfs_change)); } close(fd); - - sprintf(new_name, "statfs_change%u", sdp->journals); + + sprintf(new_name, "statfs_change%u", sdp->md.journals); error = rename2system(sdp, "per_node", new_name); if (error < 0 && errno != EEXIST) die("can't rename2system %s (%d): %s\n", new_name, error, strerror(errno)); } -void -add_ut(struct gfs2_sbd *sdp) +void +add_qc(struct gfs2_sbd *sdp) { int fd; char new_name[256]; @@ -298,37 +329,27 @@ { char buf[sdp->bsize]; - unsigned int blocks = sdp->utsize << (20 - sdp->bsize_shift); + unsigned int blocks = sdp->qcsize << (20 - sdp->bsize_shift); unsigned int x; struct gfs2_meta_header mh; make_jdata(fd, "clear"); - memset(buf, 0, sdp->bsize); - for (x = 0; x < blocks; x++) { - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + for (x=0; xbsize); } - error = lseek(fd, 0, SEEK_SET); - if (error) - die("can't lseek: %s\n", strerror(errno)); - + do_lseek(fd, 0); + memset(&mh, 0, sizeof(struct gfs2_meta_header)); mh.mh_magic = GFS2_MAGIC; - mh.mh_type = GFS2_METATYPE_UT; - mh.mh_format = GFS2_FORMAT_UT; - - for (x = 0; x < blocks; x++) { - gfs2_meta_header_out(&mh, buf); + mh.mh_type = GFS2_METATYPE_QC; + mh.mh_format = GFS2_FORMAT_QC; + gfs2_meta_header_out(&mh, buf); - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + for (x=0; xbsize); } error = fsync(fd); @@ -338,74 +359,88 @@ } close(fd); - - sprintf(new_name, "unlinked_tag%u", sdp->journals); + + sprintf(new_name, "quota_change%u", sdp->md.journals); error = rename2system(sdp, "per_node", new_name); if (error < 0 && errno != EEXIST) die("can't rename2system %s (%d): %s\n", new_name, error, strerror(errno)); } -void -add_qc(struct gfs2_sbd *sdp) +#if 0 /* FIXME: When we have a mountpoint in sysfs for gfs2meta, enable this + * to get the lock_table name and block size from the ondisk superblock + */ +void +read_superblock(struct gfs2_sbd *sdp) { int fd; - char new_name[256]; - int error; - - fd = create_new_inode(sdp); - - { - char buf[sdp->bsize]; - unsigned int blocks = sdp->qcsize << (20 - sdp->bsize_shift); - unsigned int x; - struct gfs2_meta_header mh; - - make_jdata(fd, "clear"); - - memset(buf, 0, sdp->bsize); - - for (x = 0; x < blocks; x++) { - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); - } - - error = lseek(fd, 0, SEEK_SET); - if (error) - die("can't lseek: %s\n", strerror(errno)); - - memset(&mh, 0, sizeof(struct gfs2_meta_header)); - mh.mh_magic = GFS2_MAGIC; - mh.mh_type = GFS2_METATYPE_QC; - mh.mh_format = GFS2_FORMAT_QC; - - for (x = 0; x < blocks; x++) { - gfs2_meta_header_out(&mh, buf); + char buf[PATH_MAX]; + + fd = open(sdp->device_name, O_RDONLY); + if (fd < 0) { + die("Could not open the block device %s: %s\n", + sdp->device_name, strerror(errno)); + } + do_lseek(fd, 0x10 * 4096); + do_read(fd, buf, 4096); + gfs2_sb_in(&(sdp->sd_sb), buf); + sdp->bsize = sdp->sd_sb.sb_bsize; + strcpy(lock_table,sdp->sd_sb.sb_locktable); + sprintf(meta_mount, "%s%s%s", "/sys/fs/gfs2/", lock_table, "/meta"); - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); - } + close(fd); +} - error = fsync(fd); - if (error) - die("can't fsync: %s\n", - strerror(errno)); +void +gather_info(struct gfs2_sbd *sdp) +{ + read_superblock(sdp); +} +#else +void +gather_info(struct gfs2_sbd *sdp) +{ + struct statfs statbuf; + if (statfs(sdp->path_name, &statbuf) < 0) { + die("Could not statfs the filesystem %s: %s\n", + sdp->path_name, strerror(errno)); } + sdp->bsize = statbuf.f_bsize; +} +#endif - close(fd); +void +find_current_journals(struct gfs2_sbd *sdp) +{ + char jindex[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + int existing_journals = 0; + + sprintf(jindex, "%s/jindex", metafs_path); + dirp = opendir(jindex); + if (!dirp) { + die("Could not find the jindex directory " + "in gfs2meta mount! error: %s\n", strerror(errno)); + } + while (dirp) { + if ((dp = readdir(dirp)) != NULL) { + if (strncmp(dp->d_name, "journal", 7) == 0) + existing_journals++; + } else + goto close; + } +close: + closedir(dirp); + if (existing_journals <= 0) { + die("There are no journals for this " + "gfs2 fs! Did you mkfs.gfs2 correctly?\n"); + } - sprintf(new_name, "quota_change%u", sdp->journals); - error = rename2system(sdp, "per_node", new_name); - if (error < 0 && errno != EEXIST) - die("can't rename2system %s (%d): %s\n", - new_name, error, strerror(errno)); + sdp->orig_journals = existing_journals; } -void +void add_j(struct gfs2_sbd *sdp) { int fd; @@ -422,19 +457,12 @@ uint64_t seq = RANDOM(blocks); make_jdata(fd, "clear"); - memset(buf, 0, sdp->bsize); - - for (x = 0; x < blocks; x++) { - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + for (x=0; xbsize); } - error = lseek(fd, 0, SEEK_SET); - if (error) - die("can't lseek: %s\n", strerror(errno)); + do_lseek(fd, 0); memset(&lh, 0, sizeof(struct gfs2_log_header)); lh.lh_header.mh_magic = GFS2_MAGIC; @@ -442,19 +470,16 @@ lh.lh_header.mh_format = GFS2_FORMAT_LH; lh.lh_flags = GFS2_LOG_HEAD_UNMOUNT; - for (x = 0; x < blocks; x++) { + for (x=0; xlh_hash = cpu_to_be32(hash); + ((struct gfs2_log_header *)buf)->lh_hash = cpu_to_le32(hash); - error = write(fd, buf, sdp->bsize); - if (error != sdp->bsize) - die("can't write to new_inode (%d): %s\n", - error, strerror(errno)); + do_write(fd, buf, sdp->bsize); if (++seq == blocks) seq = 0; @@ -467,14 +492,148 @@ } close(fd); - - sprintf(new_name, "journal%u", sdp->journals); + + sprintf(new_name, "journal%u", sdp->md.journals); error = rename2system(sdp, "jindex", new_name); if (error < 0 && errno != EEXIST) die("can't rename2system %s (%d): %s\n", new_name, error, strerror(errno)); } +static int +find_gfs2_meta(struct gfs2_sbd *sdp) +{ + FILE *fp = fopen("/proc/mounts", "r"); + char name[] = "gfs2meta"; + char buffer[BUF_SIZE]; + char fstype[80], mfsoptions[BUF_SIZE]; + char meta_device[BUF_SIZE]; + int fsdump, fspass; + + if (fp == NULL) { + perror("open: /proc/mounts"); + exit(EXIT_FAILURE); + } + while ((fgets(buffer, 4095, fp)) != NULL) { + buffer[4095] = 0; + if (strstr(buffer, name) == 0) + continue; + + if (sscanf(buffer, "%s %s %s %s %d %d", meta_device, + metafs_path, fstype,mfsoptions, &fsdump, + &fspass) != 6) + continue; + + if (strcmp(meta_device, sdp->device_name) != 0) + continue; + + metafs_mounted = 1; + + fclose(fp); + return TRUE; + } + fclose(fp); + return FALSE; +} + +static int +dir_exists(const char *dir) +{ + int fd, ret; + struct stat statbuf; + fd = open(dir, O_RDONLY); + if (fd<0) { + if (errno == ENOENT) + return 0; + die("Couldn't open %s : %s\n", dir, strerror(errno)); + } + ret = fstat(fd, &statbuf); + if (ret) + die("stat failed on %s : %s\n", dir, strerror(errno)); + if (S_ISDIR(statbuf.st_mode)) { + close(fd); + return 1; + } + close(fd); + die("%s exists, but is not a directory. Cannot mount metafs here\n", dir); +} + +static void +mount_gfs2_meta(struct gfs2_sbd *sdp) +{ + int ret; + /* mount the meta fs */ + fprintf(stderr, "mount %s %s %s %d\n", sdp->device_name, + meta_mount, "gfs2_meta", 0); + if (!dir_exists(meta_mount)) { + ret = mkdir(meta_mount, 0700); + if (ret) + die("Couldn't create %s : %s\n", meta_mount, + strerror(errno)); + } + + ret = mount(sdp->device_name, meta_mount, "gfs2meta", 0, NULL); + if (ret) + die("Couldn't mount %s : %s\n", meta_mount, + strerror(errno)); + strcpy(metafs_path, meta_mount); +} + +static void +check_for_gfs2(struct gfs2_sbd *sdp) +{ + FILE *fp = fopen("/proc/mounts", "r"); + char *name = sdp->path_name; + char buffer[BUF_SIZE]; + char fstype[80]; + int fsdump, fspass, ret; + + if (name[strlen(name) - 1] == '/') + name[strlen(name) - 1] = '\0'; + + if (fp == NULL) { + perror("open: /proc/mounts"); + exit(EXIT_FAILURE); + } + while ((fgets(buffer, 4095, fp)) != NULL) { + buffer[4095] = 0; + + if (strstr(buffer, "0") == 0) + continue; + + if ((ret = sscanf(buffer, "%s %s %s %s %d %d", device_name, fspath, + fstype, fsoptions, &fsdump, &fspass)) != 6) + continue; + sdp->device_name = device_name; + + if (strcmp(fstype, "gfs2") != 0) + continue; + + if (strcmp(fspath, name) != 0) + continue; + + fclose(fp); + if (strncmp(device_name, "/dev/loop", 9) == 0) + die("Cannot add journal(s) to a loopback GFS mount\n"); + + return; + } + fclose(fp); + die("gfs2 Filesystem %s not found\n", name); +} + +static void +cleanup(struct gfs2_sbd *sdp) +{ + int ret; + if (!metafs_mounted) { /* was mounted by us */ + ret = umount(meta_mount); + if (ret) + fprintf(stderr, "Couldn't unmount %s : %s\n", meta_mount, + strerror(errno)); + } +} + /** * main_jadd - do everything * @argc: @@ -482,45 +641,50 @@ * */ -void +void main_jadd(int argc, char *argv[]) { struct gfs2_sbd sbd, *sdp = &sbd; unsigned int total; memset(sdp, 0, sizeof(struct gfs2_sbd)); - sdp->jsize = MKFS_DEFAULT_JSIZE; - sdp->utsize = MKFS_DEFAULT_UTSIZE; - sdp->qcsize = MKFS_DEFAULT_QCSIZE; + sdp->jsize = GFS2_DEFAULT_JSIZE; + sdp->qcsize = GFS2_DEFAULT_QCSIZE; + sdp->md.journals = 1; decode_arguments(argc, argv, sdp); verify_arguments(sdp); - + sdp->path_fd = open(sdp->path_name, O_RDONLY); if (sdp->path_fd < 0) die("can't open root directory %s: %s\n", sdp->path_name, strerror(errno)); check_for_gfs2(sdp); - lock_for_admin(sdp); - find_block_size(sdp); + gather_info(sdp); + if (!find_gfs2_meta(sdp)) + mount_gfs2_meta(sdp); + lock_for_admin(sdp); + compute_constants(sdp); find_current_journals(sdp); - total = sdp->orig_journals + sdp->journals; - for (sdp->journals = sdp->orig_journals; - sdp->journals < total; - sdp->journals++) { + total = sdp->orig_journals + sdp->md.journals; + for (sdp->md.journals = sdp->orig_journals; + sdp->md.journals < total; + sdp->md.journals++) { add_ir(sdp); add_sc(sdp); - add_ut(sdp); add_qc(sdp); add_j(sdp); } + close(metafs_fd); close(sdp->path_fd); + cleanup(sdp); + sync(); print_results(sdp); --- cluster/gfs2/mkfs/main.c 2006/02/08 14:32:47 1.6 +++ cluster/gfs2/mkfs/main.c 2006/07/10 22:51:10 1.7 @@ -25,6 +25,7 @@ #include #include +#include "libgfs2.h" #include "gfs2_mkfs.h" char *prog_name; @@ -47,15 +48,14 @@ p = strdup(prog_name); whoami = basename(p); -#if 0 - if (!strcmp(whoami, "gfs2_grow")) - main_grow(argc, argv); - else if (!strcmp(whoami, "gfs2_jadd")) + + if (!strcmp(whoami, "gfs2_jadd")) main_jadd(argc, argv); else if (!strcmp(whoami, "gfs2_mkfs") || !strcmp(whoami, "mkfs.gfs2")) -#endif main_mkfs(argc, argv); #if 0 + if (!strcmp(whoami, "gfs2_grow")) + main_grow(argc, argv); else if (!strcmp(whoami, "gfs2_shrink")) main_shrink(argc, argv); else --- cluster/gfs2/mkfs/main_mkfs.c 2006/06/27 21:04:13 1.7 +++ cluster/gfs2/mkfs/main_mkfs.c 2006/07/10 22:51:10 1.8 @@ -25,8 +25,8 @@ #include #include -#include "gfs2_mkfs.h" #include "libgfs2.h" +#include "gfs2_mkfs.h" #include "libvolume_id.h" char *prog_name; --- cluster/gfs2/mkfs/gfs2_mkfs.h 2006/05/15 20:27:03 1.7 +++ cluster/gfs2/mkfs/gfs2_mkfs.h 2006/07/10 22:51:10 1.8 @@ -35,4 +35,44 @@ /* 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__) + #endif /* __GFS2_MKFS_DOT_H__ */ --- cluster/gfs2/mkfs/Makefile 2006/06/27 21:04:13 1.9 +++ cluster/gfs2/mkfs/Makefile 2006/07/10 22:51:10 1.10 @@ -1,13 +1,14 @@ # # Makefile for GFS2 mkfs # -.PHONY: all clean install +.PHONY: all clean install copytobin top_srcdir=.. include ${top_srcdir}/make/defines.mk MKFS=mkfs.gfs2 +JADD=gfs2_jadd INSTALLPATH=/sbin INCLUDEPATH=-I${KERNEL_SRC}/include/ -I${top_srcdir}/include/ -I${top_srcdir}/libgfs2/ -I${top_srcdir}/config/ @@ -19,23 +20,28 @@ LDFLAGS=-L${top_srcdir}/libgfs2 -L${libdir} H=gfs2_disk_hash.h gfs2_mkfs.h linux_endian.h ondisk.h osi_list.h -C=main.c main_mkfs.c +C=main.c main_mkfs.c main_jadd.c O=$(subst .c,.o,${C}) -all: ${MKFS} +all: ${MKFS} ${JADD} ${MKFS}: ${O} ${LD} ${LDFLAGS} ${O} -o ${@} -lgfs2 -lvolume_id +${JADD}: ${MKFS} + ln -s ${MKFS} ${JADD} + .c.o: $< ${CC} ${CFLAGS} -o $@ $^ copytobin: ${MKFS} cp ${MKFS} ${top_srcdir}/bin + ln -sf ${MKFS} ${top_srcdir}/bin/${JADD} install: ${MKFS} ${INSTALL} -m 0755 -g root -o root ${MKFS} ${INSTALLPATH} + ln -sf ${MKFS} ${INSTALLPATH}/${JADD} clean: - rm -f *.o ${MKFS} + rm -f *.o ${MKFS} ${JADD}