ext4_journal: add block_get(_noread)/block_set.
[lwext4.git] / lwext4 / ext4_journal.c
1 /**
2  * @file  ext4_journal.c
3  * @brief Journalling
4  */
5
6 #include "ext4_config.h"
7 #include "ext4_types.h"
8 #include "ext4_fs.h"
9 #include "ext4_errno.h"
10 #include "ext4_blockdev.h"
11 #include "ext4_crc32c.h"
12 #include "ext4_debug.h"
13
14 #include <string.h>
15
16 int jbd_get_fs(struct ext4_fs *fs,
17                struct jbd_fs *jbd_fs)
18 {
19         int rc;
20         uint32_t journal_ino;
21
22         memset(jbd_fs, 0, sizeof(struct jbd_fs));
23         journal_ino = ext4_get32(&fs->sb, journal_inode_number);
24
25         rc = ext4_fs_get_inode_ref(fs,
26                                    journal_ino,
27                                    &jbd_fs->inode_ref);
28         return rc;
29 }
30
31 int jbd_put_fs(struct jbd_fs *jbd_fs)
32 {
33         int rc;
34         rc = ext4_fs_put_inode_ref(&jbd_fs->inode_ref);
35         return rc;
36 }
37
38 int jbd_inode_bmap(struct jbd_fs *jbd_fs,
39                    ext4_lblk_t iblock,
40                    ext4_fsblk_t *fblock)
41 {
42         int rc = ext4_fs_get_inode_data_block_index(
43                         &jbd_fs->inode_ref,
44                         iblock,
45                         fblock,
46                         false);
47         return rc;
48 }
49
50 int jbd_block_get(struct jbd_fs *jbd_fs,
51                   struct ext4_block *block,
52                   ext4_fsblk_t fblock)
53 {
54         /* TODO: journal device. */
55         int rc;
56         ext4_lblk_t iblock = (ext4_lblk_t)fblock;
57         rc = jbd_inode_bmap(jbd_fs, iblock,
58                             &fblock);
59         if (rc != EOK)
60                 return rc;
61
62         struct ext4_blockdev *bdev = jbd_fs->inode_ref.fs->bdev;
63         rc = ext4_block_get(bdev, block, fblock);
64         return rc;
65 }
66
67 int jbd_block_get_noread(struct jbd_fs *jbd_fs,
68                          struct ext4_block *block,
69                          ext4_fsblk_t fblock)
70 {
71         /* TODO: journal device. */
72         int rc;
73         ext4_lblk_t iblock = (ext4_lblk_t)fblock;
74         rc = jbd_inode_bmap(jbd_fs, iblock,
75                             &fblock);
76         if (rc != EOK)
77                 return rc;
78
79         struct ext4_blockdev *bdev = jbd_fs->inode_ref.fs->bdev;
80         rc = ext4_block_get_noread(bdev, block, fblock);
81         return rc;
82 }
83
84 int jbd_block_set(struct jbd_fs *jbd_fs,
85                   struct ext4_block *block)
86 {
87         return ext4_block_set(jbd_fs->inode_ref.fs->bdev,
88                               block);
89 }