#include "fs.h"
#include "errors.h"
#include "debug.h"
+#include "bootinfo.h"
#include "reiserfs/reiserfs.h"
/* Exported in struct fs_t */
-static int reiserfs_open( struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name );
+static int reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+ struct boot_fspec_t *fspec);
static int reiserfs_read( struct boot_file_t *file, unsigned int size,
void *buffer );
static int
-reiserfs_open( struct boot_file_t *file, const char *dev_name,
- struct partition_t *part, const char *file_name )
+reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+ struct boot_fspec_t *fspec)
{
static char buffer[1024];
+ char *dev_name = fspec->dev;
+ char *file_name = fspec->file;
DEBUG_ENTER;
DEBUG_OPEN;
memset( INFO, 0, sizeof(struct reiserfs_state) );
INFO->file = file;
- if (part)
+ if (fspec->part)
{
DEBUG_F( "Determining offset for partition %d\n", part->part_number );
INFO->partition_offset = ((uint64_t)part->part_start) * part->blocksize;
else
INFO->partition_offset = 0;
- sprintf( buffer, "%s:%d", dev_name, 0 ); /* 0 is full disk in OF */
+ strncpy(buffer, dev_name, 1020);
+ if (_machine != _MACH_bplan)
+ strcat(buffer, ":0"); /* 0 is full disk in (non-buggy) OF */
+
file->of_device = prom_open( buffer );
DEBUG_F( "Trying to open dev_name=%s; filename=%s; partition offset=%Lu\n",
buffer, file_name, INFO->partition_offset );
static __inline__ __u32
-log2( __u32 word )
+reiserfs_log2( __u32 word )
{
int i = 0;
while( word && (word & (1 << ++i)) == 0 );
while ( transactions-- > 0 )
{
int i = 0;
- int j_len;
+ int j_len = 0;
if ( *journal_table != 0xffffffff )
{
/* Search for the blockNr in cached journal */
- j_len = le32_to_cpu(*journal_table++);
+ j_len = le32_to_cpu((*journal_table)++);
while ( i++ < j_len )
{
if ( le32_to_cpu(*journal_table++) == blockNr )
INFO->version = le16_to_cpu(super.s_version);
INFO->blocksize = le16_to_cpu(super.s_blocksize);
- INFO->blocksize_shift = log2( INFO->blocksize );
+ INFO->blocksize_shift = reiserfs_log2( INFO->blocksize );
INFO->journal_block = le32_to_cpu(super.s_journal_block);
INFO->journal_block_count = le32_to_cpu(super.s_orig_journal_size);
cache = CACHE( depth );
else
{
- cache = read_tree_node( INFO->blocks[depth], --depth );
+ /* Save depth as using it twice as args to read_tree_node()
+ * has undefined behaviour */
+ __u16 d = depth;
+ cache = read_tree_node( INFO->blocks[d], --depth );
if ( !cache )
return 0;
}