ind_block.c revision dc8ce3463791366ac844d3f0436709511fa09c49
1/* 2 * ind_block.c --- indirect block I/O routines 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 5 * 2001, 2002, 2003, 2004, 2005 by Theodore Ts'o. 6 * 7 * %Begin-Header% 8 * This file may be redistributed under the terms of the GNU Public 9 * License. 10 * %End-Header% 11 */ 12 13#include <stdio.h> 14#include <string.h> 15#if HAVE_UNISTD_H 16#include <unistd.h> 17#endif 18 19#include "ext2_fs.h" 20#include "ext2fs.h" 21 22errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf) 23{ 24 errcode_t retval; 25 blk_t *block_nr; 26 int i; 27 int limit = fs->blocksize >> 2; 28 29 if ((fs->flags & EXT2_FLAG_IMAGE_FILE) && 30 (fs->io != fs->image_io)) 31 memset(buf, 0, fs->blocksize); 32 else { 33 retval = io_channel_read_blk(fs->io, blk, 1, buf); 34 if (retval) 35 retval; 36 } 37#ifdef EXT2FS_ENABLE_SWAPFS 38 if (fs->flags & (EXT2_FLAG_SWAP_BYTES | EXT2_FLAG_SWAP_BYTES_READ)) { 39 block_nr = (blk_t *) buf; 40 for (i = 0; i < limit; i++, block_nr++) 41 *block_nr = ext2fs_swab32(*block_nr); 42 } 43#endif 44 return 0; 45} 46 47errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf) 48{ 49 blk_t *block_nr; 50 int i; 51 int limit = fs->blocksize >> 2; 52 53 if (fs->flags & EXT2_FLAG_IMAGE_FILE) 54 return 0; 55 56#ifdef EXT2FS_ENABLE_SWAPFS 57 if (fs->flags & (EXT2_FLAG_SWAP_BYTES | EXT2_FLAG_SWAP_BYTES_WRITE)) { 58 block_nr = (blk_t *) buf; 59 for (i = 0; i < limit; i++, block_nr++) 60 *block_nr = ext2fs_swab32(*block_nr); 61 } 62#endif 63 return io_channel_write_blk(fs->io, blk, 1, buf); 64} 65 66 67