source: mainline/uspace/lib/ext2/libext2_filesystem.c@ 36bca8eb

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 36bca8eb was 36bca8eb, checked in by Martin Sucha <sucha14@…>, 15 years ago

Add some more superblock members and function to read a superblock

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (c) 2011 Martin Sucha
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libext2
30 * @{
31 */
32/**
33 * @file
34 */
35
36#include "libext2.h"
37#include <errno.h>
38#include <libblock.h>
39#include <mem.h>
40#include <malloc.h>
41
42int ext2_superblock_read_direct(ext2_superblock_t **superblock,
43 devmap_handle_t dev) {
44 int rc;
45 size_t phys_block_size;
46 size_t buf_size;
47 uint8_t *buffer;
48 size_t first_block;
49 size_t last_block;
50 size_t blocks;
51 size_t offset;
52 ext2_superblock_t *tmp_superblock;
53
54 rc = block_get_bsize(dev, &phys_block_size);
55 if (rc != EOK) {
56 return rc;
57 }
58
59 // calculate superblock position and required space
60 first_block = EXT2_SUPERBLOCK_OFFSET / phys_block_size;
61 offset = EXT2_SUPERBLOCK_OFFSET % phys_block_size;
62 last_block = EXT2_SUPERBLOCK_LAST_BYTE / phys_block_size;
63 blocks = last_block - first_block + 1;
64 buf_size = blocks * phys_block_size;
65
66 // read the superblock into memory
67 buffer = malloc(buf_size);
68 if (buffer == NULL) {
69 return ENOMEM;
70 }
71
72 rc = block_read_direct(dev, first_block, blocks, buffer);
73 if (rc != EOK) {
74 free(buffer);
75 return rc;
76 }
77
78 // copy the superblock from the buffer
79 // as it may not be at the start of the block
80 // (i.e. blocks larger than 1K)
81 tmp_superblock = malloc(EXT2_SUPERBLOCK_SIZE);
82 if (tmp_superblock == NULL) {
83 free(buffer);
84 return ENOMEM;
85 }
86
87 memcpy(tmp_superblock, buffer + offset, EXT2_SUPERBLOCK_SIZE);
88 free(buffer);
89 (*superblock) = tmp_superblock;
90
91 return EOK;
92}
93
94/**
95 * Initialize an instance of filesystem on the device.
96 * This function reads superblock from the device and
97 * initializes libblock cache with appropriate logical block size.
98 */
99int ext2_filesystem_init(ext2_filesystem_t *fs, devmap_handle_t dev) {
100 int rc;
101 ext2_superblock_t *temp_superblock;
102
103 fs->device = dev;
104
105 rc = block_init(fs->device, 2048);
106 if (rc != EOK) {
107 return rc;
108 }
109
110 rc = ext2_superblock_read_direct(&temp_superblock, dev);
111 if (rc != EOK) {
112 block_fini(dev);
113 return rc;
114 }
115
116 free(temp_superblock);
117
118 return EOK;
119}
120
121/**
122 * Finalize an instance of filesystem
123 */
124void ext2_filesystem_fini(ext2_filesystem_t *fs) {
125 block_fini(fs->device);
126}
127
128
129/** @}
130 */
Note: See TracBrowser for help on using the repository browser.