Hi,
so here is a diff to something
Note that all of this is in a totally unacceptable state, I just thought
I'd diff up the dir where I randomly patched stuff shown in gdb when the
bus error hits in case someone else wants to know what is up.
Kind regards
T.
--
Thomas Viehmann, http://thomas.viehmann.net/
diff -urN jfsutils-1.1.12~/debian/changelog jfsutils-1.1.12/debian/changelog
--- jfsutils-1.1.12~/debian/changelog 2008-10-14 23:39:32.000000000 +0200
+++ jfsutils-1.1.12/debian/changelog 2008-10-14 23:37:49.000000000 +0200
@@ -1,3 +1,10 @@
+jfsutils (1.1.12-2.1) UNRELEASED; urgency=low
+
+ * Non-maintainer upload.
+ *
+
+ -- Thomas Viehmann <[EMAIL PROTECTED]> Mon, 06 Oct 2008 21:27:06 +0000
+
jfsutils (1.1.12-2) unstable; urgency=low
* use different linking parameter on alpha to avoid FTBFS (Closes: #490881)
diff -urN jfsutils-1.1.12~/debian/rules jfsutils-1.1.12/debian/rules
--- jfsutils-1.1.12~/debian/rules 2008-10-14 23:39:32.000000000 +0200
+++ jfsutils-1.1.12/debian/rules 2008-10-14 23:38:05.000000000 +0200
@@ -24,6 +24,10 @@
ifeq ($(DEB_BUILD_ARCH),alpha)
LDFLAGS += -Wl,--no-relax
endif
+ifeq ($(DEB_BUILD_ARCH),sparc)
+ ## -O2 makes memcpy not work for unaligned data
+ CFLAGS += -O0
+endif
DEB_CONFIGURE_USER_FLAGS := --sbindir=/sbin
DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(CURDIR)/debian/tmp
diff -urN jfsutils-1.1.12~/fsck/fsckmeta.c jfsutils-1.1.12/fsck/fsckmeta.c
--- jfsutils-1.1.12~/fsck/fsckmeta.c 2006-06-05 21:31:40.000000000 +0200
+++ jfsutils-1.1.12/fsck/fsckmeta.c 2008-10-14 23:37:36.000000000 +0200
@@ -3541,14 +3541,14 @@
if ((!inorecptr->selected_to_rls) && (!inorecptr->ignore_alloc_blks)) {
/* no problems found in the tree yet */
- if (inoptr->di_nblocks != agg_recptr->this_inode.all_blks) {
+ if (__read64s_ua(inoptr->di_nblocks) != __read64s_ua(agg_recptr->this_inode.all_blks)) {
/* number of blocks is wrong. tree must be bad */
#ifdef _JFS_DEBUG
printf("bad num blocks: agg ino: %ld(t) "
"di_nblocks = %lld(t) "
"this_inode.all_blks = %lld(t)\n",
- inoidx, inoptr->di_nblocks,
- agg_recptr->this_inode.all_blks);
+ inoidx, __read64s_ua(inoptr->di_nblocks),
+ __read64s_ua(agg_recptr->this_inode.all_blks));
#endif
inorecptr->selected_to_rls = 1;
inorecptr->ignore_alloc_blks = 1;
@@ -3570,8 +3570,8 @@
max_size = agg_recptr->this_inode.data_size;
}
- if ((inoptr->di_size > max_size)
- || (inoptr->di_size < min_size)) {
+ if ((__read64s_ua(inoptr->di_size) > max_size)
+ || (__read64s_ua(inoptr->di_size) < min_size)) {
/*
* object size (in bytes) is wrong.
* tree must be bad.
@@ -3581,7 +3581,7 @@
"minsize = %lld(t) maxsize = %lld(t) "
"di_size = %lld(t)\n",
inoidx, min_size, max_size,
- inoptr->di_size);
+ __read64s_ua(inoptr->di_size));
#endif
inorecptr->selected_to_rls = 1;
inorecptr->ignore_alloc_blks = 1;
diff -urN jfsutils-1.1.12~/fsck/fsckpfs.c jfsutils-1.1.12/fsck/fsckpfs.c
--- jfsutils-1.1.12~/fsck/fsckpfs.c 2007-08-23 06:01:40.000000000 +0200
+++ jfsutils-1.1.12/fsck/fsckpfs.c 2008-10-14 23:37:37.000000000 +0200
@@ -2324,6 +2324,12 @@
agg_recptr->ino_buf_1st_ino = (iag_num << L2INOSPERIAG)
+ (iag_extidx << L2INOSPEREXT);
agg_recptr->ino_fsnum = it_number;
+ printf("#1, %p\n",agg_recptr);
+ printf("#2, %p\n",&(agg_recptr->ino_ixpxd));
+ printf("#3, %p\n",iag_ptr);
+ printf("#4, %p\n",iag_ptr->inoext);
+ printf("#5, %p\n",&(iag_ptr->inoext[iag_extidx]));
+
memcpy((void *)&(agg_recptr->ino_ixpxd),
(void *) &(iag_ptr->inoext[iag_extidx]), sizeof (pxd_t));
is_aggregate ? (agg_recptr->ino_for_aggregate = -1) :
diff -urN jfsutils-1.1.12~/fsck/fsckwsp.c jfsutils-1.1.12/fsck/fsckwsp.c
--- jfsutils-1.1.12~/fsck/fsckwsp.c 2006-06-05 21:31:40.000000000 +0200
+++ jfsutils-1.1.12/fsck/fsckwsp.c 2008-10-14 23:42:03.000000000 +0200
@@ -21,6 +21,9 @@
#include <time.h>
#include <unistd.h>
#include <errno.h>
+#include <sys/types.h>
+#include <jfs_types.h>
+#include <jfs_byteorder.h>
/* defines and includes common among the fsck.jfs modules */
#include "xfsckint.h"
@@ -1163,7 +1166,7 @@
/* got the fileset IT inode */
agg_recptr->fset_imap.num_iags =
- (inoptr->di_size / SIZE_OF_MAP_PAGE) - 1;
+ (__read64s_ua(inoptr->di_size) / SIZE_OF_MAP_PAGE) - 1;
/*
* a high estimate of the inodes
* allocated for the fileset
@@ -1473,6 +1476,7 @@
time_t Current_Time;
int64_t this_device_offset = 0;
int I_am_logredo = 0;
+ struct fsck_blk_map_hdr blkmp_ctlptr;
ewbmc_rc =
alloc_wrksp(sizeof (struct fsck_blk_map_hdr), dynstg_blkmap_hdr,
@@ -1481,30 +1485,32 @@
if (ewbmc_rc == FSCK_OK) {
/* allocated and initialized blk map ctl page */
/* fill eyecatcher */
- strncpy(agg_recptr->blkmp_ctlptr->hdr.eyecatcher,
+ memcpy(&blkmp_ctlptr, &agg_recptr->blkmp_ctlptr, sizeof(blkmp_ctlptr));
+ strncpy(blkmp_ctlptr.hdr.eyecatcher,
fbmh_eyecatcher_string, strlen(fbmh_eyecatcher_string));
- agg_recptr->blkmp_ctlptr->hdr.super_buff_addr = (char *) sb_ptr;
- agg_recptr->blkmp_ctlptr->hdr.agg_record_addr =
+ blkmp_ctlptr.hdr.super_buff_addr = (char *) sb_ptr;
+ blkmp_ctlptr.hdr.agg_record_addr =
(char *) agg_recptr;
- agg_recptr->blkmp_ctlptr->hdr.bmap_record_addr =
+ blkmp_ctlptr.hdr.bmap_record_addr =
(char *) bmap_recptr;
- agg_recptr->blkmp_ctlptr->hdr.fscklog_full =
+ blkmp_ctlptr.hdr.fscklog_full =
agg_recptr->fscklog_full;
- agg_recptr->blkmp_ctlptr->hdr.fscklog_buf_allocated =
+ blkmp_ctlptr.hdr.fscklog_buf_allocated =
agg_recptr->fscklog_buf_allocated;
- agg_recptr->blkmp_ctlptr->hdr.fscklog_buf_alloc_err =
+ blkmp_ctlptr.hdr.fscklog_buf_alloc_err =
agg_recptr->fscklog_buf_alloc_err;
- agg_recptr->blkmp_ctlptr->hdr.fscklog_agg_offset =
+ blkmp_ctlptr.hdr.fscklog_agg_offset =
agg_recptr->ondev_fscklog_byte_offset;
Current_Time = time(NULL);
fsck_DateTime = localtime(&Current_Time);
- sprintf(&(agg_recptr->blkmp_ctlptr->hdr.start_time[0]),
+ sprintf(&(blkmp_ctlptr.hdr.start_time[0]),
"%d/%d/%d %d:%02d:%02d", fsck_DateTime->tm_mon + 1,
fsck_DateTime->tm_mday,
(fsck_DateTime->tm_year + 1900),
fsck_DateTime->tm_hour, fsck_DateTime->tm_min,
fsck_DateTime->tm_sec);
+ memcpy(&agg_recptr->blkmp_ctlptr, &blkmp_ctlptr, sizeof(blkmp_ctlptr));
if (!(agg_recptr->processing_readonly)) {
/*
diff -urN jfsutils-1.1.12~/include/jfs_byteorder.h jfsutils-1.1.12/include/jfs_byteorder.h
--- jfsutils-1.1.12~/include/jfs_byteorder.h 2005-11-22 21:43:54.000000000 +0100
+++ jfsutils-1.1.12/include/jfs_byteorder.h 2008-10-14 23:37:30.000000000 +0200
@@ -25,6 +25,7 @@
#elif HAVE_ENDIAN_H
# include <endian.h>
#endif
+#include <string.h>
#define __swab16(x) \
({ \
@@ -53,6 +54,7 @@
(((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
})
+
#define __swab64(x) \
({ \
uint64_t __x = (x); \
@@ -67,6 +69,52 @@
(uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \
})
+static inline void __inplace_swab64_nonaligned(unsigned char *c1) {
+ uint64_t tmp;
+ unsigned char* c2 = (unsigned char *) &tmp+7;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2-- = *c1++;
+ *c2 = *c1++;
+ memcpy(c1-8,c2,8);
+}
+
+typedef union {
+ uint64_t a;
+ struct {
+ uint32_t b1;
+ uint32_t b2;
+ };
+} uint64_as_uint32_t;
+typedef union {
+ int64_t a;
+ struct {
+ uint32_t b1;
+ uint32_t b2;
+ };
+} int64_as_uint32_t;
+
+static inline int64_t __read_nonaligned_s64 (int64_as_uint32_t c1) {
+ int64_as_uint32_t c2;
+ c2.b1 = c1.b1;
+ c2.b2 = c1.b2;
+ return c2.a;
+}
+
+static inline uint64_t __read_nonaligned_u64 (uint64_as_uint32_t c1) {
+ uint64_as_uint32_t c2;
+ c2.b1 = c1.b1;
+ c2.b2 = c1.b2;
+ return c2.a;
+}
+
+// ifdef for SPARC only
+#define __read64u_ua(x) __read_nonaligned_u64((uint64_as_uint32_t) x)
+#define __read64s_ua(x) __read_nonaligned_s64((int64_as_uint32_t) x)
#if (BYTE_ORDER == LITTLE_ENDIAN)
#define __cpu_to_le16(x) ((uint16_t)(x))
@@ -77,6 +125,7 @@
#define __le24_to_cpu(x) ((uint32_t)(x))
#define __le32_to_cpu(x) ((uint32_t)(x))
#define __le64_to_cpu(x) ((uint64_t)(x))
+ #define __inplace_le64_to_cpu_nonaligned(x)
#elif (BYTE_ORDER == BIG_ENDIAN)
#define __cpu_to_le16(x) __swab16(x)
#define __cpu_to_le24(x) __swab24(x)
@@ -86,6 +135,7 @@
#define __le24_to_cpu(x) __swab24(x)
#define __le32_to_cpu(x) __swab32(x)
#define __le64_to_cpu(x) __swab64(x)
+ #define __inplace_le64_to_cpu_nonaligned(x) (__inplace_swab64_nonaligned((unsigned char *)(&x)))
#else
# error "JFS works only on big- or littleendian machines"
#endif
diff -urN jfsutils-1.1.12~/jfsutils.spec jfsutils-1.1.12/jfsutils.spec
--- jfsutils-1.1.12~/jfsutils.spec 2007-08-24 22:26:01.000000000 +0200
+++ jfsutils-1.1.12/jfsutils.spec 1970-01-01 01:00:00.000000000 +0100
@@ -1,43 +0,0 @@
-Name : jfsutils
-Version : 1.1.12
-Release : 1
-Group : System/Kernel
-
-Summary : IBM JFS utility programs
-
-Copyright : GPL
-Packager : JFS/Linux team <[EMAIL PROTECTED]>
-URL : http://jfs.sourceforge.net/
-
-Buildroot : %{_tmppath}/%{name}-%{version}
-Source : %{name}-%{version}.tar.gz
-
-
-%Description
-Utilities for managing IBM's Journaled File System (JFS) under Linux. The
-following utilities are available: jfs_fsck - initiate replay of the JFS
-transaction log, and check and repair a JFS formatted device. jfs_fscklog -
-extract a log from the JFS fsck workspace into a file and/or display it.
-jfs_logdump - dump a JFS formatted device's journal log. jfs_mkfs - create
-a JFS formatted partition. jfs_tune - adjust tunable parameters of the JFS
-file system. jfs_debugfs - shell-type JFS file system editor.
-
-
-%Prep
-%setup -q
-
-%Build
-CFLAGS="${RPM_OPT_FLAGS}" ./configure --mandir=/usr/share/man/en/
-make
-
-%Install
-make install DESTDIR=${RPM_BUILD_ROOT}
-
-%Clean
-rm -rf ${RPM_BUILD_ROOT}
-
-%Files
-%defattr(-,root,root)
-/sbin/*
-%{_mandir}/en/man8/*
-%doc AUTHORS COPYING INSTALL NEWS README ChangeLog
diff -urN jfsutils-1.1.12~/libfs/fsckwsp.h jfsutils-1.1.12/libfs/fsckwsp.h
--- jfsutils-1.1.12~/libfs/fsckwsp.h 2005-11-22 21:43:55.000000000 +0100
+++ jfsutils-1.1.12/libfs/fsckwsp.h 2008-10-14 23:37:41.000000000 +0200
@@ -394,7 +394,7 @@
struct fsck_agg_record {
char eyecatcher[8];
uint32_t ondev_jlog_fsblk_length;
- int64_t ondev_jlog_fsblk_offset;
+ int64_t ondev_jlog_fsblk_offset;
int64_t ondev_wsp_byte_length;
int64_t ondev_wsp_byte_offset;
uint32_t ondev_wsp_fsblk_length;
diff -urN jfsutils-1.1.12~/libfs/jfs_endian.c jfsutils-1.1.12/libfs/jfs_endian.c
--- jfsutils-1.1.12~/libfs/jfs_endian.c 2006-11-02 23:37:13.000000000 +0100
+++ jfsutils-1.1.12/libfs/jfs_endian.c 2008-10-14 23:37:41.000000000 +0200
@@ -77,8 +77,8 @@
di->di_number = __le32_to_cpu(di->di_number);
di->di_gen = __le32_to_cpu(di->di_gen);
- di->di_size = __le64_to_cpu(di->di_size);
- di->di_nblocks = __le64_to_cpu(di->di_nblocks);
+ __inplace_le64_to_cpu_nonaligned(di->di_size);
+ __inplace_le64_to_cpu_nonaligned(di->di_nblocks);
di->di_nlink = __le32_to_cpu(di->di_nlink);
di->di_uid = __le32_to_cpu(di->di_uid);
di->di_gid = __le32_to_cpu(di->di_gid);
@@ -352,26 +352,25 @@
fsck_bmap_h->cbblrec.fs_blksize = __le32_to_cpu(fsck_bmap_h->cbblrec.fs_blksize);
fsck_bmap_h->cbblrec.lv_blksize = __le32_to_cpu(fsck_bmap_h->cbblrec.lv_blksize);
fsck_bmap_h->cbblrec.fs_lv_ratio = __le32_to_cpu(fsck_bmap_h->cbblrec.fs_lv_ratio);
- fsck_bmap_h->cbblrec.fs_last_metablk = __le64_to_cpu(fsck_bmap_h->cbblrec.fs_last_metablk);
- fsck_bmap_h->cbblrec.fs_first_wspblk = __le64_to_cpu(fsck_bmap_h->cbblrec.fs_first_wspblk);
+ __inplace_le64_to_cpu_nonaligned(fsck_bmap_h->cbblrec.fs_last_metablk);
+ __inplace_le64_to_cpu_nonaligned(fsck_bmap_h->cbblrec.fs_first_wspblk);
fsck_bmap_h->cbblrec.total_bad_blocks =
__le32_to_cpu(fsck_bmap_h->cbblrec.total_bad_blocks);
fsck_bmap_h->cbblrec.resolved_blocks = __le32_to_cpu(fsck_bmap_h->cbblrec.resolved_blocks);
fsck_bmap_h->cbblrec.reloc_extents = __le32_to_cpu(fsck_bmap_h->cbblrec.reloc_extents);
- fsck_bmap_h->cbblrec.reloc_blocks = __le64_to_cpu(fsck_bmap_h->cbblrec.reloc_blocks);
+ __inplace_le64_to_cpu_nonaligned(fsck_bmap_h->cbblrec.reloc_blocks);
fsck_bmap_h->cbblrec.LVM_lists = __le32_to_cpu(fsck_bmap_h->cbblrec.LVM_lists);
fsck_bmap_h->hdr.last_entry_pos = __le32_to_cpu(fsck_bmap_h->hdr.last_entry_pos);
fsck_bmap_h->hdr.next_entry_pos = __le32_to_cpu(fsck_bmap_h->hdr.next_entry_pos);
fsck_bmap_h->hdr.return_code = __le32_to_cpu(fsck_bmap_h->hdr.return_code);
- fsck_bmap_h->hdr.fscklog_agg_offset = __le64_to_cpu(fsck_bmap_h->hdr.fscklog_agg_offset);
+ __inplace_le64_to_cpu_nonaligned(fsck_bmap_h->hdr.fscklog_agg_offset);
fsck_bmap_h->hdr.num_logwrite_errors = __le32_to_cpu(fsck_bmap_h->hdr.num_logwrite_errors);
/* struct fscklog_error logerr[125] */
for (i = 0; i < 125; i++) {
- fsck_bmap_h->hdr.logerr[i].err_offset =
- __le64_to_cpu(fsck_bmap_h->hdr.logerr[i].err_offset);
+ __inplace_le64_to_cpu_nonaligned(fsck_bmap_h->hdr.logerr[i].err_offset);
fsck_bmap_h->hdr.logerr[i].bytes_written =
__le32_to_cpu(fsck_bmap_h->hdr.logerr[i].bytes_written);
fsck_bmap_h->hdr.logerr[i].io_retcode =
@@ -416,7 +415,7 @@
/* iag in jfs_logmgr.h */
- ia_t->agstart = __le64_to_cpu(ia_t->agstart);
+ __inplace_le64_to_cpu_nonaligned(ia_t->agstart);
ia_t->iagnum = __le32_to_cpu(ia_t->iagnum);
ia_t->inofreefwd = __le32_to_cpu(ia_t->inofreefwd);
ia_t->inofreeback = __le32_to_cpu(ia_t->inofreeback);
@@ -598,8 +597,8 @@
/* xtpage_t in jfs_xtree.h */
/* struct xtheader header; */
- xtp_t->header.next = __le64_to_cpu(xtp_t->header.next);
- xtp_t->header.prev = __le64_to_cpu(xtp_t->header.prev);
+ __inplace_le64_to_cpu_nonaligned(xtp_t->header.next);
+ __inplace_le64_to_cpu_nonaligned(xtp_t->header.prev);
xtp_t->header.maxentry = __le16_to_cpu(xtp_t->header.maxentry);
xtp_t->header.rsrvd2 = __le16_to_cpu(xtp_t->header.rsrvd2);
diff -urN jfsutils-1.1.12~/libfs/log_work.c jfsutils-1.1.12/libfs/log_work.c
--- jfsutils-1.1.12~/libfs/log_work.c 2006-06-04 23:37:29.000000000 +0200
+++ jfsutils-1.1.12/libfs/log_work.c 2008-10-14 23:37:41.000000000 +0200
@@ -2412,7 +2412,7 @@
xad_t *xad_p;
pxd_t pxd1;
struct iag_data *imp;
- struct dinode *dip = 0;
+ struct dinode dip;
int32_t xlen, xlength;
int16_t nword;
int8_t upd_possible = 0;
@@ -2713,7 +2713,7 @@
*/
if (ino_rem == 0) { /* inode base segment */
- dip = (struct dinode *) data;
+ memcpy(&dip, data, sizeof(dip));
if (ln == 1) {
/* ibase only */
if (db->db_ibase & mask_8)
@@ -2798,7 +2798,7 @@
* this case, we will mark block map to show
* the whole inode extent (all 4 pages) as
* allocated */
- allocate = (dip->di_nlink != 0);
+ allocate = (dip.di_nlink != 0);
inoext_alloc |= allocate;
/*
* There is only one fileset per aggregate, so
@@ -2807,8 +2807,8 @@
*/
if (ld->log.redopage.inode == FILESYSTEM_I) {
rc = markImap(&vopen[vol].fsimap_lst,
- __le32_to_cpu(dip->di_number),
- dip->di_ixpxd, allocate, vol);
+ __le32_to_cpu(dip.di_number),
+ dip.di_ixpxd, allocate, vol);
if (rc) {
fsck_send_msg(lrdo_UPPGMIMPFAIL, rc);
return (rc);
@@ -2824,7 +2824,7 @@
*/
if (!allocate)
- doNoRedoFile(ld, __le32_to_cpu(dip->di_number));
+ doNoRedoFile(ld, __le32_to_cpu(dip.di_number));
}
} else if ((ld->log.redopage.type & (LOG_BTROOT | LOG_XTREE))
== (LOG_BTROOT | LOG_XTREE)) {
@@ -3107,7 +3107,7 @@
/*
* figure out which IAG and which extent
*/
- iag_num = INOTOIAG(__le32_to_cpu(dip->di_number));
+ iag_num = INOTOIAG(__le32_to_cpu(dip.di_number));
imp = vopen[vol].fsimap_lst.imap_wsp[(iag_num + 1)
].imap_data;
@@ -3121,18 +3121,18 @@
].imap_data;
}
/* end first touch to this IAG */
- ino = __le32_to_cpu(dip->di_number) & (INOSPERIAG - 1);
+ ino = __le32_to_cpu(dip.di_number) & (INOSPERIAG - 1);
extno = ino >> L2INOSPEREXT;
/*
* make sure the IAG points to it correctly
*/
- imp->inoext[extno] = dip->di_ixpxd;
+ imp->inoext[extno] = dip.di_ixpxd;
}
/* end fileset owned */
/*
* make sure the block map shows it allocated
*/
- rc = markBmap((struct dmap *) vopen[vol].bmap_ctl, dip->di_ixpxd, 1, vol);
+ rc = markBmap((struct dmap *) vopen[vol].bmap_ctl, dip.di_ixpxd, 1, vol);
if (rc) {
fsck_send_msg(lrdo_UPPGMBMPFAIL, rc);
return (rc);
diff -urN jfsutils-1.1.12~/libfs/super.c jfsutils-1.1.12/libfs/super.c
--- jfsutils-1.1.12~/libfs/super.c 2005-11-22 21:43:55.000000000 +0100
+++ jfsutils-1.1.12/libfs/super.c 2008-10-14 23:37:41.000000000 +0200
@@ -162,14 +162,14 @@
*/
int ujfs_put_superblk(FILE *fp, struct superblock *sb, int16_t is_primary)
{
- char buf[SIZE_OF_SUPER];
+ struct superblock buf[(SIZE_OF_SUPER+sizeof(*sb)-1)/sizeof(*sb)];
int rc;
memset(buf, 0, SIZE_OF_SUPER);
memcpy(buf, sb, sizeof (*sb));
/* swap if on big endian machine */
- ujfs_swap_superblock((struct superblock *) buf);
+ ujfs_swap_superblock(buf);
rc = ujfs_rw_diskblocks(fp, (is_primary ? SUPER1_OFF : SUPER2_OFF),
SIZE_OF_SUPER, buf, PUT);