1 /*
2 block.c -- block functions
3 Copyright (C) 2001, 2002 Yury Umanets <torque@ukrpost.net>, see COPYING for
4 licensing and copyright details.
5 */
6
7 #ifdef HAVE_CONFIG_H
8 # include <config.h>
9 #endif
10
11 #include <string.h>
12
13 #include <reiserfs/reiserfs.h>
14 #include <reiserfs/debug.h>
15
16 #include <dal/dal.h>
17
18 #if ENABLE_NLS
19 # include <libintl.h>
20 # define _(String) dgettext (PACKAGE, String)
21 #else
22 # define _(String) (String)
23 #endif
24
reiserfs_block_alloc(dal_t * dal,blk_t blk,char c)25 reiserfs_block_t *reiserfs_block_alloc(dal_t *dal, blk_t blk, char c) {
26 reiserfs_block_t *block;
27
28 ASSERT(dal != NULL, return NULL);
29
30 if (!(block = (reiserfs_block_t *)libreiserfs_calloc(sizeof(*block), 0)))
31 return NULL;
32
33 if (!(block->data = libreiserfs_calloc(dal_get_blocksize(dal), c)))
34 goto error_free_block;
35
36 block->offset = (uint64_t)blk * (uint64_t)dal_get_blocksize(dal);
37 block->dal = dal;
38
39 return block;
40
41 error_free_block:
42 libreiserfs_free(block);
43 error:
44 return NULL;
45 }
46
reiserfs_block_alloc_with_copy(dal_t * dal,blk_t blk,void * data)47 reiserfs_block_t *reiserfs_block_alloc_with_copy(dal_t *dal, blk_t blk, void *data) {
48 reiserfs_block_t *block;
49
50 if (!(block = reiserfs_block_alloc(dal, blk, 0)))
51 return NULL;
52
53 if (data)
54 memcpy(block->data, data, dal_get_blocksize(dal));
55
56 return block;
57 }
58
reiserfs_block_realloc(reiserfs_block_t * block,blk_t blk)59 reiserfs_block_t *reiserfs_block_realloc(reiserfs_block_t *block, blk_t blk) {
60 ASSERT(block != NULL, return NULL);
61
62 if (!libreiserfs_realloc((void **)&block->data, dal_get_blocksize(block->dal)))
63 return NULL;
64
65 block->offset = (uint64_t)blk * (uint64_t)dal_get_blocksize(block->dal);
66
67 return block;
68 }
69
reiserfs_block_read(dal_t * dal,blk_t blk)70 reiserfs_block_t *reiserfs_block_read(dal_t *dal, blk_t blk) {
71 reiserfs_block_t *block;
72
73 ASSERT(dal != NULL, return NULL);
74
75 if (blk >= dal_len(dal))
76 return NULL;
77
78 if (!(block = reiserfs_block_alloc(dal, blk, 0)))
79 return NULL;
80
81 if (!dal_read(dal, block->data, blk, 1)) {
82 reiserfs_block_free(block);
83 return NULL;
84 }
85 return block;
86 }
87
reiserfs_block_write(dal_t * dal,reiserfs_block_t * block)88 int reiserfs_block_write(dal_t *dal, reiserfs_block_t *block) {
89
90 ASSERT(block != NULL, return 0);
91 ASSERT(dal != NULL, return 0);
92
93 if (!dal_write(dal, block->data, reiserfs_block_get_nr(block), 1))
94 return 0;
95
96 return 1;
97 }
98
reiserfs_block_get_nr(reiserfs_block_t * block)99 blk_t reiserfs_block_get_nr(reiserfs_block_t *block) {
100 ASSERT(block != NULL, return 0);
101 return (blk_t)(block->offset / dal_get_blocksize(block->dal));
102 }
103
reiserfs_block_set_nr(reiserfs_block_t * block,blk_t blk)104 void reiserfs_block_set_nr(reiserfs_block_t *block, blk_t blk) {
105 ASSERT(block != NULL, return);
106 block->offset = (uint64_t)blk * (uint64_t)dal_get_blocksize(block->dal);
107 }
108
reiserfs_block_dal(reiserfs_block_t * block)109 dal_t *reiserfs_block_dal(reiserfs_block_t *block) {
110 ASSERT(block != NULL, return NULL);
111 return block->dal;
112 }
113
reiserfs_block_set_dal(reiserfs_block_t * block,dal_t * dal)114 void reiserfs_block_set_dal(reiserfs_block_t *block, dal_t *dal) {
115 ASSERT(block != NULL, return);
116 ASSERT(dal != NULL, return);
117
118 block->dal = dal;
119 }
120
reiserfs_block_dirty(reiserfs_block_t * block)121 int reiserfs_block_dirty(reiserfs_block_t *block) {
122 ASSERT(block != NULL, return 0);
123 return block->dirty;
124 }
125
reiserfs_block_mark_dirty(reiserfs_block_t * block)126 void reiserfs_block_mark_dirty(reiserfs_block_t *block) {
127 ASSERT(block != NULL, return);
128 block->dirty = 1;
129 }
130
reiserfs_block_mark_clean(reiserfs_block_t * block)131 void reiserfs_block_mark_clean(reiserfs_block_t *block) {
132 ASSERT(block != NULL, return);
133 block->dirty = 0;
134 }
135
reiserfs_block_free(reiserfs_block_t * block)136 void reiserfs_block_free(reiserfs_block_t *block) {
137 ASSERT(block != NULL, return);
138
139 if (block->data)
140 libreiserfs_free(block->data);
141
142 libreiserfs_free(block);
143 }
144
145