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

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

Fix a little bug when reading inodes from disk

  • Property mode set to 100644
File size: 2.2 KB
Line 
1#include <stdlib.h>
2#include <mem.h>
3#include "mfs.h"
4#include "mfs_utils.h"
5
6struct mfs_inode *mfs_read_inode_raw(const struct mfs_instance *instance,
7 uint16_t inum)
8{
9 struct mfs_inode *ino;
10 struct mfs_sb_info *sbi;
11 block_t *b;
12 int i;
13
14 const int ino_off = inum % V1_INODES_PER_BLOCK;
15 const size_t ino_size = sizeof(struct mfs_inode);
16
17 ino = (struct mfs_inode *) malloc(ino_size);
18
19 if (!ino)
20 return NULL;
21
22 sbi = instance->sbi;
23
24 block_get(&b, instance->handle, 2 + inum / V1_INODES_PER_BLOCK,
25 BLOCK_FLAGS_NONE);
26
27 memcpy(ino, ((uint8_t *) b->data) + ino_off * ino_size, ino_size);
28
29 ino->i_mode = conv16(sbi->native, ino->i_mode);
30 ino->i_uid = conv16(sbi->native, ino->i_uid);
31 ino->i_size = conv32(sbi->native, ino->i_size);
32 ino->i_mtime = conv32(sbi->native, ino->i_mtime);
33
34 for (i = 0; i < V1_NR_DIRECT_ZONES; ++i)
35 ino->i_dzone[i] = conv16(sbi->native, ino->i_dzone[i]);
36
37 for (i = 0; i < V1_NR_INDIRECT_ZONES; ++i)
38 ino->i_izone[i] = conv16(sbi->native, ino->i_izone[i]);
39
40 block_put(b);
41
42 return ino;
43}
44
45struct mfs2_inode *mfs2_read_inode_raw(const struct mfs_instance *instance,
46 uint32_t inum)
47{
48 struct mfs2_inode *ino;
49 struct mfs_sb_info *sbi;
50 block_t *b;
51 int i;
52
53 const size_t ino_size = sizeof(struct mfs2_inode);
54
55 ino = (struct mfs2_inode *) malloc(ino_size);
56
57 if (!ino)
58 return NULL;
59
60 sbi = instance->sbi;
61
62 const int ino_off = inum % V3_INODES_PER_BLOCK(sbi->block_size);
63
64 block_get(&b, instance->handle,
65 2 + inum / V3_INODES_PER_BLOCK(sbi->block_size),
66 BLOCK_FLAGS_NONE);
67
68 memcpy(ino, ((uint8_t *)b->data) + ino_off * ino_size, ino_size);
69
70 ino->i_mode = conv16(sbi->native, ino->i_mode);
71 ino->i_nlinks = conv16(sbi->native, ino->i_nlinks);
72 ino->i_uid = conv16(sbi->native, ino->i_uid);
73 ino->i_gid = conv16(sbi->native, ino->i_gid);
74 ino->i_size = conv32(sbi->native, ino->i_size);
75 ino->i_atime = conv32(sbi->native, ino->i_atime);
76 ino->i_mtime = conv32(sbi->native, ino->i_mtime);
77 ino->i_ctime = conv32(sbi->native, ino->i_ctime);
78
79 for (i = 0; i < V2_NR_DIRECT_ZONES; ++i)
80 ino->i_dzone[i] = conv32(sbi->native, ino->i_dzone[i]);
81
82 for (i = 0; i < V2_NR_INDIRECT_ZONES; ++i)
83 ino->i_izone[i] = conv32(sbi->native, ino->i_izone[i]);
84
85 block_put(b);
86
87 return ino;
88}
89
Note: See TracBrowser for help on using the repository browser.