import most of e2fsprogs 1.38 updates
authorMike Frysinger <vapier@gentoo.org>
Wed, 8 Mar 2006 07:03:27 +0000 (07:03 -0000)
committerMike Frysinger <vapier@gentoo.org>
Wed, 8 Mar 2006 07:03:27 +0000 (07:03 -0000)
22 files changed:
e2fsprogs/blkid/blkid.h
e2fsprogs/blkid/blkidP.h
e2fsprogs/blkid/cache.c
e2fsprogs/blkid/dev.c
e2fsprogs/blkid/devno.c
e2fsprogs/blkid/probe.c
e2fsprogs/blkid/probe.h
e2fsprogs/blkid/read.c
e2fsprogs/blkid/tag.c
e2fsprogs/e2fsbb.h
e2fsprogs/e2fsck.c
e2fsprogs/e2p/ls.c
e2fsprogs/e2p/ostype.c
e2fsprogs/ext2fs/bitops.c
e2fsprogs/ext2fs/bitops.h
e2fsprogs/ext2fs/ext2fs.h
e2fsprogs/ext2fs/ext2fs_inline.c
e2fsprogs/ext2fs/getsectsize.c
e2fsprogs/ext2fs/ismounted.c
e2fsprogs/mke2fs.c
e2fsprogs/util.c
include/usage.h

index 3bb0e78d895d71fafc71d0c8d7543c4bcd905d65..c051b2b859a6dbfb21266185097de719043a080e 100644 (file)
@@ -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);
index 759dfcd877ff2f3aebc651cd04358880d8eb914b..4ae9763d23f3593f17d0f21f6c5228e60788cfdc 100644 (file)
@@ -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 */
index daccb30b3f142bd9cb37e216df0852d31ed05572..9c9b8c7e47fd98808590703f7dddceea611c940f 100644 (file)
@@ -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,
index 04cf8b5fae70bdee34db09fdb070b9aedda0a31e..5d56c5096a4c81935727da9a8e3c1d0402a185c7 100644 (file)
@@ -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
index 2979280f7b7c6214cffa5e981eeac4df1bfa02b6..89119945c733a7af9e83f1b552a50b2b58d7128d 100644 (file)
@@ -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));
        }
 
 
index 36f7177b865efc05fba07bbe3726a77a76ed63ad..5ee8a200ed1ab7b181af35ed38ea3865c3d26e54 100644 (file)
@@ -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));
        }
 
index 530b8efe260c203a4bdeb1e161605d253a7c4191..134913f597de721d9669cc44d78dfb10ac4a8530 100644 (file)
@@ -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];
 };
 
index 08a3162f3104906b18f15e6d7415ee503de884e3..5f7422b0c9be7e689f7cd8b45077e1d32428c0f4 100644 (file)
 
 #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;
index 51615d4a5c178fb822f1c47f93424db303798606..61642464d9664bb35f1d1ec2a8ce78bb44a44fa8 100644 (file)
@@ -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
index 74c4e5b621be1e863f6111704fbd1cef9cabae6b..ddd196644cbd68843f4d9edece5c4b370baf51d3 100644 (file)
@@ -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
index 18dfd00b67ae60ec0a0cdee29bb240163ec0d918..fb1e772a45a79e440058371924a6a5e9490265f2 100644 (file)
@@ -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");
        }
 }
 
index 0c91345e1d05af9f5544185853733adccf7370c2..ee83ab64c3ec1284bb27adcbbc23ba81cce98244 100644 (file)
@@ -12,6 +12,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
 #include <grp.h>
index 46230631e91bd4626b8c6326fa27b9f9f920af99..2ea59cbe1a3004a033aa06de33d72dcf61c75a6b 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "e2p.h"
 #include <string.h>
+#include <stdlib.h>
 
 static const char * const os_tab[] =
        { "Linux",
index e44e10cf4265e08a6ecd2a3b001baf7cde90e27f..77ac2a61f70904fd86d04be1f93d9f369539c69e 100644 (file)
@@ -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;
index 4dba050c8f74daf499cf9e0d9e9eb5fb7595cab2..5e727d186e09d99d3b61716349399b985e48880b 100644 (file)
@@ -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);
 
index 7d2a436956069945173ea567c9e19a94a544b2e6..b8752a56e73d2a771c6fd4ba1d1286119845a33e 100644 (file)
@@ -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
index 73d393d20a1fcd623ae901e211de9554f9bfb0fc..a363b1992d1f467b577a21052166945eeb0a7fde 100644 (file)
@@ -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;
 }
 
index b561660baae4afe144d9ab8aaebc69e21e98a4ec..36871f2363dc7ffd460a265a29fe941213ad3171 100644 (file)
@@ -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
 
index 2395ccaed13669046cebdc0c8cc3e86a54fe714c..125fe244b2b0895787a792fe21610acfc97e7687 100644 (file)
@@ -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 */
index 09d42aacff8696d897dffde1db9b4c58c3cd29bc..e6a1392c9fad373340ef3acafe171382c57a58c3 100644 (file)
@@ -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(&param) ||
                    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);
                }
index 3902f7ef3acf5c1bd86c2cf9fc56bf60253becc2..537021df7f3c357ea4f6cfd8c7e24b3257d0e784 100644 (file)
@@ -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;
 }
index 2e2ef8595e6c5378a7d29166c7f982a5d6a1c158..660c9e7021af12fa43405a107b7b19007f12c353 100644 (file)
 #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" \