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