Hey all -

I caught a bug report that users were seeing unaligned accesses using
reiserfsck on ia64. As expected, the cause of these was directly
accessing the unformatted node block pointers. These were cleaned up in
the kernel ages ago, so I took the time to fix reiserfsprogs as well.

I also noticed a couple of places where CPU-ordered block numbers were
being copied into disk-order buffers and fixed those when I saw them. I
have not done an endian safeness audit on the reiserfsprogs code in
quite some time.

debugreiserfs/{un,}pack.c may also need a look.

Attached is the patch.

-Jeff

--
Jeff Mahoney
SuSE Labs

diff -ruNp reiserfsprogs-3.6.17/debugreiserfs/debugreiserfs.c 
reiserfsprogs-3.6.17.fix/debugreiserfs/debugreiserfs.c
--- reiserfsprogs-3.6.17/debugreiserfs/debugreiserfs.c  2004-03-22 10:18:57.000000000 
-0500
+++ reiserfsprogs-3.6.17.fix/debugreiserfs/debugreiserfs.c      2004-05-20 
17:23:25.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "debugreiserfs.h"
+#include <asm/unaligned.h>
 
 reiserfs_filsys_t * fs;
 
@@ -108,7 +109,7 @@ static void print_disk_tree (reiserfs_fi
                                __u32 unfm_ptr;
                                
                                for (j =  0; j < (int)I_UNFM_NUM (ih); j ++) {
-                                       unfm_ptr = le32_to_cpu (ind_item [j]);
+                                       unfm_ptr = get_block_num (ind_item, j);
                                        if (unfm_ptr) {
                                                g_stat_info.nr_unformatted += 1;
                                        }
@@ -541,8 +542,8 @@ static void callback_badblock_print(reis
        tmp_ih = get_ih(badblock_path);
        ind_item = (__u32 *)get_item(badblock_path);
        
-       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++)
-               fprintf (fd, "%u\n", le32_to_cpu (*ind_item));
+       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++)
+               fprintf (fd, "%u\n", get_block_num (ind_item, i));
 
        pathrelse (badblock_path);
 }
