source: mainline/uspace/srv/fs/minixfs/mfs_inode.c@ 2bbbfd3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 2bbbfd3 was cdab59e, checked in by Maurizio Lombardi <m.lombardi85@…>, 14 years ago

Add mfs2_write_inode_raw() function to write back a dirty inode to disk

  • Property mode set to 100644
File size: 6.9 KB
Line 
1/*
2 * Copyright (c) 2011 Maurizio Lombardi
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 fs
30 * @{
31 */
32
33#include <stdlib.h>
34#include <assert.h>
35#include <errno.h>
36#include <mem.h>
37#include "mfs.h"
38#include "mfs_utils.h"
39
40static int
41mfs_write_inode_raw(struct mfs_node *mnode);
42
43static int
44mfs2_write_inode_raw(struct mfs_node *mnode);
45
46struct mfs_ino_info *
47mfs_read_inode_raw(const struct mfs_instance *instance, uint16_t inum)
48{
49 struct mfs_inode *ino = NULL;
50 struct mfs_ino_info *ino_i = NULL;
51 struct mfs_sb_info *sbi;
52 block_t *b;
53 int i;
54
55 sbi = instance->sbi;
56 assert(sbi);
57
58 const int ino_off = inum % sbi->ino_per_block;
59 const size_t ino_size = sizeof(struct mfs_inode);
60
61 ino_i = malloc(sizeof(*ino_i));
62 ino = malloc(ino_size);
63
64 if (!ino || !ino_i)
65 goto out_err;
66
67 const int itable_off = sbi->itable_off;
68
69 if (block_get(&b, instance->handle,
70 itable_off + inum / sbi->ino_per_block,
71 BLOCK_FLAGS_NONE) != EOK)
72 goto out_err;
73
74 memcpy(ino, ((uint8_t *) b->data) + ino_off * ino_size, ino_size);
75
76 ino_i->i_mode = conv16(sbi->native, ino->i_mode);
77 ino_i->i_uid = conv16(sbi->native, ino->i_uid);
78 ino_i->i_size = conv32(sbi->native, ino->i_size);
79 ino_i->i_mtime = conv32(sbi->native, ino->i_mtime);
80 ino_i->i_nlinks = ino->i_nlinks;
81
82 for (i = 0; i < V1_NR_DIRECT_ZONES; ++i)
83 ino_i->i_dzone[i] = conv16(sbi->native, ino->i_dzone[i]);
84
85 for (i = 0; i < V1_NR_INDIRECT_ZONES; ++i)
86 ino_i->i_izone[i] = conv16(sbi->native, ino->i_izone[i]);
87
88 block_put(b);
89 free(ino);
90 ino_i->dirty = false;
91
92 return ino_i;
93
94out_err:
95 if (ino)
96 free(ino);
97 if (ino_i)
98 free(ino_i);
99 return NULL;
100}
101
102struct mfs_ino_info *
103mfs2_read_inode_raw(const struct mfs_instance *instance, uint32_t inum)
104{
105 struct mfs2_inode *ino = NULL;
106 struct mfs_ino_info *ino_i = NULL;
107 struct mfs_sb_info *sbi;
108 block_t *b;
109 int i;
110
111 const size_t ino_size = sizeof(struct mfs2_inode);
112
113 ino = malloc(ino_size);
114 ino_i = malloc(sizeof(*ino_i));
115
116 if (!ino || !ino_i)
117 goto out_err;
118
119 sbi = instance->sbi;
120 assert(sbi);
121
122 const int itable_off = sbi->itable_off;
123 const int ino_off = inum % sbi->ino_per_block;
124
125 if (block_get(&b, instance->handle,
126 itable_off + inum / sbi->ino_per_block,
127 BLOCK_FLAGS_NONE) != EOK)
128 goto out_err;
129
130 memcpy(ino, ((uint8_t *)b->data) + ino_off * ino_size, ino_size);
131
132 ino_i->i_mode = conv16(sbi->native, ino->i_mode);
133 ino_i->i_nlinks = conv16(sbi->native, ino->i_nlinks);
134 ino_i->i_uid = conv16(sbi->native, ino->i_uid);
135 ino_i->i_gid = conv16(sbi->native, ino->i_gid);
136 ino_i->i_size = conv32(sbi->native, ino->i_size);
137 ino_i->i_atime = conv32(sbi->native, ino->i_atime);
138 ino_i->i_mtime = conv32(sbi->native, ino->i_mtime);
139 ino_i->i_ctime = conv32(sbi->native, ino->i_ctime);
140
141 for (i = 0; i < V2_NR_DIRECT_ZONES; ++i)
142 ino_i->i_dzone[i] = conv32(sbi->native, ino->i_dzone[i]);
143
144 for (i = 0; i < V2_NR_INDIRECT_ZONES; ++i)
145 ino_i->i_izone[i] = conv32(sbi->native, ino->i_izone[i]);
146
147 block_put(b);
148 free(ino);
149 ino_i->dirty = false;
150
151 return ino_i;
152
153out_err:
154 if (ino)
155 free(ino);
156 if (ino_i)
157 free(ino_i);
158 return NULL;
159}
160
161int
162put_inode(struct mfs_node *mnode)
163{
164 int rc = EOK;
165
166 assert(mnode);
167 assert(mnode->ino_i);
168
169 if (!mnode->ino_i->dirty)
170 goto out;
171
172 struct mfs_instance *inst = mnode->instance;
173 assert(inst);
174 struct mfs_sb_info *sbi = inst->sbi;
175 assert(sbi);
176
177 if (sbi->fs_version == MFS_VERSION_V1)
178 rc = mfs_write_inode_raw(mnode);
179 else
180 rc = mfs2_write_inode_raw(mnode);
181
182out:
183 return rc;
184}
185
186static int
187mfs_write_inode_raw(struct mfs_node *mnode)
188{
189 int i, r;
190 block_t *b;
191 struct mfs_ino_info *ino_i = mnode->ino_i;
192 struct mfs_sb_info *sbi = mnode->instance->sbi;
193
194 const int itable_off = sbi->itable_off;
195 const int ino_off = ino_i->index % sbi->ino_per_block;
196 const bool native = sbi->native;
197
198 r = block_get(&b, mnode->instance->handle,
199 itable_off + ino_i->index / sbi->ino_per_block,
200 BLOCK_FLAGS_NONE);
201
202 if (r != EOK)
203 goto out;
204
205 struct mfs_inode *ino = b->data;
206 ino += ino_off;
207
208 ino->i_mode = conv16(native, ino_i->i_mode);
209 ino->i_uid = conv16(native, ino_i->i_uid);
210 ino->i_gid = ino_i->i_gid;
211 ino->i_nlinks = ino_i->i_nlinks;
212 ino->i_size = conv32(native, ino_i->i_size);
213 ino->i_mtime = conv32(native, ino_i->i_mtime);
214
215 for (i = 0; i < V1_NR_DIRECT_ZONES; ++i)
216 ino->i_dzone[i] = conv16(native, ino_i->i_dzone[i]);
217 for (i = 0; i < V1_NR_INDIRECT_ZONES; ++i)
218 ino->i_izone[i] = conv16(native, ino_i->i_izone[i]);
219
220 b->dirty = true;
221 block_put(b);
222
223 ino_i->dirty = false;
224out:
225 return r;
226}
227
228static int
229mfs2_write_inode_raw(struct mfs_node *mnode)
230{
231 struct mfs_ino_info *ino_i = mnode->ino_i;
232 struct mfs_sb_info *sbi = mnode->instance->sbi;
233 block_t *b;
234 int i, r;
235
236 const int itable_off = sbi->itable_off;
237 const int ino_off = ino_i->index % sbi->ino_per_block;
238 const bool native = sbi->native;
239
240 r = block_get(&b, mnode->instance->handle,
241 itable_off + ino_i->index / sbi->ino_per_block,
242 BLOCK_FLAGS_NONE);
243
244 if (r != EOK)
245 goto out;
246
247 struct mfs2_inode *ino2 = b->data;
248 ino2 += ino_off;
249
250 ino2->i_mode = conv16(native, ino_i->i_mode);
251 ino2->i_nlinks = conv16(native, ino_i->i_mode);
252 ino2->i_uid = conv16(native, ino_i->i_uid);
253 ino2->i_gid = conv16(native, ino_i->i_gid);
254 ino2->i_size = conv32(native, ino_i->i_size);
255 ino2->i_atime = conv32(native, ino_i->i_atime);
256 ino2->i_mtime = conv32(native, ino_i->i_mtime);
257 ino2->i_ctime = conv32(native, ino_i->i_ctime);
258
259 for (i = 0; i < V2_NR_DIRECT_ZONES; ++i)
260 ino2->i_dzone[i] = conv32(native, ino_i->i_dzone[i]);
261
262 for (i = 0; i < V2_NR_INDIRECT_ZONES; ++i)
263 ino2->i_izone[i] = conv32(native, ino_i->i_izone[i]);
264
265 b->dirty = true;
266 block_put(b);
267 ino_i->dirty = false;
268
269out:
270 return r;
271}
272
273/**
274 * @}
275 */
276
Note: See TracBrowser for help on using the repository browser.