View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001400 | channel: elrepo/el9 | kmod-hfsplus | public | 2023-11-09 19:57 | 2023-11-12 11:59 |
| Reporter | toracat | Assigned To | pperry | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Summary | 0001400: Build kmod-hfsplus for EL 9.3 | ||||
| Description | An attempt to build kmod-hfsplus using the source code from the 9.3 GA kernel fails with errors. | ||||
| Additional Information | Related to a similar request for EL 9.2 ( https://elrepo.org/bugs/view.php?id=1360 ). | ||||
| Tags | No tags attached. | ||||
|
|
/home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c: In function 'hfsplus_releasepage': /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c:124:42: error: passing argument 1 of 'try_to_free_buffers' from incompatible pointer type [-Werror=incompatible-pointer-types] 124 | return res ? try_to_free_buffers(page) : 0; | ^~~~ | | | struct page * In file included from /home/phil/rpmbuild/BUILD/hfsplus-0.7/hfsplus_fs.h:22, from /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c:22: ./include/linux/buffer_head.h:185:26: note: expected 'struct folio *' but argument is of type 'struct page *' 185 | bool try_to_free_buffers(struct folio *); | ^~~~~~~~~~~~~~ /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c: At top level: /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c:166:10: error: 'const struct address_space_operations' has no member named 'releasepage' 166 | .releasepage = hfsplus_releasepage, | ^~~~~~~~~~~ /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c:166:27: error: initialization of 'void (*)(struct folio *, size_t, size_t)' {aka 'void (*)(struct folio *, long unsigned int, long unsigned int)'} from incompatible pointer type 'int (*)(struct page *, gfp_t)' {aka 'int (*)(struct page *, unsigned int)'} [-Werror=incompatible-pointer-types] 166 | .releasepage = hfsplus_releasepage, | ^~~~~~~~~~~~~~~~~~~ /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.c:166:27: note: (near initialization for 'hfsplus_btree_aops.invalidate_folio') cc1: some warnings being treated as errors make[1]: *** [scripts/Makefile.build:299: /home/phil/rpmbuild/BUILD/hfsplus-0.7/inode.o] Error 1 make[1]: *** Waiting for unfinished jobs.... /home/phil/rpmbuild/BUILD/hfsplus-0.7/extents.c: In function 'hfsplus_file_truncate': /home/phil/rpmbuild/BUILD/hfsplus-0.7/extents.c:560:23: error: implicit declaration of function 'pagecache_write_begin' [-Werror=implicit-function-declaration] 560 | res = pagecache_write_begin(NULL, mapping, size, 0, 0, | ^~~~~~~~~~~~~~~~~~~~~ /home/phil/rpmbuild/BUILD/hfsplus-0.7/extents.c:564:23: error: implicit declaration of function 'pagecache_write_end'; did you mean 'generic_write_end'? [-Werror=implicit-function-declaration] 564 | res = pagecache_write_end(NULL, mapping, size, | ^~~~~~~~~~~~~~~~~~~ | generic_write_end |
|
|
Packages built and released to the testing repo: kmod-hfsplus-0.7-1.el9_3.elrepo.src.rpm kmod-hfsplus-0.7-1.el9_3.elrepo.x86_64.rpm |
|
|
Tell us how you fixed it, please. |
|
|
Patches atteched elrepo-hfsplus-convert_to_release_folio.el9_3.patch (2,335 bytes)
diff -Naurp hfsplus-0.7.orig/inode.c hfsplus-0.7/inode.c
--- hfsplus-0.7.orig/inode.c 2023-10-03 13:09:50.000000000 +0100
+++ hfsplus-0.7/inode.c 2023-11-11 17:07:50.471274961 +0000
@@ -64,14 +64,15 @@ static sector_t hfsplus_bmap(struct addr
return generic_block_bmap(mapping, block, hfsplus_get_block);
}
-static int hfsplus_releasepage(struct page *page, gfp_t mask)
+static bool hfsplus_release_folio(struct folio *folio, gfp_t mask)
{
- struct inode *inode = page->mapping->host;
+ struct inode *inode = folio->mapping->host;
struct super_block *sb = inode->i_sb;
struct hfs_btree *tree;
struct hfs_bnode *node;
u32 nidx;
- int i, res = 1;
+ int i;
+ bool res = true;
switch (inode->i_ino) {
case HFSPLUS_EXT_CNID:
@@ -85,26 +86,26 @@ static int hfsplus_releasepage(struct pa
break;
default:
BUG();
- return 0;
+ return false;
}
if (!tree)
- return 0;
+ return false;
if (tree->node_size >= PAGE_SIZE) {
- nidx = page->index >>
+ nidx = folio->index >>
(tree->node_size_shift - PAGE_SHIFT);
spin_lock(&tree->hash_lock);
node = hfs_bnode_findhash(tree, nidx);
if (!node)
;
else if (atomic_read(&node->refcnt))
- res = 0;
+ res = false;
if (res && node) {
hfs_bnode_unhash(node);
hfs_bnode_free(node);
}
spin_unlock(&tree->hash_lock);
} else {
- nidx = page->index <<
+ nidx = folio->index <<
(PAGE_SHIFT - tree->node_size_shift);
i = 1 << (PAGE_SHIFT - tree->node_size_shift);
spin_lock(&tree->hash_lock);
@@ -113,7 +114,7 @@ static int hfsplus_releasepage(struct pa
if (!node)
continue;
if (atomic_read(&node->refcnt)) {
- res = 0;
+ res = false;
break;
}
hfs_bnode_unhash(node);
@@ -121,7 +122,7 @@ static int hfsplus_releasepage(struct pa
} while (--i && nidx < tree->node_count);
spin_unlock(&tree->hash_lock);
}
- return res ? try_to_free_buffers(page) : 0;
+ return res ? try_to_free_buffers(folio) : false;
}
static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
@@ -163,7 +164,7 @@ const struct address_space_operations hf
.write_begin = hfsplus_write_begin,
.write_end = generic_write_end,
.bmap = hfsplus_bmap,
- .releasepage = hfsplus_releasepage,
+ .release_folio = hfsplus_release_folio,
};
const struct address_space_operations hfsplus_aops = {
elrepo-hfsplus-pagecache_write_begin_end.el9_3.patch (1,997 bytes)
diff -Naurp hfsplus-0.7.orig/extents.c hfsplus-0.7/extents.c
--- hfsplus-0.7.orig/extents.c 2023-10-03 13:09:50.000000000 +0100
+++ hfsplus-0.7/extents.c 2023-11-11 18:35:09.984412209 +0000
@@ -554,15 +554,15 @@ void hfsplus_file_truncate(struct inode
if (inode->i_size > hip->phys_size) {
struct address_space *mapping = inode->i_mapping;
struct page *page;
- void *fsdata;
+ void *fsdata = NULL;
loff_t size = inode->i_size;
- res = pagecache_write_begin(NULL, mapping, size, 0, 0,
- &page, &fsdata);
+ res = hfsplus_write_begin(NULL, mapping, size, 0,
+ &page, &fsdata);
if (res)
return;
- res = pagecache_write_end(NULL, mapping, size,
- 0, 0, page, fsdata);
+ res = generic_write_end(NULL, mapping, size, 0, 0,
+ page, fsdata);
if (res < 0)
return;
mark_inode_dirty(inode);
diff -Naurp hfsplus-0.7.orig/hfsplus_fs.h hfsplus-0.7/hfsplus_fs.h
--- hfsplus-0.7.orig/hfsplus_fs.h 2023-10-03 13:09:50.000000000 +0100
+++ hfsplus-0.7/hfsplus_fs.h 2023-11-11 18:47:59.483965812 +0000
@@ -468,6 +468,8 @@ extern const struct address_space_operat
extern const struct address_space_operations hfsplus_btree_aops;
extern const struct dentry_operations hfsplus_dentry_operations;
+int hfsplus_write_begin(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned len, struct page **pagep, void **fsdata);
struct inode *hfsplus_new_inode(struct super_block *sb, struct inode *dir,
umode_t mode);
void hfsplus_delete_inode(struct inode *inode);
diff -Naurp hfsplus-0.7.orig/inode.c hfsplus-0.7/inode.c
--- hfsplus-0.7.orig/inode.c 2023-10-03 13:09:50.000000000 +0100
+++ hfsplus-0.7/inode.c 2023-11-11 18:54:53.750386508 +0000
@@ -43,7 +43,7 @@ static void hfsplus_write_failed(struct
}
}
-static int hfsplus_write_begin(struct file *file, struct address_space *mapping,
+int hfsplus_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len,
struct page **pagep, void **fsdata)
{
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2023-11-09 19:57 | toracat | New Issue | |
| 2023-11-09 19:57 | toracat | Status | new => assigned |
| 2023-11-09 19:57 | toracat | Assigned To | => pperry |
| 2023-11-11 10:30 | pperry | Note Added: 0009417 | |
| 2023-11-11 14:03 | pperry | Note Added: 0009418 | |
| 2023-11-11 14:03 | pperry | Status | assigned => resolved |
| 2023-11-11 14:03 | pperry | Resolution | open => fixed |
| 2023-11-11 14:05 | toracat | Note Added: 0009420 | |
| 2023-11-12 11:59 | pperry | Note Added: 0009421 | |
| 2023-11-12 11:59 | pperry | File Added: elrepo-hfsplus-convert_to_release_folio.el9_3.patch | |
| 2023-11-12 11:59 | pperry | File Added: elrepo-hfsplus-pagecache_write_begin_end.el9_3.patch |