import most of e2fsprogs 1.38 updates
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -55,6 +55,8 @@ extern int blkid_get_cache(blkid_cache *cache, const char *filename); | |
| extern const char *blkid_dev_devname(blkid_dev dev); | |
| extern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache); | |
| + | extern int blkid_dev_set_search(blkid_dev_iterate iter, |
| + | char *search_type, char *search_value); |
| extern int blkid_dev_next(blkid_dev_iterate iterate, blkid_dev *dev); | |
| extern void blkid_dev_iterate_end(blkid_dev_iterate iterate); | |
| @@ -63,6 +65,7 @@ extern char *blkid_devno_to_devname(dev_t devno); | |
| /* devname.c */ | |
| extern int blkid_probe_all(blkid_cache cache); | |
| + | extern int blkid_probe_all_new(blkid_cache cache); |
| extern blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, | |
| int flags); | |
| @@ -86,7 +89,8 @@ extern blkid_tag_iterate blkid_tag_iterate_begin(blkid_dev dev); | |
| extern int blkid_tag_next(blkid_tag_iterate iterate, | |
| const char **type, const char **value); | |
| extern void blkid_tag_iterate_end(blkid_tag_iterate iterate); | |
| - | |
| + | extern int blkid_dev_has_tag(blkid_dev dev, const char *type, |
| + | const char *value); |
| extern blkid_dev blkid_find_dev_with_tag(blkid_cache cache, | |
| const char *type, | |
| const char *value); | |
| @@ -147,65 +147,8 @@ extern int blkid_debug_mask; | |
| #endif | |
| #ifdef CONFIG_BLKID_DEBUG | |
| - | static inline void DEB_DUMP_TAG(int mask, blkid_tag tag) |
| - | { |
| - | if (!(mask & blkid_debug_mask)) |
| - | return; |
| - | |
| - | if (!tag) { |
| - | printf(" tag: NULL\n"); |
| - | return; |
| - | } |
| - | |
| - | printf(" tag: %s=\"%s\"\n", tag->bit_name, tag->bit_val); |
| - | } |
| - | |
| - | static inline void DEB_DUMP_DEV(int mask, blkid_dev dev) |
| - | { |
| - | struct list_head *p; |
| - | |
| - | if (!(mask & blkid_debug_mask)) |
| - | return; |
| - | |
| - | if (!dev) { |
| - | printf(" dev: NULL\n"); |
| - | return; |
| - | } |
| - | |
| - | printf(" dev: name = %s\n", dev->bid_name); |
| - | printf(" dev: DEVNO=\"0x%0Lx\"\n", dev->bid_devno); |
| - | printf(" dev: TIME=\"%lu\"\n", dev->bid_time); |
| - | printf(" dev: PRI=\"%d\"\n", dev->bid_pri); |
| - | printf(" dev: flags = 0x%08X\n", dev->bid_flags); |
| - | |
| - | list_for_each(p, &dev->bid_tags) { |
| - | blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags); |
| - | DEB_DUMP_TAG(mask, tag); |
| - | } |
| - | printf("\n"); |
| - | } |
| - | |
| - | static inline void DEB_DUMP_CACHE(int mask, blkid_cache cache) |
| - | { |
| - | struct list_head *p; |
| - | |
| - | if (!cache || !(mask & blkid_debug_mask)) { |
| - | printf("cache: NULL\n"); |
| - | return; |
| - | } |
| - | |
| - | printf("cache: time = %lu\n", cache->bic_time); |
| - | printf("cache: flags = 0x%08X\n", cache->bic_flags); |
| - | |
| - | list_for_each(p, &cache->bic_devs) { |
| - | blkid_dev dev = list_entry(p, struct blkid_struct_dev, bid_devs); |
| - | DEB_DUMP_DEV(mask, dev); |
| - | } |
| - | } |
| - | #else |
| - | #define DEB_DUMP_TAG(mask, tag) do {} while (0) |
| - | #define DEB_DUMP_DEV(mask, dev) do {} while (0) |
| - | #define DEB_DUMP_CACHE(mask, cache) do {} while (0) |
| + | extern void blkid_debug_dump_dev(blkid_dev dev); |
| + | extern void blkid_debug_dump_tag(blkid_tag tag); |
| #endif | |
| /* lseek.c */ | |
| @@ -63,7 +63,7 @@ void blkid_put_cache(blkid_cache cache) | |
| DBG(DEBUG_CACHE, printf("freeing cache struct\n")); | |
| - | /* DEB_DUMP_CACHE(cache); */ |
| + | /* DBG(DEBUG_CACHE, blkid_debug_dump_cache(cache)); */ |
| while (!list_empty(&cache->bic_devs)) { | |
| blkid_dev dev = list_entry(cache->bic_devs.next, | |
| @@ -35,7 +35,7 @@ void blkid_free_dev(blkid_dev dev) | |
| DBG(DEBUG_DEV, | |
| printf(" freeing dev %s (%s)\n", dev->bid_name, dev->bid_type)); | |
| - | DEB_DUMP_DEV(DEBUG_DEV, dev); |
| + | DBG(DEBUG_DEV, blkid_debug_dump_dev(dev)); |
| list_del(&dev->bid_devs); | |
| while (!list_empty(&dev->bid_tags)) { | |
| @@ -57,6 +57,34 @@ const char *blkid_dev_devname(blkid_dev dev) | |
| return dev->bid_name; | |
| } | |
| + | #ifdef CONFIG_BLKID_DEBUG |
| + | void blkid_debug_dump_dev(blkid_dev dev) |
| + | { |
| + | struct list_head *p; |
| + | |
| + | if (!dev) { |
| + | printf(" dev: NULL\n"); |
| + | return; |
| + | } |
| + | |
| + | printf(" dev: name = %s\n", dev->bid_name); |
| + | printf(" dev: DEVNO=\"0x%0llx\"\n", dev->bid_devno); |
| + | printf(" dev: TIME=\"%lu\"\n", dev->bid_time); |
| + | printf(" dev: PRI=\"%d\"\n", dev->bid_pri); |
| + | printf(" dev: flags = 0x%08X\n", dev->bid_flags); |
| + | |
| + | list_for_each(p, &dev->bid_tags) { |
| + | blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags); |
| + | if (tag) |
| + | printf(" tag: %s=\"%s\"\n", tag->bit_name, |
| + | tag->bit_val); |
| + | else |
| + | printf(" tag: NULL\n"); |
| + | } |
| + | printf("\n"); |
| + | } |
| + | #endif |
| + | |
| /* | |
| * dev iteration routines for the public libblkid interface. | |
| * | |
| @@ -114,3 +142,72 @@ void blkid_dev_iterate_end(blkid_dev_iterate iter) | |
| free(iter); | |
| } | |
| + | #ifdef TEST_PROGRAM |
| + | #ifdef HAVE_GETOPT_H |
| + | #include <getopt.h> |
| + | #else |
| + | extern char *optarg; |
| + | extern int optind; |
| + | #endif |
| + | |
| + | void usage(char *prog) |
| + | { |
| + | fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask]\n", prog); |
| + | fprintf(stderr, "\tList all devices and exit\n", prog); |
| + | exit(1); |
| + | } |
| + | |
| + | int main(int argc, char **argv) |
| + | { |
| + | blkid_dev_iterate iter; |
| + | blkid_cache cache = NULL; |
| + | blkid_dev dev; |
| + | int c, ret; |
| + | char *tmp; |
| + | char *file = NULL; |
| + | char *search_type = NULL; |
| + | char *search_value = NULL; |
| + | |
| + | while ((c = getopt (argc, argv, "m:f:")) != EOF) |
| + | switch (c) { |
| + | case 'f': |
| + | file = optarg; |
| + | break; |
| + | case 'm': |
| + | blkid_debug_mask = strtoul (optarg, &tmp, 0); |
| + | if (*tmp) { |
| + | fprintf(stderr, "Invalid debug mask: %d\n", |
| + | optarg); |
| + | exit(1); |
| + | } |
| + | break; |
| + | case '?': |
| + | usage(argv[0]); |
| + | } |
| + | if (argc >= optind+2) { |
| + | search_type = argv[optind]; |
| + | search_value = argv[optind+1]; |
| + | optind += 2; |
| + | } |
| + | if (argc != optind) |
| + | usage(argv[0]); |
| + | |
| + | if ((ret = blkid_get_cache(&cache, file)) != 0) { |
| + | fprintf(stderr, "%s: error creating cache (%d)\n", |
| + | argv[0], ret); |
| + | exit(1); |
| + | } |
| + | |
| + | iter = blkid_dev_iterate_begin(cache); |
| + | if (search_type) |
| + | blkid_dev_set_search(iter, search_type, search_value); |
| + | while (blkid_dev_next(iter, &dev) == 0) { |
| + | printf("Device: %s\n", blkid_dev_devname(dev)); |
| + | } |
| + | blkid_dev_iterate_end(iter); |
| + | |
| + | |
| + | blkid_put_cache(cache); |
| + | return (0); |
| + | } |
| + | #endif |
| @@ -117,7 +117,7 @@ static void scan_dir(char *dir_name, dev_t devno, struct dir_list **list, | |
| else if (S_ISBLK(st.st_mode) && st.st_rdev == devno) { | |
| *devname = blkid_strdup(path); | |
| DBG(DEBUG_DEVNO, | |
| - | printf("found 0x%Lx at %s (%p)\n", devno, |
| + | printf("found 0x%llx at %s (%p)\n", devno, |
| path, *devname)); | |
| break; | |
| } | |
| @@ -175,7 +175,7 @@ char *blkid_devno_to_devname(dev_t devno) | |
| (unsigned long) devno)); | |
| } else { | |
| DBG(DEBUG_DEVNO, | |
| - | printf("found devno 0x%04Lx as %s\n", devno, devname)); |
| + | printf("found devno 0x%04llx as %s\n", devno, devname)); |
| } | |
| @@ -98,7 +98,8 @@ static void get_ext2_info(blkid_dev dev, unsigned char *buf) | |
| static int probe_ext3(int fd __BLKID_ATTR((unused)), | |
| blkid_cache cache __BLKID_ATTR((unused)), | |
| blkid_dev dev, | |
| - | const struct blkid_magic *id, unsigned char *buf) |
| + | struct blkid_magic *id __BLKID_ATTR((unused)), |
| + | unsigned char *buf) |
| { | |
| struct ext2_super_block *es; | |
| @@ -124,10 +125,10 @@ static int probe_ext3(int fd __BLKID_ATTR((unused)), | |
| static int probe_ext2(int fd __BLKID_ATTR((unused)), | |
| blkid_cache cache __BLKID_ATTR((unused)), | |
| blkid_dev dev, | |
| - | const struct blkid_magic *id, unsigned char *buf) |
| + | struct blkid_magic *id __BLKID_ATTR((unused)), |
| + | unsigned char *buf) |
| { | |
| struct ext2_super_block *es; | |
| - | // const char *sec_type = 0, *label = 0; |
| es = (struct ext2_super_block *)buf; | |
| @@ -303,6 +304,23 @@ static int probe_romfs(int fd __BLKID_ATTR((unused)), | |
| return 0; | |
| } | |
| + | static int probe_cramfs(int fd __BLKID_ATTR((unused)), |
| + | blkid_cache cache __BLKID_ATTR((unused)), |
| + | blkid_dev dev, |
| + | struct blkid_magic *id __BLKID_ATTR((unused)), |
| + | unsigned char *buf) |
| + | { |
| + | struct cramfs_super_block *csb; |
| + | const char *label = 0; |
| + | |
| + | csb = (struct cramfs_super_block *)buf; |
| + | |
| + | if (strlen((char *) csb->name)) |
| + | label = (char *) csb->name; |
| + | blkid_set_tag(dev, "LABEL", label, 0); |
| + | return 0; |
| + | } |
| + | |
| static int probe_swap0(int fd __BLKID_ATTR((unused)), | |
| blkid_cache cache __BLKID_ATTR((unused)), | |
| blkid_dev dev, | |
| @@ -321,7 +339,6 @@ static int probe_swap1(int fd, | |
| unsigned char *buf __BLKID_ATTR((unused))) | |
| { | |
| struct swap_id_block *sws; | |
| - | // const char *label = 0; |
| probe_swap0(fd, cache, dev, id, buf); | |
| /* | |
| @@ -489,7 +506,7 @@ static const struct blkid_magic type_array[] = { | |
| { "xfs", 0, 0, 4, "XFSB", probe_xfs }, | |
| { "romfs", 0, 0, 8, "-rom1fs-", probe_romfs }, | |
| { "bfs", 0, 0, 4, "\316\372\173\033", 0 }, | |
| - | { "cramfs", 0, 0, 4, "E=\315\034", 0 }, |
| + | { "cramfs", 0, 0, 4, "E=\315\050", probe_cramfs }, |
| { "qnx4", 0, 4, 6, "QNX4FS", 0 }, | |
| { "udf", 32, 1, 5, "BEA01", probe_udf }, | |
| { "udf", 32, 1, 5, "BOOT2", probe_udf }, | |
| @@ -647,7 +664,7 @@ found_type: | |
| blkid_set_tag(dev, "TYPE", type, 0); | |
| - | DBG(DEBUG_PROBE, printf("%s: devno 0x%04Lx, type %s\n", |
| + | DBG(DEBUG_PROBE, printf("%s: devno 0x%04llx, type %s\n", |
| dev->bid_name, st.st_rdev, type)); | |
| } | |
| @@ -108,13 +108,28 @@ struct romfs_super_block { | |
| unsigned char ros_volume[16]; | |
| }; | |
| + | struct cramfs_super_block { |
| + | __u8 magic[4]; |
| + | __u32 size; |
| + | __u32 flags; |
| + | __u32 future; |
| + | __u8 signature[16]; |
| + | struct cramfs_info { |
| + | __u32 crc; |
| + | __u32 edition; |
| + | __u32 blocks; |
| + | __u32 files; |
| + | } info; |
| + | __u8 name[16]; |
| + | }; |
| + | |
| struct swap_id_block { | |
| /* unsigned char sws_boot[1024]; */ | |
| __u32 sws_version; | |
| __u32 sws_lastpage; | |
| __u32 sws_nrbad; | |
| unsigned char sws_uuid[16]; | |
| - | unsigned char sws_volume[16]; |
| + | char sws_volume[16]; |
| unsigned char sws_pad[117]; | |
| __u32 sws_badpg; | |
| }; | |
| @@ -216,22 +231,22 @@ struct ocfs_volume_header { | |
| unsigned char minor_version[4]; | |
| unsigned char major_version[4]; | |
| unsigned char signature[128]; | |
| - | unsigned char mount[128]; |
| - | unsigned char mount_len[2]; |
| + | char mount[128]; |
| + | unsigned char mount_len[2]; |
| }; | |
| struct ocfs_volume_label { | |
| unsigned char disk_lock[48]; | |
| - | unsigned char label[64]; |
| + | char label[64]; |
| unsigned char label_len[2]; | |
| unsigned char vol_id[16]; | |
| unsigned char vol_id_len[2]; | |
| }; | |
| #define ocfsmajor(o) ((__u32)o.major_version[0] \ | |
| - | + (((__u32) o.major_version[1]) << 8) \ |
| - | + (((__u32) o.major_version[2]) << 16) \ |
| - | + (((__u32) o.major_version[3]) << 24)) |
| + | + (((__u32) o.major_version[1]) << 8) \ |
| + | + (((__u32) o.major_version[2]) << 16) \ |
| + | + (((__u32) o.major_version[3]) << 24)) |
| #define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8)) | |
| #define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8)) | |
| @@ -241,7 +256,7 @@ struct ocfs2_super_block { | |
| unsigned char signature[8]; | |
| unsigned char s_dummy1[184]; | |
| unsigned char s_dummy2[80]; | |
| - | unsigned char s_label[64]; |
| + | char s_label[64]; |
| unsigned char s_uuid[16]; | |
| }; | |
| @@ -33,6 +33,11 @@ | |
| #include <stdlib.h> | |
| + | #ifdef TEST_PROGRAM |
| + | #define blkid_debug_dump_dev(dev) (debug_dump_dev(dev)) |
| + | static void debug_dump_dev(blkid_dev dev); |
| + | #endif |
| + | |
| /* | |
| * File format: | |
| * | |
| @@ -355,7 +360,7 @@ static int blkid_parse_line(blkid_cache cache, blkid_dev *dev_p, char *cp) | |
| blkid_free_dev(dev); | |
| } | |
| - | DEB_DUMP_DEV(DEBUG_READ, dev); |
| + | DBG(DEBUG_READ, blkid_debug_dump_dev(dev)); |
| return ret; | |
| } | |
| @@ -433,6 +438,32 @@ errout: | |
| } | |
| #ifdef TEST_PROGRAM | |
| + | static void debug_dump_dev(blkid_dev dev) |
| + | { |
| + | struct list_head *p; |
| + | |
| + | if (!dev) { |
| + | printf(" dev: NULL\n"); |
| + | return; |
| + | } |
| + | |
| + | printf(" dev: name = %s\n", dev->bid_name); |
| + | printf(" dev: DEVNO=\"0x%0llx\"\n", dev->bid_devno); |
| + | printf(" dev: TIME=\"%lu\"\n", dev->bid_time); |
| + | printf(" dev: PRI=\"%d\"\n", dev->bid_pri); |
| + | printf(" dev: flags = 0x%08X\n", dev->bid_flags); |
| + | |
| + | list_for_each(p, &dev->bid_tags) { |
| + | blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags); |
| + | if (tag) |
| + | printf(" tag: %s=\"%s\"\n", tag->bit_name, |
| + | tag->bit_val); |
| + | else |
| + | printf(" tag: NULL\n"); |
| + | } |
| + | printf("\n"); |
| + | } |
| + | |
| int main(int argc, char**argv) | |
| { | |
| blkid_cache cache = NULL; | |
| @@ -29,6 +29,18 @@ static blkid_tag blkid_new_tag(void) | |
| return tag; | |
| } | |
| + | #ifdef CONFIG_BLKID_DEBUG |
| + | void blkid_debug_dump_tag(blkid_tag tag) |
| + | { |
| + | if (!tag) { |
| + | printf(" tag: NULL\n"); |
| + | return; |
| + | } |
| + | |
| + | printf(" tag: %s=\"%s\"\n", tag->bit_name, tag->bit_val); |
| + | } |
| + | #endif |
| + | |
| void blkid_free_tag(blkid_tag tag) | |
| { | |
| if (!tag) | |
| @@ -36,7 +48,7 @@ void blkid_free_tag(blkid_tag tag) | |
| DBG(DEBUG_TAG, printf(" freeing tag %s=%s\n", tag->bit_name, | |
| tag->bit_val ? tag->bit_val : "(NULL)")); | |
| - | DEB_DUMP_TAG(DEBUG_TAG, tag); |
| + | DBG(DEBUG_TAG, blkid_debug_dump_tag(tag)); |
| list_del(&tag->bit_tags); /* list of tags for this device */ | |
| list_del(&tag->bit_names); /* list of tags with this type */ | |
| @@ -330,3 +342,90 @@ try_again: | |
| } | |
| return dev; | |
| } | |
| + | |
| + | #ifdef TEST_PROGRAM |
| + | #ifdef HAVE_GETOPT_H |
| + | #include <getopt.h> |
| + | #else |
| + | extern char *optarg; |
| + | extern int optind; |
| + | #endif |
| + | |
| + | void usage(char *prog) |
| + | { |
| + | fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask] device " |
| + | "[type value]\n", |
| + | prog); |
| + | fprintf(stderr, "\tList all tags for a device and exit\n", prog); |
| + | exit(1); |
| + | } |
| + | |
| + | int main(int argc, char **argv) |
| + | { |
| + | blkid_tag_iterate iter; |
| + | blkid_cache cache = NULL; |
| + | blkid_dev dev; |
| + | int c, ret, found; |
| + | int flags = BLKID_DEV_FIND; |
| + | char *tmp; |
| + | char *file = NULL; |
| + | char *devname = NULL; |
| + | char *search_type = NULL; |
| + | char *search_value = NULL; |
| + | const char *type, *value; |
| + | |
| + | while ((c = getopt (argc, argv, "m:f:")) != EOF) |
| + | switch (c) { |
| + | case 'f': |
| + | file = optarg; |
| + | break; |
| + | case 'm': |
| + | blkid_debug_mask = strtoul (optarg, &tmp, 0); |
| + | if (*tmp) { |
| + | fprintf(stderr, "Invalid debug mask: %d\n", |
| + | optarg); |
| + | exit(1); |
| + | } |
| + | break; |
| + | case '?': |
| + | usage(argv[0]); |
| + | } |
| + | if (argc > optind) |
| + | devname = argv[optind++]; |
| + | if (argc > optind) |
| + | search_type = argv[optind++]; |
| + | if (argc > optind) |
| + | search_value = argv[optind++]; |
| + | if (!devname || (argc != optind)) |
| + | usage(argv[0]); |
| + | |
| + | if ((ret = blkid_get_cache(&cache, file)) != 0) { |
| + | fprintf(stderr, "%s: error creating cache (%d)\n", |
| + | argv[0], ret); |
| + | exit(1); |
| + | } |
| + | |
| + | dev = blkid_get_dev(cache, devname, flags); |
| + | if (!dev) { |
| + | fprintf(stderr, "%s: Can not find device in blkid cache\n"); |
| + | exit(1); |
| + | } |
| + | if (search_type) { |
| + | found = blkid_dev_has_tag(dev, search_type, search_value); |
| + | printf("Device %s: (%s, %s) %s\n", blkid_dev_devname(dev), |
| + | search_type, search_value ? search_value : "NULL", |
| + | found ? "FOUND" : "NOT FOUND"); |
| + | return(!found); |
| + | } |
| + | printf("Device %s...\n", blkid_dev_devname(dev)); |
| + | |
| + | iter = blkid_tag_iterate_begin(dev); |
| + | while (blkid_tag_next(iter, &type, &value) == 0) { |
| + | printf("\tTag %s has value %s\n", type, value); |
| + | } |
| + | blkid_tag_iterate_end(iter); |
| + | |
| + | blkid_put_cache(cache); |
| + | return (0); |
| + | } |
| + | #endif |
| @@ -11,8 +11,8 @@ | |
| #include "libbb.h" | |
| /* version we've last synced against */ | |
| - | #define E2FSPROGS_VERSION "1.37" |
| - | #define E2FSPROGS_DATE "21-Mar-2005" |
| + | #define E2FSPROGS_VERSION "1.38" |
| + | #define E2FSPROGS_DATE "30-Jun-2005" |
| /* make sure com_err.h isnt included before us */ | |
| #ifdef __COM_ERR_H__ | |
| @@ -51,7 +51,7 @@ typedef long errcode_t; | |
| #define HAVE_UNISTD_H 1 | |
| /* Endianness */ | |
| - | #if __BYTE_ORDER== __BIG_ENDIAN |
| + | #if __BYTE_ORDER == __BIG_ENDIAN |
| #define ENABLE_SWAPFS 1 | |
| #define WORDS_BIGENDIAN 1 | |
| #endif | |
| @@ -3712,6 +3712,8 @@ err_out: | |
| * @j journal | |
| * @l lost+found | |
| * @L is a link | |
| + | * @m multiply-claimed |
| + | * @n invalid |
| * @o orphaned | |
| * @p problem in | |
| * @r root inode | |
| @@ -3749,6 +3751,8 @@ static const char * const abbrevs[] = { | |
| N_("hHTREE @d @i"), | |
| N_("llost+found"), | |
| N_("Lis a link"), | |
| + | N_("mmultiply-claimed"), |
| + | N_("ninvalid"), |
| N_("oorphaned"), | |
| N_("pproblem in"), | |
| N_("rroot @i"), | |
| @@ -4698,7 +4702,8 @@ static void e2fsck_pass1(e2fsck_t ctx) | |
| if (ctx->progress) | |
| if ((ctx->progress)(ctx, 1, 0, ctx->fs->group_desc_count)) | |
| return; | |
| - | if (fs->super->s_wtime < fs->super->s_inodes_count) |
| + | if ((fs->super->s_wtime < fs->super->s_inodes_count) || |
| + | (fs->super->s_mtime < fs->super->s_inodes_count)) |
| busted_fs_time = 1; | |
| while (1) { | |
| @@ -5052,6 +5057,11 @@ static void e2fsck_pass1(e2fsck_t ctx) | |
| ctx->flags |= E2F_FLAG_ABORT; | |
| return; | |
| } | |
| + | e2fsck_read_inode(ctx, EXT2_RESIZE_INO, inode, |
| + | "recreate inode"); |
| + | inode->i_mtime = time(0); |
| + | e2fsck_write_inode(ctx, EXT2_RESIZE_INO, inode, |
| + | "recreate inode"); |
| fs->block_map = save_bmap; | |
| ctx->flags &= ~E2F_FLAG_RESIZE_INODE; | |
| } | |
| @@ -6702,7 +6712,7 @@ static void pass1d(e2fsck_t ctx, char *block_buf) | |
| shared_len = 0; | |
| file_ok = 1; | |
| ino = (ext2_ino_t)VOIDPTR_TO_INT(dnode_getkey(n)); | |
| - | if (ino == EXT2_BAD_INO) |
| + | if (ino == EXT2_BAD_INO || ino == EXT2_RESIZE_INO) |
| continue; | |
| /* | |
| @@ -10052,7 +10062,7 @@ static const char * const prompt[] = { | |
| N_("Abort"), /* 11 */ | |
| N_("Split"), /* 12 */ | |
| N_("Continue"), /* 13 */ | |
| - | N_("Clone duplicate/bad blocks"), /* 14 */ |
| + | N_("Clone multiply-claimed blocks"), /* 14 */ |
| N_("Delete file"), /* 15 */ | |
| N_("Suppress messages"),/* 16 */ | |
| N_("Unlink"), /* 17 */ | |
| @@ -10080,7 +10090,7 @@ static const char * const preen_msg[] = { | |
| N_("ABORTED"), /* 11 */ | |
| N_("SPLIT"), /* 12 */ | |
| N_("CONTINUING"), /* 13 */ | |
| - | N_("DUPLICATE/BAD BLOCKS CLONED"), /* 14 */ |
| + | N_("MULTIPLY-CLAIMED BLOCKS CLONED"), /* 14 */ |
| N_("FILE DELETED"), /* 15 */ | |
| N_("SUPPRESSED"), /* 16 */ | |
| N_("UNLINKED"), /* 17 */ | |
| @@ -10147,12 +10157,11 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Relocate hint */ | |
| { PR_0_RELOCATE_HINT, | |
| - | N_("Note: if there is several inode or block bitmap blocks\n" |
| - | "which require relocation, or one part of the inode table\n" |
| - | "which must be moved, you may wish to try running e2fsck\n" |
| - | "with the '-b %S' option first. The problem may lie only\n" |
| - | "with the primary block group descriptor, and the backup\n" |
| - | "block group descriptor may be OK.\n\n"), |
| + | N_("Note: if several inode or block bitmap blocks or part\n" |
| + | "of the inode table require relocation, you may wish to try\n" |
| + | "running e2fsck with the '-b %S' option first. The problem\n" |
| + | "may lie only with the primary block group descriptors, and\n" |
| + | "the backup block group descriptors may be OK.\n\n"), |
| PROMPT_NONE, PR_PREEN_OK | PR_NOCOLLATE }, | |
| /* Miscellaneous superblock corruption */ | |
| @@ -10167,7 +10176,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Inode count in superblock is incorrect */ | |
| { PR_0_INODE_COUNT_WRONG, | |
| - | N_("@i count in @S is %i, should be %j.\n"), |
| + | N_("@i count in @S is %i, @s %j.\n"), |
| PROMPT_FIX, 0 }, | |
| { PR_0_HURD_CLEAR_FILETYPE, | |
| @@ -10176,7 +10185,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Journal inode is invalid */ | |
| { PR_0_JOURNAL_BAD_INODE, | |
| - | N_("@S has a bad ext3 @j (@i %i).\n"), |
| + | N_("@S has an @n ext3 @j (@i %i).\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* The external journal has (unsupported) multiple filesystems */ | |
| @@ -10224,7 +10233,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Journal has data, but recovery flag is clear */ | |
| { PR_0_JOURNAL_RECOVERY_CLEAR, | |
| - | N_("ext3 recovery flag clear, but @j has data.\n"), |
| + | N_("ext3 recovery flag is clear, but @j has data.\n"), |
| PROMPT_NONE, 0 }, | |
| /* Ask if we should clear the journal */ | |
| @@ -10269,7 +10278,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Filesystem revision is 0, but feature flags are set */ | |
| { PR_0_FS_REV_LEVEL, | |
| - | "@f has feature flag(s) set, but is a revision 0 @f. ", |
| + | N_("@f has feature flag(s) set, but is a revision 0 @f. "), |
| PROMPT_FIX, PR_PREEN_OK | PR_NO_OK }, | |
| /* Journal superblock has an unknown read-only feature flag set */ | |
| @@ -10289,7 +10298,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Moving journal to hidden file */ | |
| { PR_0_MOVE_JOURNAL, | |
| - | N_("Moving @j from /%s to hidden inode.\n\n"), |
| + | N_("Moving @j from /%s to hidden @i.\n\n"), |
| PROMPT_NONE, 0 }, | |
| /* Error moving journal to hidden file */ | |
| @@ -10299,7 +10308,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Clearing V2 journal superblock */ | |
| { PR_0_CLEAR_V2_JOURNAL, | |
| - | N_("Found invalid V2 @j @S fields (from V1 journal).\n" |
| + | N_("Found @n V2 @j @S fields (from V1 @j).\n" |
| "Clearing fields beyond the V1 @j @S...\n\n"), | |
| PROMPT_NONE, 0 }, | |
| @@ -10316,7 +10325,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Resize_inode not enabled, but resize inode is non-zero */ | |
| { PR_0_CLEAR_RESIZE_INODE, | |
| - | N_("Resize_@i not enabled, but the resize inode is non-zero. "), |
| + | N_("Resize_@i not enabled, but the resize @i is non-zero. "), |
| PROMPT_CLEAR, 0 }, | |
| /* Resize inode invalid */ | |
| @@ -10342,7 +10351,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Reserved inode has bad mode */ | |
| { PR_1_RESERVED_BAD_MODE, | |
| - | N_("Reserved @i %i %Q has bad mode. "), |
| + | N_("Reserved @i %i (%Q) has @n mode. "), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* Deleted inode has zero dtime */ | |
| @@ -10449,9 +10458,8 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Bad primary block prompt */ | |
| { PR_1_BAD_PRIMARY_BLOCK_PROMPT, | |
| - | N_("You can clear the this @b (and hope for the best) from the\n" |
| - | "bad @b list and hope that @b is really OK, but there are no\n" |
| - | "guarantees.\n\n"), |
| + | N_("You can remove this @b from the bad @b list and hope\n" |
| + | "that the @b is really OK. But there are no guarantees.\n\n"), |
| PROMPT_CLEAR, PR_PREEN_NOMSG }, | |
| /* Bad primary superblock */ | |
| @@ -10514,12 +10522,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error allocating inode bitmap */ | |
| { PR_1_ALLOCATE_IBITMAP_ERROR, | |
| - | "@A @i @B (%N): %m\n", |
| + | N_("@A @i @B (%N): %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Error allocating block bitmap */ | |
| { PR_1_ALLOCATE_BBITMAP_ERROR, | |
| - | "@A @b @B (%N): %m\n", |
| + | N_("@A @b @B (%N): %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Error allocating icount structure */ | |
| @@ -10579,17 +10587,17 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Non-zero size for device, fifo or socket inode */ | |
| { PR_1_SET_NONZSIZE, | |
| - | "Special (@v/socket/fifo) @i %i has non-zero size. ", |
| + | N_("Special (@v/socket/fifo) @i %i has non-zero size. "), |
| PROMPT_FIX, PR_PREEN_OK }, | |
| /* Filesystem revision is 0, but feature flags are set */ | |
| { PR_1_FS_REV_LEVEL, | |
| - | "@f has feature flag(s) set, but is a revision 0 @f. ", |
| + | N_("@f has feature flag(s) set, but is a revision 0 @f. "), |
| PROMPT_FIX, PR_PREEN_OK | PR_NO_OK }, | |
| /* Journal inode is not in use, but contains data */ | |
| { PR_1_JOURNAL_INODE_NOT_CLEAR, | |
| - | "@j @i is not in use, but contains data. ", |
| + | N_("@j @i is not in use, but contains data. "), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* Journal has bad mode */ | |
| @@ -10599,7 +10607,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Deal with inodes that were part of orphan linked list */ | |
| { PR_1_LOW_DTIME, | |
| - | N_("@i %i was part of the orphaned @i list. "), |
| + | N_("@i %i was part of the @o @i list. "), |
| PROMPT_FIX, PR_LATCH_LOW_DTIME, 0 }, | |
| /* Deal with inodes that were part of corrupted orphan linked | |
| @@ -10610,7 +10618,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error allocating refcount structure */ | |
| { PR_1_ALLOCATE_REFCOUNT, | |
| - | "@A refcount structure (%N): %m\n", |
| + | N_("@A refcount structure (%N): %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Error reading extended attribute block */ | |
| @@ -10630,7 +10638,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Extended attribute reference count incorrect */ | |
| { PR_1_EXTATTR_REFCOUNT, | |
| - | N_("@a @b %b has reference count %B, should be %N. "), |
| + | N_("@a @b %b has reference count %B, @s %N. "), |
| PROMPT_FIX, 0 }, | |
| /* Error writing Extended Attribute block while fixing refcount */ | |
| @@ -10640,12 +10648,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Multiple EA blocks not supported */ | |
| { PR_1_EA_MULTI_BLOCK, | |
| - | N_("@a @b %b has h_blocks > 1. "), |
| + | N_("@a @b %b has h_@bs > 1. "), |
| PROMPT_CLEAR, 0}, | |
| /* Error allocating EA region allocation structure */ | |
| { PR_1_EA_ALLOC_REGION, | |
| - | N_("Error allocating @a @b %b. "), |
| + | N_("@A @a @b %b. "), |
| PROMPT_ABORT, 0}, | |
| /* Error EA allocation collision */ | |
| @@ -10655,12 +10663,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Bad extended attribute name */ | |
| { PR_1_EA_BAD_NAME, | |
| - | N_("@a @b %b is corrupt (invalid name). "), |
| + | N_("@a @b %b is corrupt (@n name). "), |
| PROMPT_CLEAR, 0}, | |
| /* Bad extended attribute value */ | |
| { PR_1_EA_BAD_VALUE, | |
| - | N_("@a @b %b is corrupt (invalid value). "), |
| + | N_("@a @b %b is corrupt (@n value). "), |
| PROMPT_CLEAR, 0}, | |
| /* Inode too big (latch question) */ | |
| @@ -10694,7 +10702,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Invalid root node in HTREE directory */ | |
| { PR_1_HTREE_BADROOT, | |
| - | N_("@h %i has an invalid root node.\n"), |
| + | N_("@h %i has an @n root node.\n"), |
| PROMPT_CLEAR_HTREE, PR_PREEN_OK }, | |
| /* Unsupported hash version in HTREE directory */ | |
| @@ -10725,45 +10733,45 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* invalid inode->i_extra_isize */ | |
| { PR_1_EXTRA_ISIZE, | |
| - | N_("@i %i has a extra size (%IS) which is invalid\n"), |
| + | N_("@i %i has a extra size (%IS) which is @n\n"), |
| PROMPT_FIX, PR_PREEN_OK }, | |
| /* invalid ea entry->e_name_len */ | |
| { PR_1_ATTR_NAME_LEN, | |
| - | N_("@a in @i %i has a namelen (%N) which is invalid\n"), |
| + | N_("@a in @i %i has a namelen (%N) which is @n\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* invalid ea entry->e_value_size */ | |
| { PR_1_ATTR_VALUE_SIZE, | |
| - | N_("@a in @i %i has a value size (%N) which is invalid\n"), |
| + | N_("@a in @i %i has a value size (%N) which is @n\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* invalid ea entry->e_value_offs */ | |
| { PR_1_ATTR_VALUE_OFFSET, | |
| - | N_("@a in @i %i has a value offset (%N) which is invalid\n"), |
| + | N_("@a in @i %i has a value offset (%N) which is @n\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* invalid ea entry->e_value_block */ | |
| { PR_1_ATTR_VALUE_BLOCK, | |
| - | N_("@a in @i %i has a value block (%N) which is invalid (must be 0)\n"), |
| + | N_("@a in @i %i has a value @b (%N) which is @n (must be 0)\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* invalid ea entry->e_hash */ | |
| { PR_1_ATTR_HASH, | |
| - | N_("@a in @i %i has a hash (%N) which is invalid (must be 0)\n"), |
| + | N_("@a in @i %i has a hash (%N) which is @n (must be 0)\n"), |
| PROMPT_CLEAR, PR_PREEN_OK }, | |
| /* Pass 1b errors */ | |
| /* Pass 1B: Rescan for duplicate/bad blocks */ | |
| { PR_1B_PASS_HEADER, | |
| - | N_("Duplicate @bs found... invoking duplicate @b passes.\n" |
| - | "Pass 1B: Rescan for duplicate/bad @bs\n"), |
| + | N_("\nRunning additional passes to resolve @bs claimed by more than one @i...\n" |
| + | "Pass 1B: Rescanning for @m @bs\n"), |
| PROMPT_NONE, 0 }, | |
| /* Duplicate/bad block(s) header */ | |
| { PR_1B_DUP_BLOCK_HEADER, | |
| - | N_("Duplicate/bad @b(s) in @i %i:"), |
| + | N_("@m @b(s) in @i %i:"), |
| PROMPT_NONE, 0 }, | |
| /* Duplicate/bad block(s) in inode */ | |
| @@ -10783,7 +10791,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error allocating inode bitmap */ | |
| { PR_1B_ALLOCATE_IBITMAP_ERROR, | |
| - | N_("@A @i @B (inode_dup_map): %m\n"), |
| + | N_("@A @i @B (@i_dup_map): %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Error while iterating over blocks */ | |
| @@ -10793,25 +10801,25 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error adjusting EA refcount */ | |
| { PR_1B_ADJ_EA_REFCOUNT, | |
| - | N_("Error addjusting refcount for @a @b %b (@i %i): %m\n"), |
| + | N_("Error adjusting refcount for @a @b %b (@i %i): %m\n"), |
| PROMPT_NONE, 0 }, | |
| - | /* Pass 1C: Scan directories for inodes with dup blocks. */ |
| + | /* Pass 1C: Scan directories for inodes with multiply-claimed blocks. */ |
| { PR_1C_PASS_HEADER, | |
| - | N_("Pass 1C: Scan directories for @is with dup @bs.\n"), |
| + | N_("Pass 1C: Scanning directories for @is with @m @bs.\n"), |
| PROMPT_NONE, 0 }, | |
| - | /* Pass 1D: Reconciling duplicate blocks */ |
| + | /* Pass 1D: Reconciling multiply-claimed blocks */ |
| { PR_1D_PASS_HEADER, | |
| - | N_("Pass 1D: Reconciling duplicate @bs\n"), |
| + | N_("Pass 1D: Reconciling @m @bs\n"), |
| PROMPT_NONE, 0 }, | |
| /* File has duplicate blocks */ | |
| { PR_1D_DUP_FILE, | |
| N_("File %Q (@i #%i, mod time %IM) \n" | |
| - | " has %B duplicate @b(s), shared with %N file(s):\n"), |
| + | " has %B @m @b(s), shared with %N file(s):\n"), |
| PROMPT_NONE, 0 }, | |
| /* List of files sharing duplicate blocks */ | |
| @@ -10826,12 +10834,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Report of how many duplicate/bad inodes */ | |
| { PR_1D_NUM_DUP_INODES, | |
| - | N_("(There are %N @is containing duplicate/bad @bs.)\n\n"), |
| + | N_("(There are %N @is containing @m @bs.)\n\n"), |
| PROMPT_NONE, 0 }, | |
| /* Duplicated blocks already reassigned or cloned. */ | |
| { PR_1D_DUP_BLOCKS_DEALT, | |
| - | N_("Duplicated @bs already reassigned or cloned.\n\n"), |
| + | N_("@m @bs already reassigned or cloned.\n\n"), |
| PROMPT_NONE, 0 }, | |
| /* Clone duplicate/bad blocks? */ | |
| @@ -10855,12 +10863,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Bad inode number for '.' */ | |
| { PR_2_BAD_INODE_DOT, | |
| - | N_("Bad @i number for '.' in @d @i %i.\n"), |
| + | N_("@n @i number for '.' in @d @i %i.\n"), |
| PROMPT_FIX, 0 }, | |
| /* Directory entry has bad inode number */ | |
| { PR_2_BAD_INO, | |
| - | N_("@E has bad @i #: %Di.\n"), |
| + | N_("@E has @n @i #: %Di.\n"), |
| PROMPT_CLEAR, 0 }, | |
| /* Directory entry has deleted or unused inode */ | |
| @@ -10905,12 +10913,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* First entry in directory inode doesn't contain '.' */ | |
| { PR_2_1ST_NOT_DOT, | |
| - | N_("First @e '%Dn' (inode=%Di) in @d @i %i (%p) @s '.'\n"), |
| + | N_("First @e '%Dn' (@i=%Di) in @d @i %i (%p) @s '.'\n"), |
| PROMPT_FIX, 0 }, | |
| /* Second entry in directory inode doesn't contain '..' */ | |
| { PR_2_2ND_NOT_DOT_DOT, | |
| - | N_("Second @e '%Dn' (inode=%Di) in @d @i %i @s '..'\n"), |
| + | N_("Second @e '%Dn' (@i=%Di) in @d @i %i @s '..'\n"), |
| PROMPT_FIX, 0 }, | |
| /* i_faddr should be zero */ | |
| @@ -10940,7 +10948,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* inode has bad mode */ | |
| { PR_2_BAD_MODE, | |
| - | N_("@i %i (%Q) has a bad mode (%Im).\n"), |
| + | N_("@i %i (%Q) has @n mode (%Im).\n"), |
| PROMPT_CLEAR, 0 }, | |
| /* directory corrupted */ | |
| @@ -10995,7 +11003,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Final rec_len is wrong */ | |
| { PR_2_FINAL_RECLEN, | |
| - | N_("@E has rec_len of %Dr, should be %N.\n"), |
| + | N_("@E has rec_len of %Dr, @s %N.\n"), |
| PROMPT_FIX, 0 }, | |
| /* Error allocating icount structure */ | |
| @@ -11050,7 +11058,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Directory filetype incorrect */ | |
| { PR_2_BAD_FILETYPE, | |
| - | N_("@E has an incorrect filetype (was %Dt, should be %N).\n"), |
| + | N_("@E has an incorrect filetype (was %Dt, @s %N).\n"), |
| PROMPT_FIX, 0 }, | |
| /* Directory filetype set on filesystem */ | |
| @@ -11060,17 +11068,17 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Directory filename is null */ | |
| { PR_2_NULL_NAME, | |
| - | N_("@E has a zero-length name.\n"), |
| + | N_("@E has a @z name.\n"), |
| PROMPT_CLEAR, 0 }, | |
| /* Invalid symlink */ | |
| { PR_2_INVALID_SYMLINK, | |
| - | N_("Symlink %Q (@i #%i) is invalid.\n"), |
| + | N_("Symlink %Q (@i #%i) is @n.\n"), |
| PROMPT_CLEAR, 0 }, | |
| /* i_file_acl (extended attribute block) is bad */ | |
| { PR_2_FILE_ACL_BAD, | |
| - | N_("@a @b @F invalid (%If).\n"), |
| + | N_("@a @b @F @n (%If).\n"), |
| PROMPT_CLEAR, 0 }, | |
| /* Filesystem contains large files, but has no such flag in sb */ | |
| @@ -11100,7 +11108,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Clear invalid HTREE directory */ | |
| { PR_2_HTREE_CLEAR, | |
| - | N_("Invalid @h %d (%q). "), PROMPT_CLEAR, 0 }, |
| + | N_("@n @h %d (%q). "), PROMPT_CLEAR, 0 }, |
| /* Bad block in htree interior node */ | |
| { PR_2_HTREE_BADBLK, | |
| @@ -11109,22 +11117,22 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error adjusting EA refcount */ | |
| { PR_2_ADJ_EA_REFCOUNT, | |
| - | N_("Error addjusting refcount for @a @b %b (@i %i): %m\n"), |
| + | N_("Error adjusting refcount for @a @b %b (@i %i): %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Invalid HTREE root node */ | |
| { PR_2_HTREE_BAD_ROOT, | |
| - | N_("@p @h %d: root node is invalid\n"), |
| + | N_("@p @h %d: root node is @n\n"), |
| PROMPT_CLEAR_HTREE, PR_PREEN_OK }, | |
| /* Invalid HTREE limit */ | |
| { PR_2_HTREE_BAD_LIMIT, | |
| - | N_("@p @h %d: node (%B) has bad limit (%N)\n"), |
| + | N_("@p @h %d: node (%B) has @n limit (%N)\n"), |
| PROMPT_CLEAR_HTREE, PR_PREEN_OK }, | |
| /* Invalid HTREE count */ | |
| { PR_2_HTREE_BAD_COUNT, | |
| - | N_("@p @h %d: node (%B) has bad count (%N)\n"), |
| + | N_("@p @h %d: node (%B) has @n count (%N)\n"), |
| PROMPT_CLEAR_HTREE, PR_PREEN_OK }, | |
| /* HTREE interior node has out-of-order hashes in table */ | |
| @@ -11132,9 +11140,9 @@ static const struct e2fsck_problem problem_table[] = { | |
| N_("@p @h %d: node (%B) has an unordered hash table\n"), | |
| PROMPT_CLEAR_HTREE, PR_PREEN_OK }, | |
| - | /* Node in HTREE directory has bad depth */ |
| + | /* Node in HTREE directory has invalid depth */ |
| { PR_2_HTREE_BAD_DEPTH, | |
| - | N_("@p @h %d: node (%B) has bad depth\n"), |
| + | N_("@p @h %d: node (%B) has @n depth\n"), |
| PROMPT_NONE, 0 }, | |
| /* Duplicate directory entry found */ | |
| @@ -11236,7 +11244,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Couldn't fix parent directory -- couldn't find it */ | |
| { PR_3_FIX_PARENT_NOFIND, | |
| - | N_("Couldn't fix parent of @i %i: Couldn't find parent @d entry\n\n"), |
| + | N_("Couldn't fix parent of @i %i: Couldn't find parent @d @e\n\n"), |
| PROMPT_NONE, 0 }, | |
| /* Error allocating inode bitmap */ | |
| @@ -11315,12 +11323,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Unattached zero-length inode */ | |
| { PR_4_ZERO_LEN_INODE, | |
| - | "@u @z @i %i. ", |
| + | N_("@u @z @i %i. "), |
| PROMPT_CLEAR, PR_PREEN_OK|PR_NO_OK }, | |
| /* Unattached inode */ | |
| { PR_4_UNATTACHED_INODE, | |
| - | "@u @i %i\n", |
| + | N_("@u @i %i\n"), |
| PROMPT_CONNECT, 0 }, | |
| /* Inode ref count wrong */ | |
| @@ -11332,7 +11340,7 @@ static const struct e2fsck_problem problem_table[] = { | |
| N_("WARNING: PROGRAMMING BUG IN E2FSCK!\n" | |
| "\tOR SOME BONEHEAD (YOU) IS CHECKING A MOUNTED (LIVE) FILESYSTEM.\n" | |
| "@i_link_info[%i] is %N, @i.i_links_count is %Il. " | |
| - | "They should be the same!\n"), |
| + | "They @s the same!\n"), |
| PROMPT_NONE, 0 }, | |
| /* Pass 5 errors */ | |
| @@ -11430,12 +11438,12 @@ static const struct e2fsck_problem problem_table[] = { | |
| /* Error copying in replacement inode bitmap */ | |
| { PR_5_COPY_IBITMAP_ERROR, | |
| - | "Error copying in replacement @i @B: %m\n", |
| + | N_("Error copying in replacement @i @B: %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Error copying in replacement block bitmap */ | |
| { PR_5_COPY_BBITMAP_ERROR, | |
| - | "Error copying in replacement @b @B: %m\n", |
| + | N_("Error copying in replacement @b @B: %m\n"), |
| PROMPT_NONE, PR_FATAL }, | |
| /* Block range not used, but marked in bitmap */ | |
| @@ -13523,7 +13531,7 @@ static void check_resize_inode(e2fsck_t ctx) | |
| } | |
| } | |
| - | /* Read the resizde inode */ |
| + | /* Read the resize inode */ |
| pctx.ino = EXT2_RESIZE_INO; | |
| retval = ext2fs_read_inode(fs, EXT2_RESIZE_INO, &inode); | |
| if (retval) { | |
| @@ -14641,7 +14649,7 @@ static void usage(e2fsck_t ctx) | |
| fprintf(stderr, | |
| _("Usage: %s [-panyrcdfvstDFSV] [-b superblock] [-B blocksize]\n" | |
| "\t\t[-I inode_buffer_blocks] [-P process_inode_size]\n" | |
| - | "\t\t[-l|-L bad_blocks_file] [-C fd] [-j ext-journal]\n" |
| + | "\t\t[-l|-L bad_blocks_file] [-C fd] [-j external_journal]\n" |
| "\t\t[-E extended-options] device\n"), | |
| ctx->program_name); | |
| @@ -14655,7 +14663,7 @@ static void usage(e2fsck_t ctx) | |
| " -v Be verbose\n" | |
| " -b superblock Use alternative superblock\n" | |
| " -B blocksize Force blocksize when looking for superblock\n" | |
| - | " -j external-journal Set location of the external journal\n" |
| + | " -j external_journal Set location of the external journal\n" |
| " -l bad_blocks_file Add to badblocks list\n" | |
| " -L bad_blocks_file Set badblocks list\n" | |
| )); | |
| @@ -15080,16 +15088,19 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts) | |
| continue; | |
| } | |
| ctx->ext_attr_ver = ea_ver; | |
| - | } else |
| + | } else { |
| + | fprintf(stderr, _("Unknown extended option: %s\n"), |
| + | token); |
| extended_usage++; | |
| + | } |
| } | |
| if (extended_usage) { | |
| bb_error_msg_and_die( | |
| "Extended options are separated by commas, " | |
| "and may take an argument which\n" | |
| "is set off by an equals ('=') sign. " | |
| - | "Valid raid options are:\n" |
| - | "\tea_ver=<ea_version (1 or 2)\n\n"); |
| + | "Valid extended options are:\n" |
| + | "\tea_ver=<ea_version (1 or 2)>\n\n"); |
| } | |
| } | |
| @@ -12,6 +12,7 @@ | |
| */ | |
| #include <stdio.h> | |
| + | #include <stdlib.h> |
| #include <sys/types.h> | |
| #include <string.h> | |
| #include <grp.h> | |
| @@ -9,6 +9,7 @@ | |
| #include "e2p.h" | |
| #include <string.h> | |
| + | #include <stdlib.h> |
| static const char * const os_tab[] = | |
| { "Linux", | |
| @@ -30,7 +30,7 @@ | |
| * systems, as well as non-32 bit systems. | |
| */ | |
| - | int ext2fs_set_bit(int nr,void * addr) |
| + | int ext2fs_set_bit(unsigned int nr,void * addr) |
| { | |
| int mask, retval; | |
| unsigned char *ADDR = (unsigned char *) addr; | |
| @@ -42,7 +42,7 @@ int ext2fs_set_bit(int nr,void * addr) | |
| return retval; | |
| } | |
| - | int ext2fs_clear_bit(int nr, void * addr) |
| + | int ext2fs_clear_bit(unsigned int nr, void * addr) |
| { | |
| int mask, retval; | |
| unsigned char *ADDR = (unsigned char *) addr; | |
| @@ -54,7 +54,7 @@ int ext2fs_clear_bit(int nr, void * addr) | |
| return retval; | |
| } | |
| - | int ext2fs_test_bit(int nr, const void * addr) |
| + | int ext2fs_test_bit(unsigned int nr, const void * addr) |
| { | |
| int mask; | |
| const unsigned char *ADDR = (const unsigned char *) addr; | |
| @@ -15,9 +15,9 @@ | |
| #include <strings.h> | |
| - | extern int ext2fs_set_bit(int nr,void * addr); |
| - | extern int ext2fs_clear_bit(int nr, void * addr); |
| - | extern int ext2fs_test_bit(int nr, const void * addr); |
| + | extern int ext2fs_set_bit(unsigned int nr,void * addr); |
| + | extern int ext2fs_clear_bit(unsigned int nr, void * addr); |
| + | extern int ext2fs_test_bit(unsigned int nr, const void * addr); |
| extern __u16 ext2fs_swab16(__u16 val); | |
| extern __u32 ext2fs_swab32(__u32 val); | |
| @@ -330,6 +330,7 @@ typedef struct ext2_struct_inode_scan *ext2_inode_scan; | |
| #define EXT2_MF_ISROOT 2 | |
| #define EXT2_MF_READONLY 4 | |
| #define EXT2_MF_SWAP 8 | |
| + | #define EXT2_MF_BUSY 16 |
| /* | |
| * Ext2/linux mode flags. We define them here so that we don't need | |
| @@ -44,12 +44,14 @@ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size, | |
| unsigned long size, void *ptr) | |
| { | |
| void *p; | |
| - | void **pp = (void **)ptr; |
| - | p = realloc(*pp, size); |
| + | /* Use "memcpy" for pointer assignments here to avoid problems |
| + | * with C99 strict type aliasing rules. */ |
| + | memcpy(&p, ptr, sizeof (p)); |
| + | p = realloc(p, size); |
| if (!p) | |
| return EXT2_ET_NO_MEMORY; | |
| - | *pp = p; |
| + | memcpy(ptr, &p, sizeof (p)); |
| return 0; | |
| } | |
| @@ -23,7 +23,7 @@ | |
| #include <linux/fd.h> | |
| #endif | |
| - | #if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE) |
| + | #if defined(__linux__) && defined(_IO) && !defined(BLKSSZGET) |
| #define BLKSSZGET _IO(0x12,104)/* get block device sector size */ | |
| #endif | |
| @@ -339,20 +339,18 @@ int main(int argc, char **argv) | |
| exit(1); | |
| } | |
| printf("Device %s reports flags %02x\n", argv[1], mount_flags); | |
| + | if (mount_flags & EXT2_MF_BUSY) |
| + | printf("\t%s is apparently in use.\n", argv[1]); |
| if (mount_flags & EXT2_MF_MOUNTED) | |
| printf("\t%s is mounted.\n", argv[1]); | |
| - | |
| if (mount_flags & EXT2_MF_SWAP) | |
| printf("\t%s is a swap device.\n", argv[1]); | |
| - | |
| if (mount_flags & EXT2_MF_READONLY) | |
| printf("\t%s is read-only.\n", argv[1]); | |
| - | |
| if (mount_flags & EXT2_MF_ISROOT) | |
| printf("\t%s is the root filesystem.\n", argv[1]); | |
| if (mntpt[0]) | |
| printf("\t%s is mounted on %s.\n", argv[1], mntpt); | |
| - | |
| exit(0); | |
| } | |
| #endif /* DEBUG */ | |
| @@ -711,7 +711,7 @@ static void parse_extended_opts(struct ext2_super_block *sb_param, | |
| } | |
| fs_stride = strtoul(arg, &p, 0); | |
| if (*p || (fs_stride == 0)) { | |
| - | bb_error_msg("Invalid stride parameter"); |
| + | bb_error_msg("Invalid stride parameter: %s", arg); |
| r_usage++; | |
| continue; | |
| } | |
| @@ -735,7 +735,8 @@ static void parse_extended_opts(struct ext2_super_block *sb_param, | |
| continue; | |
| } | |
| if (resize <= sb_param->s_blocks_count) { | |
| - | bb_error_msg("The resize maximum must be greater than the filesystem size"); |
| + | bb_error_msg("The resize maximum must be greater " |
| + | "than the filesystem size"); |
| r_usage++; | |
| continue; | |
| } | |
| @@ -767,10 +768,10 @@ static void parse_extended_opts(struct ext2_super_block *sb_param, | |
| if (r_usage) { | |
| bb_error_msg_and_die( | |
| "\nBad options specified.\n\n" | |
| - | "Options are separated by commas, " |
| + | "Extended options are separated by commas, " |
| "and may take an argument which\n" | |
| "\tis set off by an equals ('=') sign.\n\n" | |
| - | "Valid raid options are:\n" |
| + | "Valid extended options are:\n" |
| "\tstride=<stride length in blocks>\n" | |
| "\tresize=<resize maximum size in blocks>\n"); | |
| } | |
| @@ -855,7 +856,7 @@ static int PRS(int argc, char *argv[]) | |
| if (b < EXT2_MIN_BLOCK_SIZE || | |
| b > EXT2_MAX_BLOCK_SIZE) { | |
| BLOCKSIZE_ERROR: | |
| - | bb_error_msg_and_die("bad block size - %s", optarg); |
| + | bb_error_msg_and_die("invalid block size - %s", optarg); |
| } | |
| mke2fs_warning_msg((blocksize > 4096), | |
| "blocksize %d not usable on most systems", | |
| @@ -871,7 +872,7 @@ BLOCKSIZE_ERROR: | |
| break; | |
| case 'f': | |
| if (safe_strtoi(optarg, &size) || size < EXT2_MIN_BLOCK_SIZE || size > EXT2_MAX_BLOCK_SIZE ){ | |
| - | bb_error_msg_and_die("bad fragment size - %s", optarg); |
| + | bb_error_msg_and_die("invalid fragment size - %s", optarg); |
| } | |
| param.s_log_frag_size = | |
| int_log2(size >> EXT2_MIN_BLOCK_LOG_SIZE); | |
| @@ -893,7 +894,7 @@ BLOCKSIZE_ERROR: | |
| if (safe_strtoi(optarg, &inode_ratio) | |
| || inode_ratio < EXT2_MIN_BLOCK_SIZE | |
| || inode_ratio > EXT2_MAX_BLOCK_SIZE * 1024) { | |
| - | bb_error_msg_and_die("bad inode ratio %s (min %d/max %d)", |
| + | bb_error_msg_and_die("invalid inode ratio %s (min %d/max %d)", |
| optarg, EXT2_MIN_BLOCK_SIZE, | |
| EXT2_MAX_BLOCK_SIZE); | |
| } | |
| @@ -912,7 +913,7 @@ BLOCKSIZE_ERROR: | |
| break; | |
| case 'm': | |
| if (safe_strtoi(optarg, &reserved_ratio) || reserved_ratio > 50 ) { | |
| - | bb_error_msg_and_die("bad reserved blocks percent - %s", optarg); |
| + | bb_error_msg_and_die("invalid reserved blocks percent - %s", optarg); |
| } | |
| break; | |
| case 'n': | |
| @@ -940,7 +941,7 @@ BLOCKSIZE_ERROR: | |
| #ifdef EXT2_DYNAMIC_REV | |
| case 'I': | |
| if (safe_strtoi(optarg, &inode_size)) { | |
| - | bb_error_msg_and_die("bad inode size - %s", optarg); |
| + | bb_error_msg_and_die("invalid inode size - %s", optarg); |
| } | |
| break; | |
| #endif | |
| @@ -1051,7 +1052,7 @@ BLOCKSIZE_ERROR: | |
| if (optind < argc) { | |
| param.s_blocks_count = parse_num_blocks(argv[optind++], | |
| param.s_log_block_size); | |
| - | mke2fs_error_msg_and_die(!param.s_blocks_count, "bad blocks count - %s", argv[optind - 1]); |
| + | mke2fs_error_msg_and_die(!param.s_blocks_count, "invalid blocks count - %s", argv[optind - 1]); |
| } | |
| if (optind < argc) | |
| bb_show_usage(); | |
| @@ -1165,11 +1166,16 @@ BLOCKSIZE_ERROR: | |
| } | |
| } | |
| + | if (!force && param.s_blocks_count >= (1 << 31)) { |
| + | bb_error_msg_and_die("Filesystem too large. No more than 2**31-1 blocks\n" |
| + | "\t (8TB using a blocksize of 4k) are currently supported."); |
| + | } |
| + | |
| if (inode_size) { | |
| if (inode_size < EXT2_GOOD_OLD_INODE_SIZE || | |
| inode_size > EXT2_BLOCK_SIZE(¶m) || | |
| inode_size & (inode_size - 1)) { | |
| - | bb_error_msg_and_die("bad inode size %d (min %d/max %d)", |
| + | bb_error_msg_and_die("invalid inode size %d (min %d/max %d)", |
| inode_size, EXT2_GOOD_OLD_INODE_SIZE, | |
| blocksize); | |
| } | |
| @@ -89,14 +89,20 @@ void check_mount(const char *device, int force, const char *type) | |
| bb_error_msg("Could not determine if %s is mounted", device); | |
| return; | |
| } | |
| - | if (!(mount_flags & EXT2_MF_MOUNTED)) |
| - | return; |
| + | if (mount_flags & EXT2_MF_MOUNTED) { |
| + | bb_error_msg("%s is mounted !", device); |
| + | force_check: |
| + | if (force) |
| + | bb_error_msg("badblocks forced anyways"); |
| + | else |
| + | bb_error_msg_and_die("it's not safe to run badblocks!"); |
| + | } |
| + | |
| + | if (mount_flags & EXT2_MF_BUSY) { |
| + | bb_error_msg("%s is apparently in use by the system", device); |
| + | goto force_check; |
| + | } |
| - | bb_error_msg("%s is mounted !", device); |
| - | if (force) |
| - | bb_error_msg("forcing anyways and ignoring /etc/mtab status"); |
| - | else |
| - | bb_error_msg_and_die("will not make a %s here!", type); |
| } | |
| void parse_journal_opts(char **journal_device, int *journal_flags, | |
| @@ -189,10 +195,14 @@ int figure_journal_size(int size, ext2_filsys fs) | |
| if (fs->super->s_blocks_count < 32768) | |
| j_blocks = 1024; | |
| - | else if (fs->super->s_blocks_count < 262144) |
| + | else if (fs->super->s_blocks_count < 256*1024) |
| j_blocks = 4096; | |
| - | else |
| + | else if (fs->super->s_blocks_count < 512*1024) |
| j_blocks = 8192; | |
| + | else if (fs->super->s_blocks_count < 1024*1024) |
| + | j_blocks = 16384; |
| + | else |
| + | j_blocks = 32768; |
| return j_blocks; | |
| } | |
| @@ -579,7 +579,7 @@ | |
| #define e2fsck_trivial_usage \ | |
| "[-panyrcdfvstDFSV] [-b superblock] [-B blocksize] " \ | |
| "[-I inode_buffer_blocks] [-P process_inode_size] " \ | |
| - | "[-l|-L bad_blocks_file] [-C fd] [-j ext-journal] " \ |
| + | "[-l|-L bad_blocks_file] [-C fd] [-j external_journal] " \ |
| "[-E extended-options] device" | |
| #define e2fsck_full_usage \ | |
| "Check a Linux ext2/ext3 file system.\n\n" \ | |