X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Ffs_ext2.c;h=a85958f0323f54e4d73c00ce158d8bc70208f8d1;hp=3240ce215ac802c6164f459f2f06df7e67c937d0;hb=ad973226cb9266ce5cf6946833387c0549c4f3f2;hpb=3a57377b5279a98ad98ef4b535eb0516099bc737 diff --git a/second/fs_ext2.c b/second/fs_ext2.c index 3240ce2..a85958f 100644 --- a/second/fs_ext2.c +++ b/second/fs_ext2.c @@ -35,6 +35,7 @@ #include "fs.h" #include "errors.h" #include "debug.h" +#include "bootinfo.h" #define FAST_VERSION #define MAX_READ_RANGE 256 @@ -45,15 +46,15 @@ typedef int FILE; #include "ext2fs/ext2fs.h" static int ext2_open( struct boot_file_t* file, - const char* dev_name, struct partition_t* part, - const char* file_name); + struct boot_fspec_t* fspec); static int ext2_read( struct boot_file_t* file, unsigned int size, void* buffer); static int ext2_seek( struct boot_file_t* file, unsigned int newpos); static int ext2_close( struct boot_file_t* file); +static unsigned int ext2_ino_size(struct boot_file_t *file); struct fs_t ext2_filesystem = { @@ -61,7 +62,8 @@ struct fs_t ext2_filesystem = ext2_open, ext2_read, ext2_seek, - ext2_close + ext2_close, + ext2_ino_size, }; /* IO manager structure for the ext2 library */ @@ -107,7 +109,7 @@ static unsigned long read_total; static unsigned long read_max; static struct boot_file_t* read_cur_file; static errcode_t read_result; -static char* read_buffer; +static unsigned char* read_buffer; static int read_dump_range(void); static int read_iterator(ext2_filsys fs, blk_t *blocknr, int lg_block, void *private); @@ -122,14 +124,15 @@ void com_err (const char *a, long i, const char *fmt,...) static int ext2_open( struct boot_file_t* file, - const char* dev_name, struct partition_t* part, - const char* file_name) + struct boot_fspec_t* fspec) { int result = 0; int error = FILE_ERR_NOTFOUND; static char buffer[1024]; int ofopened = 0; + char *dev_name = fspec->dev; + char *file_name = fspec->file; DEBUG_ENTER; DEBUG_OPEN; @@ -138,7 +141,8 @@ ext2_open( struct boot_file_t* file, DEBUG_LEAVE(FILE_ERR_FSBUSY); return FILE_ERR_FSBUSY; } - if (file->device_kind != FILE_DEVICE_BLOCK) { + if (file->device_kind != FILE_DEVICE_BLOCK + && file->device_kind != FILE_DEVICE_ISCSI) { DEBUG_LEAVE(FILE_ERR_BADDEV); return FILE_ERR_BADDEV; } @@ -170,7 +174,8 @@ ext2_open( struct boot_file_t* file, /* Open the OF device for the entire disk */ strncpy(buffer, dev_name, 1020); - strcat(buffer, ":0"); + if (_machine != _MACH_bplan) + strcat(buffer, ":0"); DEBUG_F("<%s>\n", buffer); @@ -562,6 +567,16 @@ ext2_close( struct boot_file_t* file) return 0; } +static unsigned int ext2_ino_size(struct boot_file_t *file) +{ + struct ext2_inode ei; + + if (ext2fs_read_inode(fs, file->inode, &ei)) + return 0; + + return ei.i_size; +} + static errcode_t linux_open (const char *name, int flags, io_channel * channel) { io_channel io;