diff -ruNp reiserfsprogs-3.6.17/fsck/check_tree.c 
reiserfsprogs-3.6.17.fix/fsck/check_tree.c
--- reiserfsprogs-3.6.17/fsck/check_tree.c      2004-05-13 11:03:28.000000000 -0400
+++ reiserfsprogs-3.6.17.fix/fsck/check_tree.c  2004-05-20 17:23:25.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "fsck.h"
+#include <asm/unaligned.h>
 
 #if 0
 struct check_relocated {
@@ -394,11 +395,11 @@ static int bad_direct_item (reiserfs_fil
 
 inline void handle_one_pointer (reiserfs_filsys_t * fs, 
                                struct buffer_head * bh,
-                               __u32 * ptr) 
+                               __u32 * item, int offset)
 {
     if (fsck_mode (fs) == FSCK_FIX_FIXABLE) {
        fsck_log (" - zeroed");
-       *ptr = 0;
+       put_block_num (item, offset, 0);
        mark_buffer_dirty (bh);
     } else {
        one_more_corruption (fs, FIXABLE);
@@ -423,7 +424,7 @@ static int bad_badblocks_item (reiserfs_
            return 0;
     
     for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-       if (!le32_to_cpu (ind [i])) {
+       if (!get_block_num (ind, i)) {
 /*         fsck_log ("%s: block %lu: badblocks item (%H) has zero pointer.",
                      __FUNCTION__, bh->b_blocknr, ih);
            
@@ -437,14 +438,14 @@ static int bad_badblocks_item (reiserfs_
        }
 
        /* check list of badblocks pointers */
-       if (le32_to_cpu (ind [i]) >= get_sb_block_count (fs->fs_ondisk_sb)) {
+       if (get_block_num (ind, i) >= get_sb_block_count (fs->fs_ondisk_sb)) {
            fsck_log ("%s: badblock pointer (block %lu) points out of disk spase 
(%lu)",
-                       __FUNCTION__, bh->b_blocknr, le32_to_cpu (ind [i]));
-           handle_one_pointer (fs, bh, &ind[i]);
+                       __FUNCTION__, bh->b_blocknr, get_block_num (ind, i));
+           handle_one_pointer (fs, bh, ind, i);
            fsck_log ("\n");
        }
 
-       if (did_we_meet_it (le32_to_cpu (ind [i]))) {
+       if (did_we_meet_it (get_block_num (ind, i))) {
            /* it can be
               1. not_data_block
                        delete pointer
@@ -452,23 +453,23 @@ static int bad_badblocks_item (reiserfs_
                  advice to run fix-fixable if there is no fatal errors
                  with list of badblocks, say that it could fix it. */
        
-           if (not_data_block (fs, le32_to_cpu (ind [i]))) {
+           if (not_data_block (fs, get_block_num (ind, i))) {
                fsck_log ("%s: badblock pointer (block %lu) points on fs metadata 
(%lu)",
-                         __FUNCTION__, bh->b_blocknr, le32_to_cpu (ind [i]));
-               handle_one_pointer (fs, bh, &ind[i]);
+                         __FUNCTION__, bh->b_blocknr, get_block_num (ind, i));
+               handle_one_pointer (fs, bh, ind, i);
                fsck_log ("\n");
            } else {
                one_more_corruption(fs, FIXABLE);
                fsck_log ("%s: badblock pointer (block %lu) points to a block (%lu) "
                          "which is in the tree already. Use badblock option (-B) to"
                          " fix the problem\n", __FUNCTION__, bh->b_blocknr, 
-                         le32_to_cpu(ind[i]));
+                         get_block_num (ind, i));
            }
 
            continue;
        }
        
-       we_met_it(le32_to_cpu(ind[i]));
+       we_met_it(get_block_num(ind, i));
     }
 
     return 0;
@@ -490,33 +491,31 @@ static int bad_indirect_item (reiserfs_f
     }
 
     for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-//     __u32 unfm_ptr;
 
        fsck_check_stat (fs)->unfm_pointers ++;
-//     unfm_ptr = le32_to_cpu (ind [i]);
-       if (!le32_to_cpu (ind [i])) {
+       if (!get_block_num (ind, i)) {
            fsck_check_stat (fs)->zero_unfm_pointers ++;
            continue;
        }
 
        /* check unformatted node pointer and mark it used in the
            control bitmap */
-       if (bad_block_number (fs, le32_to_cpu (ind [i]))) {
+       if (bad_block_number (fs, get_block_num (ind, i))) {
            fsck_log ("%s: block %lu: The item %k has the bad pointer (%d) to "
                      "the block (%lu)", __FUNCTION__, bh->b_blocknr, 
-                     &ih->ih_key, i, le32_to_cpu (ind [i]));
+                     &ih->ih_key, i, get_block_num (ind, i));
            
-           handle_one_pointer (fs, bh, &ind[i]);
+           handle_one_pointer (fs, bh, ind, i);
            fsck_log ("\n");
            continue;
        }
 
-        if (got_already (fs, le32_to_cpu (ind [i]))) {
+        if (got_already (fs, get_block_num (ind, i))) {
            fsck_log ("%s: block %lu: The item (%H) has the bad pointer (%d) "
                      "to the block (%lu), which is in tree already", 
-                     __FUNCTION__, bh->b_blocknr, ih, i, le32_to_cpu(ind[i]));
+                     __FUNCTION__, bh->b_blocknr, ih, i, get_block_num (ind, i));
            
-           handle_one_pointer (fs, bh, &ind [i]);
+           handle_one_pointer (fs, bh, ind, i);
            fsck_log ("\n");
             continue;
        }
diff -ruNp reiserfsprogs-3.6.17/fsck/pass0.c reiserfsprogs-3.6.17.fix/fsck/pass0.c
--- reiserfsprogs-3.6.17/fsck/pass0.c   2004-04-19 15:57:16.000000000 -0400
+++ reiserfsprogs-3.6.17.fix/fsck/pass0.c       2004-05-20 20:15:19.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "fsck.h"
+#include <asm/unaligned.h>
 
 
 
@@ -1288,7 +1289,7 @@ static void pass0_correct_leaf (reiserfs
 */
        ind_item = (__u32 *)B_I_PITEM (bh, ih);
        for (j = 0; j < (int)I_UNFM_NUM (ih); j ++) {
-           unfm_ptr = le32_to_cpu (ind_item [j]);
+           unfm_ptr = get_block_num (ind_item, j);
            if (!unfm_ptr)
                continue;
 #if 0
@@ -1439,10 +1440,10 @@ static int is_bad_indirect (struct item_
     for (i = 0; i < I_UNFM_NUM (ih); i ++) {
        __u32 * ind = (__u32 *)item;
 
-       if (le32_to_cpu (ind[i]) >= blocks) {
+       if (get_block_num (ind, i) >= blocks) {
            bad ++;
            fsck_log ("is_bad_indirect: %d-th pointer of item %H looks bad (%lu)\n",
-                     i, ih, le32_to_cpu (ind [i]));
+                     i, ih, get_block_num (ind, i));
            continue;
        }
     }
diff -ruNp reiserfsprogs-3.6.17/fsck/pass1.c reiserfsprogs-3.6.17.fix/fsck/pass1.c
--- reiserfsprogs-3.6.17/fsck/pass1.c   2004-02-17 07:20:40.000000000 -0500
+++ reiserfsprogs-3.6.17.fix/fsck/pass1.c       2004-05-20 17:23:39.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "fsck.h"
+#include <asm/unaligned.h>
 
 reiserfs_bitmap_t * bad_unfm_in_tree_once_bitmap;
 
@@ -105,7 +106,7 @@ static void indirect_in_tree (struct buf
     unp = (__u32 *)B_I_PITEM (bh, ih);
     
     for (i = 0; i < I_UNFM_NUM (ih); i ++) {
-       unfm_ptr = le32_to_cpu (unp[i]);
+       unfm_ptr = get_block_num (unp, i);
        if (unfm_ptr == 0)
            continue;
        if ((ret = still_bad_unfm_ptr_1 (unfm_ptr)))
@@ -394,8 +395,8 @@ static void pass1_correct_leaf (reiserfs
        /* correct indirect items */
        ind_item = (__u32 *)B_I_PITEM (bh, ih);
 
-       for (j = 0; j < I_UNFM_NUM (ih); j ++, ind_item ++) {
-           unfm_ptr = le32_to_cpu (*ind_item);
+       for (j = 0; j < I_UNFM_NUM (ih); j ++) {
+           unfm_ptr = get_block_num (ind_item, j);
 
            if (!unfm_ptr)
                continue;
@@ -409,7 +410,7 @@ static void pass1_correct_leaf (reiserfs
            /* 1. zero slots pointing to a leaf */
            if (is_used_leaf (unfm_ptr)) {
                dirty ++;
-               *ind_item = 0;
+               put_block_num (ind_item, j, 0);
                pass_1_stat (fs)->pointed_leaves ++;
                continue;
            }
@@ -424,7 +425,7 @@ static void pass1_correct_leaf (reiserfs
                else {
                    /* Yes, we have seen this pointer already, zero other pointers to 
it. */
                    dirty ++;
-                   *ind_item = 0;
+                   put_block_num (ind_item, j, 0);
                    pass_1_stat (fs)->non_unique_pointers ++;
                    continue;
                }
diff -ruNp reiserfsprogs-3.6.17/fsck/semantic_rebuild.c 
reiserfsprogs-3.6.17.fix/fsck/semantic_rebuild.c
--- reiserfsprogs-3.6.17/fsck/semantic_rebuild.c        2004-02-17 06:35:12.000000000 
-0500
+++ reiserfsprogs-3.6.17.fix/fsck/semantic_rebuild.c    2004-05-20 19:56:42.000000000 
-0400
@@ -174,7 +174,7 @@ int wrong_st_blocks (struct key * key, _
     if (S_ISREG (mode) || S_ISLNK (mode) || S_ISDIR (mode)) {
        if (*blocks != sd_blocks) {
            fsck_log ("vpf-10680: The %s %K has the wrong block count in the StatData "
-               "(%u)%s(%u)\n", S_ISDIR (mode) ? "directory" : "file",  key, 
sd_blocks, 
+               "(%u)%s(%u)\n", S_ISDIR (mode) ? "directory" : S_ISREG (mode) ? "file" 
: "link",  key, sd_blocks, 
                fsck_mode(fs) == FSCK_CHECK ? ", should be " : " - corrected to ", 
*blocks);
            ret = 1;
        }
diff -ruNp reiserfsprogs-3.6.17/fsck/ufile.c reiserfsprogs-3.6.17.fix/fsck/ufile.c
--- reiserfsprogs-3.6.17/fsck/ufile.c   2004-05-13 10:51:49.000000000 -0400
+++ reiserfsprogs-3.6.17.fix/fsck/ufile.c       2004-05-20 17:23:25.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "fsck.h"
+#include <asm/unaligned.h>
 
 static int do_items_have_the_same_type (struct item_head * ih, struct key * key)
 {
@@ -54,7 +55,7 @@ static unsigned long indirect_to_direct 
 
     // we do not know what length this item should be
     indirect = get_item (path);
-    unfm_ptr = le32_to_cpu (indirect [I_UNFM_NUM (ih) - 1]);
+    unfm_ptr = get_block_num (indirect, I_UNFM_NUM (ih) - 1);
     if (unfm_ptr && (unfm_bh = bread (bh->b_dev, unfm_ptr, bh->b_size))) {
         /* we can read the block */
        buf = unfm_bh->b_data;
@@ -569,10 +570,10 @@ static int create_first_item_of_file (st
 
            if (!was_in_tree) {
                for (i = 0; i < I_UNFM_NUM (ih); i++) {
-                   if (still_bad_unfm_ptr_2 (le32_to_cpu (ni[i])))
+                   if (still_bad_unfm_ptr_2 (get_block_num (ni, i)))
                        reiserfs_panic ("create_first_item_of_file: The file %K has a 
pointer to the bad block (%u)", 
                            &ih->ih_key, le32_to_cpu (unfm_ptr));
-                   mark_block_used (le32_to_cpu (ni[i]), 0);
+                   mark_block_used (get_block_num (ni, i), 0);
                }
            }
 
@@ -611,7 +612,7 @@ static unsigned long block_to_start (str
     return bh->b_blocknr;
 
   ih --;
-  return (B_I_POS_UNFM_POINTER (bh, ih, I_UNFM_NUM (ih) - 1)) ?: bh->b_blocknr;
+  return (get_block_num ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1)) ?: 
bh->b_blocknr;
 }
 
 
@@ -637,7 +638,7 @@ static void direct2indirect2 (unsigned l
            die ("direct2indirect: can not find first part of tail");
     }
 
-    unbh = reiserfsck_get_new_buffer (le32_to_cpu (unfm) ? le32_to_cpu (unfm) : 
block_to_start (path));
+    unbh = reiserfsck_get_new_buffer (unfm ? unfm : block_to_start (path));
     memset (unbh->b_data, 0, unbh->b_size);
 
     /* delete parts of tail coping their contents to new buffer */
@@ -717,7 +718,7 @@ static int append_to_unformatted_node (s
     int zero_number;
     
     bh = PATH_PLAST_BUFFER (path);
-    unfm_ptr = le32_to_cpu (B_I_POS_UNFM_POINTER (bh, ih, I_UNFM_NUM (ih) - 1));
+    unfm_ptr = get_block_num ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1);
 
     /* append to free space of the last unformatted node of indirect item ih */
     free_space = get_offset (&ih->ih_key) + fs->fs_blocksize * I_UNFM_NUM (ih) - 
get_offset (&comingih->ih_key);
@@ -749,7 +750,7 @@ static int append_to_unformatted_node (s
        /*if (unfm_ptr == 0 || unfm_ptr >= SB_BLOCK_COUNT (fs)) {*/
        unbh = reiserfsck_get_new_buffer (bh->b_blocknr);
        memset (unbh->b_data, 0, unbh->b_size);
-       B_I_POS_UNFM_POINTER (bh, ih, I_UNFM_NUM (ih) - 1) = unbh->b_blocknr;
+       put_block_num ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 1, 
unbh->b_blocknr);
        /*mark_block_unformatted (unbh->b_blocknr);*/
        mark_buffer_dirty (bh);
     }
@@ -802,7 +803,7 @@ int reiserfsck_append_file (struct item_
        mark_buffer_uptodate (unbh, 1);
 
        ni = getmem (UNFM_P_SIZE);
-       *ni = cpu_to_le32 (unbh->b_blocknr);
+       put_block_num (ni, 0, unbh->b_blocknr);
        count = 1;
        
        brelse (unbh);
@@ -823,9 +824,9 @@ int reiserfsck_append_file (struct item_
        
        if (!was_in_tree) {
            for (i = 0; i < count; i++ ) {
-               if (still_bad_unfm_ptr_2 (le32_to_cpu (ni[i])))
-                   die ("reiserfsck_append_file: Trying to insert a pointer to 
illegal block (%u)", le32_to_cpu (ni[i]));
-               mark_block_used (le32_to_cpu (ni[i]), 0);
+               if (still_bad_unfm_ptr_2 (get_block_num (ni, i)))
+                   die ("reiserfsck_append_file: Trying to insert a pointer to 
illegal block (%u)", get_block_num (ni, i));
+               mark_block_used (get_block_num (ni, i), 0);
            }
        }
 
@@ -894,7 +895,7 @@ static int overwrite_by_direct_item (str
     bh = PATH_PLAST_BUFFER (path);
     ih = PATH_PITEM_HEAD (path);
 
-    unfm_ptr = le32_to_cpu (B_I_POS_UNFM_POINTER (bh, ih, path->pos_in_item));
+    unfm_ptr = get_block_num ((__u32 *)B_I_PITEM(bh, ih), path->pos_in_item);
     unbh = 0;
 
     if (unfm_ptr != 0 && unfm_ptr < get_sb_block_count (fs->fs_ondisk_sb)) {
@@ -910,7 +911,7 @@ static int overwrite_by_direct_item (str
     if (unfm_ptr == 0 || unfm_ptr >= get_sb_block_count (fs->fs_ondisk_sb)) {
        if ((unbh = reiserfsck_get_new_buffer (bh->b_blocknr)) != NULL) {
            memset (unbh->b_data, 0, unbh->b_size);
-           B_I_POS_UNFM_POINTER (bh, ih, path->pos_in_item) = cpu_to_le32 
(unbh->b_blocknr);
+           put_block_num ((__u32 *)B_I_PITEM(bh, ih), path->pos_in_item,  
unbh->b_blocknr);
            mark_buffer_dirty (bh);
        } else {
            die ("overwrite_by_direct_item: Could not allocate a new block for new 
data");
@@ -1017,11 +1018,11 @@ static int overwrite_by_indirect_item (s
     }
   
     for (i = 0; i < to_copy; i ++) {
-       if (coming_item[i] != 0 && item_in_tree[i] == 0) {
+       if (get_block_num (coming_item, i) != 0 && get_block_num (item_in_tree, i) == 
0) {
            /* overwrite holes only by correct a pointer in the coming item
                which must be correct */
-           item_in_tree[i] = coming_item[i];
-           mark_block_used (le32_to_cpu (coming_item[i]), 0);
+           put_block_num (item_in_tree, i, get_block_num (coming_item, i));
+           mark_block_used (get_block_num (coming_item, i), 0);
            dirty ++;
        }
     }
@@ -1051,7 +1052,7 @@ static int reiserfsck_overwrite_file (st
                reiserfs_panic ("reiserfsck_overwrite_file: The second part of the 
tail %k can not"
                    " be overwritten by indirect item %k", &ih->ih_key, 
&comingih->ih_key);
            /* use pointer from coming indirect item */
-           unfm_ptr = le32_to_cpu (*(__u32 *)(item + *pos_in_coming_item * 
UNFM_P_SIZE));
+           unfm_ptr = get_block_num ((__u32 *)item, *pos_in_coming_item);
            if (!was_in_tree) {
                if (still_bad_unfm_ptr_2 (unfm_ptr))
                    die ("reiserfsck_overwrite_file: The pointer to the unformatted 
block (%u)"
diff -ruNp reiserfsprogs-3.6.17/fsck/ustree.c reiserfsprogs-3.6.17.fix/fsck/ustree.c
--- reiserfsprogs-3.6.17/fsck/ustree.c  2004-02-17 06:35:12.000000000 -0500
+++ reiserfsprogs-3.6.17.fix/fsck/ustree.c      2004-05-20 17:23:25.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "fsck.h"
+#include <asm/unaligned.h>
 
 
 /* key1 and key2 are pointer to deh_offset of the struct reiserfs_de_head */
@@ -54,19 +55,21 @@ static void free_unformatted_nodes (stru
     __u32 * punfm = (__u32 *)B_I_PITEM (bh, ih);
     unsigned int i;
 
-    for (i = 0; i < I_UNFM_NUM (ih); i ++, punfm ++)
-       if (*punfm != 0) {
+    for (i = 0; i < I_UNFM_NUM (ih); i ++) {
+        __u32 unfm = get_block_num (punfm, i);
+       if (unfm != 0) {
            struct buffer_head * to_be_forgotten;
 
-           to_be_forgotten = find_buffer (fs->fs_dev, le32_to_cpu (*punfm), 
fs->fs_blocksize);
+           to_be_forgotten = find_buffer (fs->fs_dev, unfm, fs->fs_blocksize);
            if (to_be_forgotten) {
                //atomic_inc(&to_be_forgotten->b_count);
                to_be_forgotten->b_count ++;
                bforget (to_be_forgotten);
            }
 
-           reiserfs_free_block (fs, le32_to_cpu (*punfm));
+           reiserfs_free_block (fs, unfm);
        }
+    }
 }
 
 void reiserfsck_delete_item (struct path * path, int temporary)
@@ -95,17 +98,18 @@ void reiserfsck_cut_from_item (struct pa
        die ("reiserfsck_cut_from_item: cut size == %d", cut_size);
 
     if (is_indirect_ih (ih = PATH_PITEM_HEAD (path))) {
-       __u32 unfm_ptr = B_I_POS_UNFM_POINTER (PATH_PLAST_BUFFER (path), ih, 
I_UNFM_NUM (ih) - 1);
+       struct buffer_head *bh = PATH_PLAST_BUFFER (path);
+       __u32 unfm_ptr = get_block_num ((__u32 *)B_I_PITEM(bh, ih), I_UNFM_NUM (ih) - 
1);
        if (unfm_ptr != 0) {
            struct buffer_head * to_be_forgotten;
 
-           to_be_forgotten = find_buffer (fs->fs_dev, le32_to_cpu (unfm_ptr), 
fs->fs_blocksize);
+           to_be_forgotten = find_buffer (fs->fs_dev, unfm_ptr, fs->fs_blocksize);
            if (to_be_forgotten) {
                //atomic_inc(&to_be_forgotten->b_count);
                to_be_forgotten->b_count ++;
                bforget (to_be_forgotten);
            }
-           reiserfs_free_block (fs, le32_to_cpu (unfm_ptr));
+           reiserfs_free_block (fs, unfm_ptr);
        }
     }
 
diff -ruNp reiserfsprogs-3.6.17/include/reiserfs_fs.h 
reiserfsprogs-3.6.17.fix/include/reiserfs_fs.h
--- reiserfsprogs-3.6.17/include/reiserfs_fs.h  2004-03-03 16:40:01.000000000 -0500
+++ reiserfsprogs-3.6.17.fix/include/reiserfs_fs.h      2004-05-20 17:23:25.000000000 
-0400
@@ -1423,6 +1423,16 @@ struct buffer_info {
                   ( get_offset(&(p_s_ih)->ih_key) <= (n_offset) && \
                     get_offset(&(p_s_ih)->ih_key) + 
get_bytes_number(p_s_ih,n_blocksize) > (n_offset) )
 
+/* these operate on indirect items, where you've got an array of ints
+** at a possibly unaligned location.  These are a noop on ia32
+**
+** p is the array of __u32, i is the index into the array, v is the value
+** to store there.
+*/
+#define get_block_num(p, i) le32_to_cpu(get_unaligned((p) + (i)))
+#define put_block_num(p, i, v) put_unaligned(cpu_to_le32(v), (p) + (i))
+
+
 /* get the item header */ 
 #define B_N_PITEM_HEAD(bh,item_num) ( (struct item_head * )((bh)->b_data + BLKH_SIZE) 
+ (item_num) )
 
@@ -1449,13 +1459,6 @@ struct buffer_info {
 #define MAX_DIRECT_ITEM_LEN(size) ((size) - BLKH_SIZE - 2*IH_SIZE - SD_SIZE - 
UNFM_P_SIZE)
 #define MAX_INDIRECT_ITEM_LEN(size) MAX_ITEM_LEN(size)
 
-/* indirect items consist of entries which contain blocknrs, pos
-   indicates which entry, and B_I_POS_UNFM_POINTER resolves to the
-   blocknr contained by the entry pos points to */
-#define B_I_POS_UNFM_POINTER(bh,ih,pos) (*(((__u32 *)B_I_PITEM(bh,ih)) + (pos)))
-
-
-
 /***************************************************************************/
 /*                    FUNCTION DECLARATIONS                                */
 /***************************************************************************/
diff -ruNp reiserfsprogs-3.6.17/reiserfscore/node_formats.c 
reiserfsprogs-3.6.17.fix/reiserfscore/node_formats.c
--- reiserfsprogs-3.6.17/reiserfscore/node_formats.c    2004-02-17 06:35:12.000000000 
-0500
+++ reiserfsprogs-3.6.17.fix/reiserfscore/node_formats.c        2004-05-20 
17:23:25.000000000 -0400
@@ -4,6 +4,7 @@
  */
 
 #include "includes.h"
+#include <asm/unaligned.h>
 
 int leaf_count_ih(char * buf, int blocksize) {
     struct item_head * ih;
@@ -202,9 +203,10 @@ int is_tree_node (struct buffer_head * b
 
 static int is_desc_block (char * buf, unsigned long buf_size)
 {
+    struct reiserfs_journal_desc *desc = (struct reiserfs_journal_desc *)buf;
     if (!memcmp(buf + buf_size - 12, JOURNAL_DESC_MAGIC, 8) &&
        //get_jdesc_len (desc) > 0)
-       le32_to_cpu(*((__u32*)(buf + 4))) > 0)
+       le32_to_cpu (desc->j2_len) > 0)
        return 1;
     return 0;
 }
@@ -495,7 +497,7 @@ static int is_bad_indirect (reiserfs_fil
     for (i = 0; i < I_UNFM_NUM (ih); i ++) {
        if (!ind [i])
            continue;
-       if (check_unfm_func && check_unfm_func (fs, le32_to_cpu(ind [i])))
+       if (check_unfm_func && check_unfm_func (fs, get_block_num (ind, i)))
            return 1;
     }
 
diff -ruNp reiserfsprogs-3.6.17/reiserfscore/reiserfslib.c 
reiserfsprogs-3.6.17.fix/reiserfscore/reiserfslib.c
--- reiserfsprogs-3.6.17/reiserfscore/reiserfslib.c     2004-02-17 07:20:40.000000000 
-0500
+++ reiserfsprogs-3.6.17.fix/reiserfscore/reiserfslib.c 2004-05-20 17:23:25.000000000 
-0400
@@ -7,6 +7,7 @@
 
 #include "includes.h"
 #include <linux/kdev_t.h>
+#include <asm/unaligned.h>
 
 struct key root_dir_key = {0, 0, {{0, 0},}};
 struct key parent_root_dir_key = {0, 0, {{0, 0},}};
@@ -1353,9 +1354,9 @@ void mark_badblock(reiserfs_filsys_t *fs
        tmp_ih = get_ih(badblock_path);
        ind_item = (__u32 *)get_item(badblock_path);
 
-       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++) {
+       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
                reiserfs_bitmap_set_bit(fs->fs_badblocks_bm, 
-                                       le32_to_cpu(*ind_item));
+                                       get_block_num(ind_item, i));
        }
        
        pathrelse (badblock_path);
diff -ruNp reiserfsprogs-3.6.17/resize_reiserfs/do_shrink.c 
reiserfsprogs-3.6.17.fix/resize_reiserfs/do_shrink.c
--- reiserfsprogs-3.6.17/resize_reiserfs/do_shrink.c    2004-02-17 06:35:12.000000000 
-0500
+++ reiserfsprogs-3.6.17.fix/resize_reiserfs/do_shrink.c        2004-05-20 
17:23:25.000000000 -0400
@@ -5,6 +5,7 @@
 
 #include "resize.h"
 #include <time.h>
+#include <asm/unaligned.h>
 
 static unsigned long int_node_cnt   = 0, int_moved_cnt   = 0;
 static unsigned long leaf_node_cnt  = 0, leaf_moved_cnt  = 0;
@@ -124,11 +125,11 @@ static unsigned long move_formatted_bloc
                                for (j = 0; j < I_UNFM_NUM(ih); j++) {
                                        unsigned long  unfm_block;
 
-                                       if (indirect [j] == 0) /* hole */
+                                       if (get_block_num (indirect, j) == 0) /* hole 
*/
                                                continue;
-                                       unfm_block = move_unformatted_block(fs, 
le32_to_cpu (indirect [j]), bnd, h + 1);
+                                       unfm_block = move_unformatted_block(fs, 
get_block_num (indirect, j), bnd, h + 1);
                                        if (unfm_block) {
-                                               indirect [j] = cpu_to_le32 
(unfm_block);
+                                               put_block_num (indirect, j, 
unfm_block);
                                                mark_buffer_dirty(bh);
                                        }
                                }
diff -ruNp reiserfsprogs-3.6.17/tune/tune.c reiserfsprogs-3.6.17.fix/tune/tune.c
--- reiserfsprogs-3.6.17/tune/tune.c    2004-02-17 07:20:40.000000000 -0500
+++ reiserfsprogs-3.6.17.fix/tune/tune.c        2004-05-20 17:23:25.000000000 -0400
@@ -6,6 +6,7 @@
 #define _GNU_SOURCE
 
 #include "tune.h"
+#include <asm/unaligned.h>
 
 #include <getopt.h>
 #include <stdarg.h>
@@ -229,15 +230,15 @@ static void callback_new_badblocks(reise
        tmp_ih = get_ih(badblock_path);
        ind_item = (__u32 *)get_item(badblock_path);
 
-       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++) {
+       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
                if (reiserfs_bitmap_test_bit(fs->fs_badblocks_bm, 
-                                            le32_to_cpu(*ind_item)))
+                                            get_block_num (ind_item, i)))
                {
                        message("Block %u is marked as bad already.", 
-                               le32_to_cpu(*ind_item));
+                               get_block_num (ind_item, i));
                        
                        reiserfs_bitmap_clear_bit(fs->fs_badblocks_bm, 
-                                                 le32_to_cpu(*ind_item));
+                                                 get_block_num (ind_item, i));
                }
        }
        
@@ -254,9 +255,9 @@ static void callback_clear_badblocks(rei
        tmp_ih = get_ih(badblock_path);
        ind_item = (__u32 *)get_item(badblock_path);
 
-       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++, ind_item++) {
+       for (i = 0; i < I_UNFM_NUM(tmp_ih); i++) {
                reiserfs_bitmap_clear_bit(fs->fs_bitmap2, 
-                                         le32_to_cpu(*ind_item));
+                                         get_block_num(ind_item, i));
        }
        
        pathrelse (badblock_path);

Reply via email to