Skip to content

Commit cfa8aae

Browse files
authored
Merge pull request #70 from RoyWFHuang/Feature/Upgrade_API
Support Linux v6.9
2 parents 126ed72 + 357a813 commit cfa8aae

File tree

2 files changed

+67
-34
lines changed

2 files changed

+67
-34
lines changed

simplefs.h

+27-23
Original file line numberDiff line numberDiff line change
@@ -60,29 +60,6 @@ struct simplefs_inode {
6060
#define SIMPLEFS_INODES_PER_BLOCK \
6161
(SIMPLEFS_BLOCK_SIZE / sizeof(struct simplefs_inode))
6262

63-
struct simplefs_sb_info {
64-
uint32_t magic; /* Magic number */
65-
66-
uint32_t nr_blocks; /* Total number of blocks (incl sb & inodes) */
67-
uint32_t nr_inodes; /* Total number of inodes */
68-
69-
uint32_t nr_istore_blocks; /* Number of inode store blocks */
70-
uint32_t nr_ifree_blocks; /* Number of inode free bitmap blocks */
71-
uint32_t nr_bfree_blocks; /* Number of block free bitmap blocks */
72-
73-
uint32_t nr_free_inodes; /* Number of free inodes */
74-
uint32_t nr_free_blocks; /* Number of free blocks */
75-
76-
#ifdef __KERNEL__
77-
journal_t *journal;
78-
struct block_device *s_journal_bdev; /* v5.10+ external journal device */
79-
struct bdev_handle
80-
*s_journal_bdev_handle; /* v6.7+ external journal device */
81-
unsigned long *ifree_bitmap; /* In-memory free inodes bitmap */
82-
unsigned long *bfree_bitmap; /* In-memory free blocks bitmap */
83-
#endif
84-
};
85-
8663
#ifdef __KERNEL__
8764
#include <linux/version.h>
8865
/* compatibility macros */
@@ -152,4 +129,31 @@ extern uint32_t simplefs_ext_search(struct simplefs_file_ei_block *index,
152129

153130
#endif /* __KERNEL__ */
154131

132+
struct simplefs_sb_info {
133+
uint32_t magic; /* Magic number */
134+
135+
uint32_t nr_blocks; /* Total number of blocks (incl sb & inodes) */
136+
uint32_t nr_inodes; /* Total number of inodes */
137+
138+
uint32_t nr_istore_blocks; /* Number of inode store blocks */
139+
uint32_t nr_ifree_blocks; /* Number of inode free bitmap blocks */
140+
uint32_t nr_bfree_blocks; /* Number of block free bitmap blocks */
141+
142+
uint32_t nr_free_inodes; /* Number of free inodes */
143+
uint32_t nr_free_blocks; /* Number of free blocks */
144+
145+
#ifdef __KERNEL__
146+
journal_t *journal;
147+
struct block_device *s_journal_bdev; /* v5.10+ external journal device */
148+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
149+
struct file *s_journal_bdev_file; /* v6.11 external journal device */
150+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
151+
struct bdev_handle
152+
*s_journal_bdev_handle; /* v6.7+ external journal device */
153+
#endif
154+
unsigned long *ifree_bitmap; /* In-memory free inodes bitmap */
155+
unsigned long *bfree_bitmap; /* In-memory free blocks bitmap */
156+
#endif
157+
};
158+
155159
#endif /* SIMPLEFS_H */

super.c

+40-11
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,12 @@ static void simplefs_put_super(struct super_block *sb)
131131

132132
sync_blockdev(sb->s_bdev);
133133
invalidate_bdev(sb->s_bdev);
134-
135-
#if SIMPLEFS_AT_LEAST(6, 7, 0)
134+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
135+
if (sbi->s_journal_bdev_file) {
136+
sync_blockdev(file_bdev(sbi->s_journal_bdev_file));
137+
invalidate_bdev(file_bdev(sbi->s_journal_bdev_file));
138+
}
139+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
136140
if (sbi->s_journal_bdev_handle) {
137141
sync_blockdev(sbi->s_journal_bdev_handle->bdev);
138142
invalidate_bdev(sbi->s_journal_bdev_handle->bdev);
@@ -258,8 +262,12 @@ static journal_t *simplefs_get_dev_journal(struct super_block *sb,
258262
unsigned long offset;
259263
journal_t *journal;
260264
int errno = 0;
261-
262-
#if SIMPLEFS_AT_LEAST(6, 8, 0)
265+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
266+
struct file *bdev_file;
267+
bdev_file = bdev_file_open_by_dev(
268+
journal_dev, BLK_OPEN_READ | BLK_OPEN_WRITE | BLK_OPEN_RESTRICT_WRITES,
269+
sb, &fs_holder_ops);
270+
#elif SIMPLEFS_AT_LEAST(6, 8, 0)
263271
struct bdev_handle *bdev_handle;
264272
bdev_handle = bdev_open_by_dev(
265273
journal_dev, BLK_OPEN_READ | BLK_OPEN_WRITE | BLK_OPEN_RESTRICT_WRITES,
@@ -283,8 +291,15 @@ static journal_t *simplefs_get_dev_journal(struct super_block *sb,
283291
sb);
284292
#endif
285293

286-
287-
#if SIMPLEFS_AT_LEAST(6, 8, 0)
294+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
295+
if (IS_ERR(bdev_file)) {
296+
printk(KERN_ERR
297+
"failed to open journal device unknown-block(%u,%u) %ld\n",
298+
MAJOR(journal_dev), MINOR(journal_dev), PTR_ERR(bdev_file));
299+
return ERR_CAST(bdev_file);
300+
}
301+
bdev = file_bdev(bdev_file);
302+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
288303
if (IS_ERR(bdev_handle)) {
289304
printk(KERN_ERR
290305
"failed to open journal device unknown-block(%u,%u) %ld\n",
@@ -311,7 +326,12 @@ static journal_t *simplefs_get_dev_journal(struct super_block *sb,
311326

312327
sb_block = SIMPLEFS_BLOCK_SIZE / blocksize;
313328
offset = SIMPLEFS_BLOCK_SIZE % blocksize;
329+
330+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
331+
set_blocksize(bdev_file, blocksize);
332+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
314333
set_blocksize(bdev, blocksize);
334+
#endif
315335
bh = __bread(bdev, sb_block, blocksize);
316336

317337
if (!bh) {
@@ -332,7 +352,10 @@ static journal_t *simplefs_get_dev_journal(struct super_block *sb,
332352
start = sb_block;
333353
brelse(bh);
334354

335-
#if SIMPLEFS_AT_LEAST(6, 8, 0)
355+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
356+
journal = jbd2_journal_init_dev(file_bdev(bdev_file), sb->s_bdev, start,
357+
len, sb->s_blocksize);
358+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
336359
journal = jbd2_journal_init_dev(bdev_handle->bdev, sb->s_bdev, start, len,
337360
sb->s_blocksize);
338361
#elif SIMPLEFS_AT_LEAST(5, 15, 0)
@@ -347,18 +370,24 @@ static journal_t *simplefs_get_dev_journal(struct super_block *sb,
347370
errno = PTR_ERR(journal);
348371
goto out_bdev;
349372
}
350-
351-
#if SIMPLEFS_AT_LEAST(6, 8, 0)
373+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
374+
sbi->s_journal_bdev_file = bdev_file;
375+
pr_info("6.11 kernel");
376+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
352377
sbi->s_journal_bdev_handle = bdev_handle;
378+
pr_info("6.8 kernel");
353379
#elif SIMPLEFS_AT_LEAST(5, 15, 0)
380+
pr_info("5.15 kernel");
354381
sbi->s_journal_bdev = bdev;
355382
#endif
356383

357384
journal->j_private = sb;
358385
return journal;
359386

360387
out_bdev:
361-
#if SIMPLEFS_AT_LEAST(6, 7, 0)
388+
#if SIMPLEFS_AT_LEAST(6, 9, 0)
389+
fput(bdev_file);
390+
#elif SIMPLEFS_AT_LEAST(6, 7, 0)
362391
bdev_release(bdev_handle);
363392
#elif SIMPLEFS_AT_LEAST(6, 5, 0)
364393
blkdev_put(bdev, sb);
@@ -375,10 +404,10 @@ static int simplefs_load_journal(struct super_block *sb,
375404
struct simplefs_sb_info *sbi = SIMPLEFS_SB(sb);
376405
dev_t journal_dev;
377406
int err = 0;
378-
journal_dev = new_decode_dev(journal_devnum);
379407
int really_read_only;
380408
int journal_dev_ro;
381409

410+
journal_dev = new_decode_dev(journal_devnum);
382411
journal = simplefs_get_dev_journal(sb, journal_dev);
383412
if (IS_ERR(journal)) {
384413
pr_err("Failed to get journal from device, error %ld\n",

0 commit comments

Comments
 (0)