Skip to content

Commit 357a813

Browse files
committed
Support Linux 6.9
To align with the best practices recommended by Linux kernel v6.9 API. This commit adds struct file and other related functions to support v6.9. The sturct bdev_handle is still retained for compatibility with v6.7 ref: start to support struct file* https://patchwork.kernel.org/project/linux-block/patch/20240427211305.GG1495312@ZenIV/#25828002 https://lore.kernel.org/all/[email protected]/ Move struct bdev_handle private to the block layer https://lore.kernel.org/all/[email protected]/
1 parent 126ed72 commit 357a813

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)