X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Fe4defrag.c;h=1d1b4f41c59b2cb5991ea200d80527645d0316e3;hb=1fc23b5e773a7a30130842a8091af546d5dd9875;hp=c2695e825d6b2211b079f44a9b91e68e02b0a5cb;hpb=9a3938918545b831b215b2befc2454f7b1a2dd84;p=tools%2Fe2fsprogs.git diff --git a/misc/e4defrag.c b/misc/e4defrag.c index c2695e8..1d1b4f4 100644 --- a/misc/e4defrag.c +++ b/misc/e4defrag.c @@ -39,7 +39,6 @@ #include #include #include -#include #include /* A relatively new ioctl interface ... */ @@ -194,56 +193,9 @@ static struct frag_statistic_ino frag_rank[SHOW_FRAG_FILES]; #error posix_fadvise not available! #endif -/* - * Local definitions of some syscalls glibc may not yet have - */ -#ifndef HAVE_SYNC_FILE_RANGE -#warning Using locally defined sync_file_range interface. - -#ifndef __NR_sync_file_range -#ifndef __NR_sync_file_range2 /* ppc */ -#error Your kernel headers dont define __NR_sync_file_range -#endif -#endif - -/* - * sync_file_range() - Sync file region. - * - * @fd: defrag target file's descriptor. - * @offset: file offset. - * @length: area length. - * @flag: process flag. - */ -int sync_file_range(int fd, loff_t offset, loff_t length, unsigned int flag) -{ -#ifdef __NR_sync_file_range - return syscall(__NR_sync_file_range, fd, offset, length, flag); -#else - return syscall(__NR_sync_file_range2, fd, flag, offset, length); -#endif -} -#endif /* ! HAVE_SYNC_FILE_RANGE */ - #ifndef HAVE_FALLOCATE64 -#warning Using locally defined fallocate syscall interface. - -#ifndef __NR_fallocate -#error Your kernel headers dont define __NR_fallocate -#endif - -/* - * fallocate64() - Manipulate file space. - * - * @fd: defrag target file's descriptor. - * @mode: process flag. - * @offset: file offset. - * @len: file size. - */ -static int fallocate64(int fd, int mode, loff_t offset, loff_t len) -{ - return syscall(__NR_fallocate, fd, mode, offset, len); -} -#endif /* ! HAVE_FALLOCATE */ +#error fallocate64 not available! +#endif /* ! HAVE_FALLOCATE64 */ /* * get_mount_point() - Get device's mount point. @@ -431,8 +383,10 @@ static int page_in_core(int fd, struct move_extent defrag_data, *page_num = 0; *page_num = (length + pagesize - 1) / pagesize; *vec = (unsigned char *)calloc(*page_num, 1); - if (*vec == NULL) + if (*vec == NULL) { + munmap(page, length); return -1; + } /* Get information on whether pages are in core */ if (mincore(page, (size_t)length, *vec) == -1 || @@ -470,10 +424,12 @@ static int defrag_fadvise(int fd, struct move_extent defrag_data, offset = (loff_t)defrag_data.orig_start * block_size; offset = (offset / pagesize) * pagesize; +#ifdef HAVE_SYNC_FILE_RANGE /* Sync file for fadvise process */ if (sync_file_range(fd, offset, (loff_t)pagesize * page_num, sync_flag) < 0) return -1; +#endif /* Try to release buffer cache which this process used, * then other process can use the released buffer @@ -932,7 +888,9 @@ static int get_physical_count(struct fiemap_extent_list *physical_list_head) do { if ((ext_list_tmp->data.physical + ext_list_tmp->data.len) - != ext_list_tmp->next->data.physical) { + != ext_list_tmp->next->data.physical || + (ext_list_tmp->data.logical + ext_list_tmp->data.len) + != ext_list_tmp->next->data.logical) { /* This extent and next extent are not continuous. */ ret++; } @@ -1838,13 +1796,13 @@ int main(int argc, char *argv[]) if (current_uid == ROOT_UID) { /* Get super block info */ - ret = ext2fs_open(dev_name, 0, 0, block_size, - unix_io_manager, &fs); + ret = ext2fs_open(dev_name, EXT2_FLAG_64BITS, 0, + block_size, unix_io_manager, &fs); if (ret) { - if (mode_flag & DETAIL) { - perror("Can't get super block info"); - PRINT_FILE_NAME(argv[i]); - } + if (mode_flag & DETAIL) + com_err(argv[1], ret, + "while trying to open file system: %s", + dev_name); continue; } @@ -1852,7 +1810,7 @@ int main(int argc, char *argv[]) feature_incompat = fs->super->s_feature_incompat; log_groups_per_flex = fs->super->s_log_groups_per_flex; - ext2fs_close(fs); + ext2fs_close_free(&fs); } switch (arg_type) {