Hi, Following path implements the uniform error handling for the utils.c in btrfs-progs.
On Sun, Oct 12, 2014 at 2:01 PM, neo <ckn...@gmail.com> wrote: > --- > Makefile | 4 +- > btrfs-syscalls.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++ > btrfs-syscalls.h | 55 +++++++++++++++ > kerncompat.h | 5 +- > utils.c | 200 > +++++++++++++++++++++++++++---------------------------- > 5 files changed, 337 insertions(+), 107 deletions(-) > create mode 100644 btrfs-syscalls.c > create mode 100644 btrfs-syscalls.h > > diff --git a/Makefile b/Makefile > index 18eb944..d738f20 100644 > --- a/Makefile > +++ b/Makefile > @@ -5,7 +5,7 @@ CC = gcc > LN = ln > AR = ar > AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -DBTRFS_FLAT_INCLUDES > -fno-strict-aliasing -fPIC > -CFLAGS = -g -O1 -fno-strict-aliasing > +CFLAGS = -g -O1 -fno-strict-aliasing -rdynamic > objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \ > root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \ > extent-cache.o extent_io.o volumes.o utils.o repair.o \ > @@ -17,7 +17,7 @@ cmds_objects = cmds-subvolume.o cmds-filesystem.o > cmds-device.o cmds-scrub.o \ > cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o \ > cmds-property.o > libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o > \ > - uuid-tree.o utils-lib.o > + uuid-tree.o utils-lib.o btrfs-syscalls.o > libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \ > crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \ > extent_io.h ioctl.h ctree.h btrfsck.h version.h > diff --git a/btrfs-syscalls.c b/btrfs-syscalls.c > new file mode 100644 > index 0000000..b4d791b > --- /dev/null > +++ b/btrfs-syscalls.c > @@ -0,0 +1,180 @@ > +/******************************************************************************* > + * File Name : btrfs-syscalls.c > + * Description : This file contains system call wrapper functions with > + * uniform error handling. > + > ******************************************************************************/ > +#include "btrfs-syscalls.h" > + > +#define BKTRACE_BUFFER_SIZE 1024 > + > +int err_verbose = 0; > +static void *buf[BKTRACE_BUFFER_SIZE]; > + > +void > +btrfs_backtrace(void) > +{ > + int i; > + int nptrs; > + char **entries; > + > + fprintf(stderr, "Call trace:\n"); > + nptrs = backtrace(buf, BKTRACE_BUFFER_SIZE); > + entries = backtrace_symbols(buf, nptrs); > + if (entries == NULL) { > + fprintf(stderr, "ERROR: backtrace_symbols\n"); > + exit(EXIT_FAILURE); > + } > + for (i = 0; i < nptrs; i++) { > + if (strstr(entries[i], "btrfs_backtrace") == NULL); > + fprintf(stderr, "\t%s\n", entries[i]); > + } > + free(entries); > +} > + > +int > +btrfs_open(const char *pathname, int flags) > +{ > + int ret; > + > + if ((ret = open(pathname, flags)) < 0) > + SYS_ERROR("open : %s", pathname); > + > + return ret; > +} > + > +int > +btrfs_close(int fd) > +{ > + int ret; > + > + if ((ret = close(fd)) < 0) > + SYS_ERROR("close :"); > + > + return ret; > +} > + > +int > +btrfs_stat(const char *path, struct stat *buf) > +{ > + int ret; > + > + if ((ret = stat(path, buf)) < 0) > + SYS_ERROR("stat : %s", path); > + > + return ret; > +} > + > +int > +btrfs_lstat(const char *path, struct stat *buf) > +{ > + int ret; > + > + if ((ret = lstat(path, buf)) < 0) { > + SYS_ERROR("lstat : %s", path); > + } > + > + return ret; > +} > + > +int > +btrfs_fstat(int fd, struct stat *buf) > +{ > + int ret; > + > + if ((ret = fstat(fd, buf)) < 0) > + SYS_ERROR("fstat :"); > + > + return ret; > +} > + > +void* > +btrfs_malloc(size_t size) > +{ > + void *p; > + > + if ((p = malloc(size)) == NULL) { > + if (size != 0) > + SYS_ERROR("malloc :"); > + } > + > + return p; > +} > + > +void* > +btrfs_calloc(size_t nmemb, size_t size) > +{ > + void *p; > + > + if ((p = calloc(nmemb, size)) == NULL) { > + if (size != 0) > + SYS_ERROR("calloc :"); > + } > + > + return p; > +} > + > +FILE* > +btrfs_fopen(const char *path, const char *mode) > +{ > + FILE *f; > + > + if ((f = fopen(path, mode)) == NULL) > + SYS_ERROR("fopen : %s", path); > + > + return f; > +} > + > +DIR* > +btrfs_opendir(const char *name) > +{ > + DIR *d; > + > + if ((d = opendir(name)) == NULL) > + SYS_ERROR("opendir :"); > + > + return d; > +} > + > +int > +btrfs_dirfd(DIR *dirp) > +{ > + int fd; > + > + if ((fd = dirfd(dirp)) < 0) > + SYS_ERROR("dirfd :"); > + > + return fd; > +} > + > +int > +btrfs_closedir(DIR *dirp) > +{ > + int ret; > + > + if ((ret = closedir(dirp)) < 0) > + SYS_ERROR("closedir :"); > + > + return ret; > +} > + > +ssize_t > +btrfs_pwrite(int fd, const void *buf, size_t count, off_t offset) > +{ > + ssize_t ret; > + > + if ((ret = pwrite(fd, buf, count, offset)) < 0) > + SYS_ERROR("pwrite :"); > + > + return ret; > +} > + > +ssize_t > +btrfs_pread(int fd, const void *buf, size_t count, off_t offset) > +{ > + ssize_t ret; > + > + if ((ret = pread(fd, buf, count, offset)) < 0) > + SYS_ERROR("pread :"); > + > + return ret; > +} > diff --git a/btrfs-syscalls.h b/btrfs-syscalls.h > new file mode 100644 > index 0000000..2c717bf > --- /dev/null > +++ b/btrfs-syscalls.h > @@ -0,0 +1,55 @@ > +#ifndef __BTRFS_SYSCALLS_H__ > +#define __BTRFS_SYSCALLS_H__ > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <sys/ioctl.h> > +#include <fcntl.h> > +#include <dirent.h> > +#include <unistd.h> > +#include <execinfo.h> > +#include <errno.h> > +#include <stdio.h> > +#include <string.h> > +#include <stdarg.h> > +#include <stdlib.h> > + > + > +extern int err_verbose; > +#define SYS_ERROR(M, ...)\ > + do {\ > + int e;\ > + e = errno;\ > + switch (err_verbose) {\ > + case 0:\ > + fprintf(stderr, "ERROR: " M " %s\n", ##__VA_ARGS__,\ > + strerror(errno));\ > + break;\ > + case 1:\ > + fprintf(stderr, "ERROR: %s: %s: %d: " M " %s\n", __FILE__, > __func__,\ > + __LINE__, ##__VA_ARGS__, strerror(errno));\ > + break;\ > + case 2:\ > + btrfs_backtrace();\ > + fprintf(stderr, "ERROR: %s: %s: %d: " M " %s\n", __FILE__, > __func__,\ > + __LINE__, ##__VA_ARGS__, strerror(errno));\ > + break;\ > + }\ > + errno = e;\ > + } while (0); > + > +int btrfs_open(const char *pathname, int flags); > +int btrfs_close(int fd); > +int btrfs_stat(const char *path, struct stat *buf); > +int btrfs_fstat(int fd, struct stat *buf); > +int btrfs_lstat(const char *path, struct stat *buf); > +void* btrfs_malloc(size_t size); > +void* btrfs_calloc(size_t nmemb, size_t size); > +void btrfs_free(void *ptr); > +FILE* btrfs_fopen(const char *path, const char *mode); > +DIR* btrfs_opendir(const char *name); > +int btrfs_dirfd(DIR *dirp); > +int btrfs_closedir(DIR *dirp); > +ssize_t btrfs_pwrite(int fd, const void *buf, size_t count, off_t offset); > +ssize_t btrfs_pread(int fd, const void *buf, size_t count, off_t offset); > +void btrfs_backtrace(void); > +#endif /* EOF __BTRFS_SYSCALLS_H__ */ > diff --git a/kerncompat.h b/kerncompat.h > index bb03194..4542318 100644 > --- a/kerncompat.h > +++ b/kerncompat.h > @@ -29,6 +29,7 @@ > #include <stddef.h> > #include <linux/types.h> > #include <stdint.h> > +#include "btrfs-syscalls.h" > > #define ptr_to_u64(x) ((u64)(uintptr_t)x) > #define u64_to_ptr(x) ((void *)(uintptr_t)x) > @@ -232,8 +233,8 @@ static inline long IS_ERR(const void *ptr) > /* > * kmalloc/kfree > */ > -#define kmalloc(x, y) malloc(x) > -#define kzalloc(x, y) calloc(1, x) > +#define kmalloc(x, y) btrfs_malloc(x) > +#define kzalloc(x, y) btrfs_calloc(1, x) > #define kstrdup(x, y) strdup(x) > #define kfree(x) free(x) > > diff --git a/utils.c b/utils.c > index c4f2a00..f18c4ae 100644 > --- a/utils.c > +++ b/utils.c > @@ -47,6 +47,7 @@ > #include "utils.h" > #include "volumes.h" > #include "ioctl.h" > +#include "btrfs-syscalls.h" > > #ifndef BLKDISCARD > #define BLKDISCARD _IO(0x12,119) > @@ -105,8 +106,11 @@ static int discard_range(int fd, u64 start, u64 len) > { > u64 range[2] = { start, len }; > > - if (ioctl(fd, BLKDISCARD, &range) < 0) > + if (ioctl(fd, BLKDISCARD, &range) < 0) { > + if (err_verbose > 1) > + SYS_ERROR("ioctl : BLKDISCARD "); > return errno; > + } > return 0; > } > > @@ -236,7 +240,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > if (label) > strncpy(super.label, label, BTRFS_LABEL_SIZE - 1); > > - buf = malloc(sizeof(*buf) + max(sectorsize, leafsize)); > + buf = btrfs_malloc(sizeof(*buf) + max(sectorsize, leafsize)); > > /* create the tree of root objects */ > memset(buf->data, 0, leafsize); > @@ -319,7 +323,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > > > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[1]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[1]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -378,7 +382,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > btrfs_set_header_owner(buf, BTRFS_EXTENT_TREE_OBJECTID); > btrfs_set_header_nritems(buf, nritems); > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[2]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[2]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -465,7 +469,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > btrfs_set_header_owner(buf, BTRFS_CHUNK_TREE_OBJECTID); > btrfs_set_header_nritems(buf, nritems); > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[3]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[3]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -504,7 +508,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > btrfs_set_header_owner(buf, BTRFS_DEV_TREE_OBJECTID); > btrfs_set_header_nritems(buf, nritems); > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[4]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[4]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -517,7 +521,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > btrfs_set_header_owner(buf, BTRFS_FS_TREE_OBJECTID); > btrfs_set_header_nritems(buf, 0); > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[5]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[5]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -529,7 +533,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > btrfs_set_header_owner(buf, BTRFS_CSUM_TREE_OBJECTID); > btrfs_set_header_nritems(buf, 0); > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, leafsize, blocks[6]); > + ret = btrfs_pwrite(fd, buf->data, leafsize, blocks[6]); > if (ret != leafsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -541,7 +545,7 @@ int make_btrfs(int fd, const char *device, const char > *label, char *fs_uuid, > memcpy(buf->data, &super, sizeof(super)); > buf->len = sectorsize; > csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0); > - ret = pwrite(fd, buf->data, sectorsize, blocks[0]); > + ret = btrfs_pwrite(fd, buf->data, sectorsize, blocks[0]); > if (ret != sectorsize) { > ret = (ret < 0 ? -errno : -EIO); > goto out; > @@ -565,20 +569,22 @@ u64 btrfs_device_size(int fd, struct stat *st) > } > if (ioctl(fd, BLKGETSIZE64, &size) >= 0) { > return size; > + } else { > + SYS_ERROR("ioctl : BLKGETSIZE64 "); > } > return 0; > } > > static int zero_blocks(int fd, off_t start, size_t len) > { > - char *buf = malloc(len); > + char *buf = btrfs_malloc(len); > int ret = 0; > ssize_t written; > > if (!buf) > return -ENOMEM; > memset(buf, 0, len); > - written = pwrite(fd, buf, len, start); > + written = btrfs_pwrite(fd, buf, len, start); > if (written != len) > ret = -EIO; > free(buf); > @@ -669,7 +675,7 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, > btrfs_set_stack_device_bytes_used(dev_item, device->bytes_used); > memcpy(&dev_item->uuid, device->uuid, BTRFS_UUID_SIZE); > > - ret = pwrite(fd, buf, sectorsize, BTRFS_SUPER_INFO_OFFSET); > + ret = btrfs_pwrite(fd, buf, sectorsize, BTRFS_SUPER_INFO_OFFSET); > BUG_ON(ret != sectorsize); > > kfree(buf); > @@ -685,7 +691,7 @@ int btrfs_prepare_device(int fd, char *file, int > zero_end, u64 *block_count_ret, > struct stat st; > int i, ret; > > - ret = fstat(fd, &st); > + ret = btrfs_fstat(fd, &st); > if (ret < 0) { > fprintf(stderr, "unable to stat %s\n", file); > return 1; > @@ -781,7 +787,7 @@ int is_block_device(const char *path) > { > struct stat statbuf; > > - if (stat(path, &statbuf) < 0) > + if (btrfs_stat(path, &statbuf) < 0) > return -errno; > > return S_ISBLK(statbuf.st_mode); > @@ -834,7 +840,7 @@ int get_btrfs_mount(const char *dev, char *mp, size_t > mp_size) > goto out; > } > > - fd = open(dev, O_RDONLY); > + fd = btrfs_open(dev, O_RDONLY); > if (fd < 0) { > ret = -errno; > fprintf(stderr, "Could not open %s: %s\n", dev, > strerror(errno)); > @@ -849,7 +855,7 @@ int get_btrfs_mount(const char *dev, char *mp, size_t > mp_size) > } > out: > if (fd != -1) > - close(fd); > + btrfs_close(fd); > return ret; > } > > @@ -886,7 +892,7 @@ int open_path_or_dev_mnt(const char *path, DIR > **dirstream) > static int is_loop_device (const char* device) { > struct stat statbuf; > > - if(stat(device, &statbuf) < 0) > + if(btrfs_stat(device, &statbuf) < 0) > return -errno; > > return (S_ISBLK(statbuf.st_mode) && > @@ -908,7 +914,7 @@ static int resolve_loop_device(const char* loop_dev, > char* loop_file, > if (!realpath(loop_dev, real_loop_dev)) > return -errno; > snprintf(p, PATH_MAX, "/sys/block/%s/loop/backing_file", > strrchr(real_loop_dev, '/')); > - if (!(f = fopen(p, "r"))) > + if (!(f = btrfs_fopen(p, "r"))) > return -errno; > > snprintf(fmt, 20, "%%%i[^\n]", max_len-1); > @@ -939,8 +945,8 @@ static int is_same_blk_file(const char* a, const char* b) > if(strcmp(real_a, real_b) == 0) > return 1; > > - if(stat(a, &st_buf_a) < 0 || > - stat(b, &st_buf_b) < 0) > + if(btrfs_stat(a, &st_buf_a) < 0 || > + btrfs_stat(b, &st_buf_b) < 0) > { > if (errno == ENOENT) > return 0; > @@ -1020,7 +1026,7 @@ static int is_existing_blk_or_reg_file(const char* > filename) > { > struct stat st_buf; > > - if(stat(filename, &st_buf) < 0) { > + if(btrfs_stat(filename, &st_buf) < 0) { > if(errno == ENOENT) > return 0; > else > @@ -1067,7 +1073,7 @@ char *canonicalize_dm_name(const char *ptname) > return NULL; > > snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptname); > - if (!(f = fopen(path, "r"))) > + if (!(f = btrfs_fopen(path, "r"))) > return NULL; > > /* read <name>\n from sysfs */ > @@ -1119,14 +1125,14 @@ int check_mounted(const char* file) > int fd; > int ret; > > - fd = open(file, O_RDONLY); > + fd = btrfs_open(file, O_RDONLY); > if (fd < 0) { > fprintf (stderr, "check_mounted(): Could not open %s\n", > file); > return -errno; > } > > ret = check_mounted_where(fd, file, NULL, 0, NULL); > - close(fd); > + btrfs_close(fd); > > return ret; > } > @@ -1205,24 +1211,20 @@ void btrfs_register_one_device(char *fname) > struct btrfs_ioctl_vol_args args; > int fd; > int ret; > - int e; > > - fd = open("/dev/btrfs-control", O_RDONLY); > + fd = btrfs_open("/dev/btrfs-control", O_RDONLY); > if (fd < 0) { > fprintf(stderr, "failed to open /dev/btrfs-control " > - "skipping device registration: %s\n", > - strerror(errno)); > + "skipping device registration."); > return; > } > strncpy(args.name, fname, BTRFS_PATH_NAME_MAX); > args.name[BTRFS_PATH_NAME_MAX-1] = 0; > ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args); > - e = errno; > if(ret<0){ > - fprintf(stderr, "ERROR: device scan failed '%s' - %s\n", > - fname, strerror(e)); > + SYS_ERROR("ioctl : BTRFS_IOC_SCAN_DEV : device scan failed > %s", fname) > } > - close(fd); > + btrfs_close(fd); > } > > int btrfs_scan_one_dir(char *dirname, int run_ioctl) > @@ -1241,21 +1243,21 @@ int btrfs_scan_one_dir(char *dirname, int run_ioctl) > > INIT_LIST_HEAD(&pending_list); > > - pending = malloc(sizeof(*pending)); > + pending = btrfs_malloc(sizeof(*pending)); > if (!pending) > return -ENOMEM; > strcpy(pending->name, dirname); > > again: > dirname_len = strlen(pending->name); > - fullpath = malloc(PATH_MAX); > + fullpath = btrfs_malloc(PATH_MAX); > dirname = pending->name; > > if (!fullpath) { > ret = -ENOMEM; > goto fail; > } > - dirp = opendir(dirname); > + dirp = btrfs_opendir(dirname); > if (!dirp) { > fprintf(stderr, "Unable to open %s for scanning\n", dirname); > ret = -errno; > @@ -1272,15 +1274,14 @@ again: > goto fail; > } > snprintf(fullpath, PATH_MAX, "%s/%s", dirname, > dirent->d_name); > - ret = lstat(fullpath, &st); > + ret = btrfs_lstat(fullpath, &st); > if (ret < 0) { > - fprintf(stderr, "failed to stat %s\n", fullpath); > continue; > } > if (S_ISLNK(st.st_mode)) > continue; > if (S_ISDIR(st.st_mode)) { > - struct pending_dir *next = malloc(sizeof(*next)); > + struct pending_dir *next = > btrfs_malloc(sizeof(*next)); > if (!next) { > ret = -ENOMEM; > goto fail; > @@ -1291,7 +1292,7 @@ again: > if (!S_ISBLK(st.st_mode)) { > continue; > } > - fd = open(fullpath, O_RDONLY); > + fd = btrfs_open(fullpath, O_RDONLY); > if (fd < 0) { > /* ignore the following errors: > ENXIO (device don't exists) > @@ -1299,8 +1300,8 @@ again: > like a cd tray empty) > */ > if(errno != ENXIO && errno != ENOMEDIUM) > - fprintf(stderr, "failed to read %s: %s\n", > - fullpath, strerror(errno)); > + fprintf(stderr, "failed to read %s\n", > + fullpath); > continue; > } > ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices, > @@ -1309,7 +1310,7 @@ again: > if (ret == 0 && run_ioctl > 0) { > btrfs_register_one_device(fullpath); > } > - close(fd); > + btrfs_close(fd); > } > if (!list_empty(&pending_list)) { > free(pending); > @@ -1317,7 +1318,7 @@ again: > list); > free(fullpath); > list_del(&pending->list); > - closedir(dirp); > + btrfs_closedir(dirp); > dirp = NULL; > goto again; > } > @@ -1332,7 +1333,7 @@ fail: > free(pending); > } > if (dirp) > - closedir(dirp); > + btrfs_closedir(dirp); > return ret; > } > > @@ -1353,12 +1354,12 @@ int btrfs_device_already_in_root(struct btrfs_root > *root, int fd, > char *buf; > int ret = 0; > > - buf = malloc(BTRFS_SUPER_INFO_SIZE); > + buf = btrfs_malloc(BTRFS_SUPER_INFO_SIZE); > if (!buf) { > ret = -ENOMEM; > goto out; > } > - ret = pread(fd, buf, BTRFS_SUPER_INFO_SIZE, super_offset); > + ret = btrfs_pread(fd, buf, BTRFS_SUPER_INFO_SIZE, super_offset); > if (ret != BTRFS_SUPER_INFO_SIZE) > goto brelse; > > @@ -1484,20 +1485,18 @@ static int set_label_mounted(const char *mount_path, > const char *label) > { > int fd; > > - fd = open(mount_path, O_RDONLY | O_NOATIME); > + fd = btrfs_open(mount_path, O_RDONLY | O_NOATIME); > if (fd < 0) { > - fprintf(stderr, "ERROR: unable to access '%s'\n", mount_path); > return -1; > } > > if (ioctl(fd, BTRFS_IOC_SET_FSLABEL, label) < 0) { > - fprintf(stderr, "ERROR: unable to set label %s\n", > - strerror(errno)); > - close(fd); > + SYS_ERROR("ioctl : BTRFS_IOC_SET_FSLABEL : unable to set > label %s", mount_path); > + btrfs_close(fd); > return -1; > } > > - close(fd); > + btrfs_close(fd); > return 0; > } > > @@ -1541,21 +1540,20 @@ int get_label_mounted(const char *mount_path, char > *labelp) > char label[BTRFS_LABEL_SIZE]; > int fd; > > - fd = open(mount_path, O_RDONLY | O_NOATIME); > + fd = btrfs_open(mount_path, O_RDONLY | O_NOATIME); > if (fd < 0) { > - fprintf(stderr, "ERROR: unable to access '%s'\n", mount_path); > return -1; > } > > memset(label, '\0', sizeof(label)); > if (ioctl(fd, BTRFS_IOC_GET_FSLABEL, label) < 0) { > - fprintf(stderr, "ERROR: unable get label %s\n", > strerror(errno)); > - close(fd); > + SYS_ERROR("ioctl : BTRFS_IOC_GET_FSLABEL : unable to get > label %s", mount_path); > + btrfs_close(fd); > return -1; > } > > strncpy(labelp, label, sizeof(label)); > - close(fd); > + btrfs_close(fd); > return 0; > } > > @@ -1604,7 +1602,7 @@ int btrfs_scan_block_devices(int run_ioctl) > int special; > > scan_again: > - proc_partitions = fopen("/proc/partitions","r"); > + proc_partitions = btrfs_fopen("/proc/partitions","r"); > if (!proc_partitions) { > fprintf(stderr, "Unable to open '/proc/partitions' for > scanning\n"); > return -ENOENT; > @@ -1637,7 +1635,7 @@ scan_again: > if (scans > 0 && !special) > continue; > > - ret = lstat(fullpath, &st); > + ret = btrfs_lstat(fullpath, &st); > if (ret < 0) { > fprintf(stderr, "failed to stat %s\n", fullpath); > continue; > @@ -1646,11 +1644,9 @@ scan_again: > continue; > } > > - fd = open(fullpath, O_RDONLY); > + fd = btrfs_open(fullpath, O_RDONLY); > if (fd < 0) { > if (errno != ENOMEDIUM) > - fprintf(stderr, "failed to open %s: %s\n", > - fullpath, strerror(errno)); > continue; > } > ret = btrfs_scan_one_device(fd, fullpath, &tmp_devices, > @@ -1659,7 +1655,7 @@ scan_again: > if (ret == 0 && run_ioctl > 0) { > btrfs_register_one_device(fullpath); > } > - close(fd); > + btrfs_close(fd); > } > > fclose(proc_partitions); > @@ -1765,17 +1761,17 @@ int open_file_or_dir3(const char *fname, DIR > **dirstream, int open_flags) > struct stat st; > int fd; > > - ret = stat(fname, &st); > + ret = btrfs_stat(fname, &st); > if (ret < 0) { > return -1; > } > if (S_ISDIR(st.st_mode)) { > - *dirstream = opendir(fname); > + *dirstream = btrfs_opendir(fname); > if (!*dirstream) > return -1; > - fd = dirfd(*dirstream); > + fd = btrfs_dirfd(*dirstream); > } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { > - fd = open(fname, open_flags); > + fd = btrfs_open(fname, open_flags); > } else { > /* > * we set this on purpose, in case the caller output > @@ -1787,7 +1783,7 @@ int open_file_or_dir3(const char *fname, DIR > **dirstream, int open_flags) > if (fd < 0) { > fd = -1; > if (*dirstream) > - closedir(*dirstream); > + btrfs_closedir(*dirstream); > } > return fd; > } > @@ -1800,9 +1796,9 @@ int open_file_or_dir(const char *fname, DIR **dirstream) > void close_file_or_dir(int fd, DIR *dirstream) > { > if (dirstream) > - closedir(dirstream); > + btrfs_closedir(dirstream); > else if (fd >= 0) > - close(fd); > + btrfs_close(fd); > } > > int get_device_info(int fd, u64 devid, > @@ -1813,7 +1809,9 @@ int get_device_info(int fd, u64 devid, > di_args->devid = devid; > memset(&di_args->uuid, '\0', sizeof(di_args->uuid)); > > - ret = ioctl(fd, BTRFS_IOC_DEV_INFO, di_args); > + if ((ret = ioctl(fd, BTRFS_IOC_DEV_INFO, di_args)) < 0) { > + SYS_ERROR("ioctl : BTRFS_IOC_DEV_INFO "); > + } > return ret ? -errno : 0; > } > > @@ -1847,11 +1845,9 @@ int get_fs_info(char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > u64 devid; > > /* Ensure it's mounted, then set path to the mountpoint */ > - fd = open(path, O_RDONLY); > + fd = btrfs_open(path, O_RDONLY); > if (fd < 0) { > ret = -errno; > - fprintf(stderr, "Couldn't open %s: %s\n", > - path, strerror(errno)); > goto out; > } > ret = check_mounted_where(fd, path, mp, sizeof(mp), > @@ -1879,7 +1875,7 @@ int get_fs_info(char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > i = devid; > > memcpy(fi_args->fsid, fs_devices_mnt->fsid, BTRFS_FSID_SIZE); > - close(fd); > + btrfs_close(fd); > } > > /* at this point path must not be for a block device */ > @@ -1893,6 +1889,7 @@ int get_fs_info(char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > if (fi_args->num_devices != 1) { > ret = ioctl(fd, BTRFS_IOC_FS_INFO, fi_args); > if (ret < 0) { > + SYS_ERROR("ioctl : BTRFS_IOC_FS_INFO "); > ret = -errno; > goto out; > } > @@ -1901,7 +1898,7 @@ int get_fs_info(char *path, struct > btrfs_ioctl_fs_info_args *fi_args, > if (!fi_args->num_devices) > goto out; > > - di_args = *di_ret = malloc(fi_args->num_devices * sizeof(*di_args)); > + di_args = *di_ret = btrfs_malloc(fi_args->num_devices * > sizeof(*di_args)); > if (!di_args) { > ret = -errno; > goto out; > @@ -1962,7 +1959,7 @@ static int is_swap_device(const char *file) > char *cp; > int ret = 0; > > - if (stat(file, &st_buf) < 0) > + if (btrfs_stat(file, &st_buf) < 0) > return -errno; > if (S_ISBLK(st_buf.st_mode)) > dev = st_buf.st_rdev; > @@ -1972,7 +1969,7 @@ static int is_swap_device(const char *file) > } else > return 0; > > - if ((f = fopen("/proc/swaps", "r")) == NULL) > + if ((f = btrfs_fopen("/proc/swaps", "r")) == NULL) > return 0; > > /* skip the first line */ > @@ -1985,7 +1982,7 @@ static int is_swap_device(const char *file) > if ((cp = strchr(tmp, '\t')) != NULL) > *cp = '\0'; > translate(tmp, buf); > - if (stat(buf, &st_buf) != 0) > + if (btrfs_stat(buf, &st_buf) != 0) > continue; > if (S_ISBLK(st_buf.st_mode)) { > if (dev == st_buf.st_rdev) { > @@ -2165,24 +2162,24 @@ int test_dev_for_mkfs(char *file, int > force_overwrite, char *estr) > return 1; > } > /* check if the device is busy */ > - fd = open(file, O_RDWR|O_EXCL); > + fd = btrfs_open(file, O_RDWR|O_EXCL); > if (fd < 0) { > snprintf(estr, sz, "unable to open %s: %s\n", file, > strerror(errno)); > return 1; > } > - if (fstat(fd, &st)) { > + if (btrfs_fstat(fd, &st)) { > snprintf(estr, sz, "unable to stat %s: %s\n", file, > strerror(errno)); > - close(fd); > + btrfs_close(fd); > return 1; > } > if (!S_ISBLK(st.st_mode)) { > fprintf(stderr, "'%s' is not a block device\n", file); > - close(fd); > + btrfs_close(fd); > return 1; > } > - close(fd); > + btrfs_close(fd); > return 0; > } > > @@ -2211,7 +2208,7 @@ int btrfs_scan_lblkid(int update_kernel) > /* if we are here its definitely a btrfs disk*/ > strncpy(path, blkid_dev_devname(dev), PATH_MAX); > > - fd = open(path, O_RDONLY); > + fd = btrfs_open(path, O_RDONLY); > if (fd < 0) { > printf("ERROR: could not open %s\n", path); > continue; > @@ -2261,24 +2258,24 @@ int is_vol_small(char *file) > struct stat st; > u64 size; > > - fd = open(file, O_RDONLY); > + fd = btrfs_open(file, O_RDONLY); > if (fd < 0) > return -errno; > - if (fstat(fd, &st) < 0) { > + if (btrfs_fstat(fd, &st) < 0) { > e = -errno; > - close(fd); > + btrfs_close(fd); > return e; > } > size = btrfs_device_size(fd, &st); > if (size == 0) { > - close(fd); > + btrfs_close(fd); > return -1; > } > if (size < BTRFS_MKFS_SMALL_VOLUME_SIZE) { > - close(fd); > + btrfs_close(fd); > return 1; > } else { > - close(fd); > + btrfs_close(fd); > return 0; > } > } > @@ -2312,17 +2309,14 @@ int lookup_ino_rootid(int fd, u64 *rootid) > { > struct btrfs_ioctl_ino_lookup_args args; > int ret; > - int e; > > memset(&args, 0, sizeof(args)); > args.treeid = 0; > args.objectid = BTRFS_FIRST_FREE_OBJECTID; > > ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args); > - e = errno; > if (ret) { > - fprintf(stderr, "ERROR: Failed to lookup root id - %s\n", > - strerror(e)); > + SYS_ERROR("ioctl : BTRFS_IOC_INO_LOOKUP : Failed to lookup > root id"); > return ret; > } > > @@ -2347,10 +2341,10 @@ int find_mount_root(const char *path, char > **mount_root) > int longest_matchlen = 0; > char *longest_match = NULL; > > - fd = open(path, O_RDONLY | O_NOATIME); > + fd = btrfs_open(path, O_RDONLY | O_NOATIME); > if (fd < 0) > return -errno; > - close(fd); > + btrfs_close(fd); > > mnttab = setmntent("/proc/self/mounts", "r"); > if (!mnttab) > @@ -2391,18 +2385,18 @@ int test_minimum_size(const char *file, u32 leafsize) > int fd; > struct stat statbuf; > > - fd = open(file, O_RDONLY); > + fd = btrfs_open(file, O_RDONLY); > if (fd < 0) > return -errno; > - if (stat(file, &statbuf) < 0) { > - close(fd); > + if (btrfs_stat(file, &statbuf) < 0) { > + btrfs_close(fd); > return -errno; > } > if (btrfs_device_size(fd, &statbuf) < btrfs_min_dev_size(leafsize)) { > - close(fd); > + btrfs_close(fd); > return 1; > } > - close(fd); > + btrfs_close(fd); > return 0; > } > > @@ -2430,7 +2424,7 @@ int test_isdir(const char *path) > struct stat st; > int ret; > > - ret = stat(path, &st); > + ret = btrfs_stat(path, &st); > if(ret < 0 ) > return -1; > > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html