~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/fs/reiserfs/dev.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  (C) Copyright 2003 - 2004
 
3
 *  Sysgo AG, <www.elinos.com>, Pavel Bartusek <pba@sysgo.com>
 
4
 *
 
5
 * SPDX-License-Identifier:     GPL-2.0+
 
6
 */
 
7
 
 
8
 
 
9
#include <common.h>
 
10
#include <config.h>
 
11
#include <reiserfs.h>
 
12
 
 
13
#include "reiserfs_private.h"
 
14
 
 
15
static block_dev_desc_t *reiserfs_block_dev_desc;
 
16
static disk_partition_t *part_info;
 
17
 
 
18
 
 
19
void reiserfs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
 
20
{
 
21
        reiserfs_block_dev_desc = rbdd;
 
22
        part_info = info;
 
23
}
 
24
 
 
25
 
 
26
int reiserfs_devread (int sector, int byte_offset, int byte_len, char *buf)
 
27
{
 
28
        char sec_buf[SECTOR_SIZE];
 
29
        unsigned block_len;
 
30
/*
 
31
        unsigned len = byte_len;
 
32
        u8 *start = buf;
 
33
*/
 
34
        /*
 
35
        *  Check partition boundaries
 
36
        */
 
37
        if (sector < 0
 
38
            || ((sector + ((byte_offset + byte_len - 1) >> SECTOR_BITS))
 
39
            >= part_info->size)) {
 
40
/*              errnum = ERR_OUTSIDE_PART; */
 
41
                printf (" ** reiserfs_devread() read outside partition\n");
 
42
                return 0;
 
43
        }
 
44
 
 
45
        /*
 
46
         *  Get the read to the beginning of a partition.
 
47
         */
 
48
        sector += byte_offset >> SECTOR_BITS;
 
49
        byte_offset &= SECTOR_SIZE - 1;
 
50
 
 
51
#if defined(DEBUG)
 
52
        printf (" <%d, %d, %d> ", sector, byte_offset, byte_len);
 
53
#endif
 
54
 
 
55
 
 
56
        if (reiserfs_block_dev_desc == NULL)
 
57
                return 0;
 
58
 
 
59
 
 
60
        if (byte_offset != 0) {
 
61
                /* read first part which isn't aligned with start of sector */
 
62
                if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev,
 
63
                    part_info->start + sector, 1,
 
64
                    (unsigned long *)sec_buf) != 1) {
 
65
                        printf (" ** reiserfs_devread() read error\n");
 
66
                        return 0;
 
67
                }
 
68
                memcpy(buf, sec_buf+byte_offset, min(SECTOR_SIZE-byte_offset, byte_len));
 
69
                buf+=min(SECTOR_SIZE-byte_offset, byte_len);
 
70
                byte_len-=min(SECTOR_SIZE-byte_offset, byte_len);
 
71
                sector++;
 
72
        }
 
73
 
 
74
        /* read sector aligned part */
 
75
        block_len = byte_len & ~(SECTOR_SIZE-1);
 
76
        if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev,
 
77
            part_info->start + sector, block_len/SECTOR_SIZE,
 
78
            (unsigned long *)buf) != block_len/SECTOR_SIZE) {
 
79
                printf (" ** reiserfs_devread() read error - block\n");
 
80
                return 0;
 
81
        }
 
82
        buf+=block_len;
 
83
        byte_len-=block_len;
 
84
        sector+= block_len/SECTOR_SIZE;
 
85
 
 
86
        if ( byte_len != 0 ) {
 
87
                /* read rest of data which are not in whole sector */
 
88
                if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev,
 
89
                    part_info->start + sector, 1,
 
90
                    (unsigned long *)sec_buf) != 1) {
 
91
                        printf (" ** reiserfs_devread() read error - last part\n");
 
92
                        return 0;
 
93
                }
 
94
                memcpy(buf, sec_buf, byte_len);
 
95
        }
 
96
 
 
97
        return 1;
 
98
}