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