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