ind_block.c revision 126a291c768b523bc228b276d3bea82675a86d09
17faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/* 27faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * ind_block.c --- indirect block I/O routines 37faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * 47faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 57faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * 2001, 2002, 2003, 2004, 2005 by Theodore Ts'o. 67faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * 77faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * %Begin-Header% 87faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * This file may be redistributed under the terms of the GNU Public 97faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * License. 107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * %End-Header% 117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <stdio.h> 147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <string.h> 157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if HAVE_UNISTD_H 167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <unistd.h> 177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif 187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include "ext2_fs.h" 207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include "ext2fs.h" 217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezerrcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf) 237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez errcode_t retval; 257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez blk_t *block_nr; 267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int i; 277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int limit = fs->blocksize >> 2; 287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if ((fs->flags & EXT2_FLAG_IMAGE_FILE) && 307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez (fs->io != fs->image_io)) 317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez memset(buf, 0, fs->blocksize); 327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez else { 337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez retval = io_channel_read_blk(fs->io, blk, 1, buf); 347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (retval) 357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return retval; 367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifdef WORDS_BIGENDIAN 387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez block_nr = (blk_t *) buf; 397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (i = 0; i < limit; i++, block_nr++) 407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez *block_nr = ext2fs_swab32(*block_nr); 417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif 427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezerrcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf) 467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez blk_t *block_nr; 487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int i; 497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez int limit = fs->blocksize >> 2; 507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez if (fs->flags & EXT2_FLAG_IMAGE_FILE) 527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return 0; 537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifdef WORDS_BIGENDIAN 557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez block_nr = (blk_t *) buf; 567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez for (i = 0; i < limit; i++, block_nr++) 577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez *block_nr = ext2fs_swab32(*block_nr); 587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return io_channel_write_blk(fs->io, blk, 1, buf); 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez