summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2009-10-15 14:14:32 +0200
committerKarel Zak <kzak@redhat.com>2009-11-30 16:23:17 +0100
commitae3a2071fbb133f866154f0410bd32a6d8ca81a2 (patch)
treeaa84892496ef39bc134f614ffedc24990d866f1a
parent583f03f77a3d85380b801960b0458fe75d477468 (diff)
downloadutil-linux-old-ae3a2071fbb133f866154f0410bd32a6d8ca81a2.tar.gz
fsck.minix: fix broken zone checking
This bug has been introduced by commit 95356e8b744439336925eeb36f01399f1ee8a5e9. The fsck.minix code assumes that isset() macro returns boolean, unfortunately the generic implementation from libc returns integer. This patch also add a fallback for the bitmap macros to include/bitops.h. Reported-by: "Andries E. Brouwer" <Andries.Brouwer@cwi.nl> Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--disk-utils/fsck.minix.c6
-rw-r--r--disk-utils/mkfs.minix.c4
-rw-r--r--include/bitops.h16
3 files changed, 21 insertions, 5 deletions
diff --git a/disk-utils/fsck.minix.c b/disk-utils/fsck.minix.c
index af54c987..74d1793c 100644
--- a/disk-utils/fsck.minix.c
+++ b/disk-utils/fsck.minix.c
@@ -100,12 +100,12 @@
#include <termios.h>
#include <mntent.h>
#include <sys/stat.h>
-#include <sys/param.h>
#include <signal.h>
#include "minix.h"
#include "nls.h"
#include "pathnames.h"
+#include "bitops.h"
#ifndef __linux__
#define volatile
@@ -170,8 +170,8 @@ static unsigned char * zone_count = NULL;
static void recursive_check(unsigned int ino);
static void recursive_check2(unsigned int ino);
-#define inode_in_use(x) (isset(inode_map,(x)))
-#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1))
+#define inode_in_use(x) (isset(inode_map,(x)) != 0)
+#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1) != 0)
#define mark_inode(x) (setbit(inode_map,(x)),changed=1)
#define unmark_inode(x) (clrbit(inode_map,(x)),changed=1)
diff --git a/disk-utils/mkfs.minix.c b/disk-utils/mkfs.minix.c
index e669ec6b..5f50d667 100644
--- a/disk-utils/mkfs.minix.c
+++ b/disk-utils/mkfs.minix.c
@@ -77,6 +77,7 @@
#include "minix.h"
#include "nls.h"
#include "pathnames.h"
+#include "bitops.h"
#define MINIX_ROOT_INO 1
#define MINIX_BAD_INO 2
@@ -132,8 +133,7 @@ static unsigned short good_blocks_table[MAX_GOOD_BLOCKS];
static int used_good_blocks = 0;
static unsigned long req_nr_inodes = 0;
-#define inode_in_use(x) (isset(inode_map,(x)))
-#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1))
+#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1) != 0)
#define mark_inode(x) (setbit(inode_map,(x)))
#define unmark_inode(x) (clrbit(inode_map,(x)))
diff --git a/include/bitops.h b/include/bitops.h
index e6eaff18..e283b835 100644
--- a/include/bitops.h
+++ b/include/bitops.h
@@ -4,6 +4,22 @@
#include <stdint.h>
#include <endian.h>
+/*
+ * Bit map related macros. Usually provided by libc.
+ */
+#include <sys/param.h>
+
+#ifndef NBBY
+# define NBBY CHAR_BIT
+#endif
+
+#ifndef setbit
+# define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY))
+# define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+# define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY)))
+# define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#endif
+
#if !defined __BYTE_ORDER || !(__BYTE_ORDER == __LITTLE_ENDIAN) && !(__BYTE_ORDER == __BIG_ENDIAN)
#error missing __BYTE_ORDER
#endif