feat: bcachefs init
This commit is contained in:
commit
99e384733f
12
Makefile
Normal file
12
Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
ifneq (${KERNELRELEASE},)
|
||||
ccflags-y := -I$(src)/include
|
||||
obj-m += src/fs/bcachefs/
|
||||
else
|
||||
KDIR ?= /lib/modules/`uname -r`/build
|
||||
|
||||
default:
|
||||
$(MAKE) -C $(KDIR) M=$$PWD modules
|
||||
|
||||
clean:
|
||||
$(MAKE) -C $(KDIR) M=$$PWD clean
|
||||
endif
|
42
PKGBUILD
Normal file
42
PKGBUILD
Normal file
@ -0,0 +1,42 @@
|
||||
pkgname=bcachefs
|
||||
pkgver=20241025
|
||||
pkgrel=1
|
||||
arch=('x86_64')
|
||||
depends=('dkms')
|
||||
license=('GPL2')
|
||||
options=('!strip')
|
||||
provides=("BCACHEFS-MODULE=$pkgver")
|
||||
source=('dkms.conf' 'Makefile' 'compat.h' 'fix-kernel-6.11.patch')
|
||||
sha256sums=('a5e55374ea5966e8304b6436dc1512588a898974b3b0f9acb189342323f826cf'
|
||||
'd7fa983a3a03a68974ffbc5c96a0c9c7978e2b4001c2305896ba8085c772aa43'
|
||||
'1f3cdd4f85b0a47c80e930c238840de9f6505c1f8c3e3d1ae6333bebb6ebaa73'
|
||||
'eaed621c99e1af0bba60f4530c4e2d9e29505648b8ff4d23a5d02e9fea90c220')
|
||||
|
||||
pkgver() {
|
||||
cd bcachefs
|
||||
git --no-pager log -1 --pretty='format:%cd' --date='format:%Y%m%d'
|
||||
}
|
||||
|
||||
prepare() {
|
||||
sed -i -e "s/@PACKAGE_VERSION@/$pkgver/g" "$srcdir/dkms.conf"
|
||||
|
||||
rm -rf bcachefs
|
||||
git clone -n --depth=1 --filter=tree:0 https://github.com/koverstreet/bcachefs.git -b bcachefs-for-upstream
|
||||
cd bcachefs
|
||||
git sparse-checkout set --no-cone fs/bcachefs
|
||||
git checkout
|
||||
git apply "$srcdir"/*.patch
|
||||
for i in fs/bcachefs/{fs.c,rcu_pending.c,six.c,journal.c}; do
|
||||
sed -i '/#include[^\n]*/,$!b;//{x;//p;g};//!H;$!d;x;s//&\n#include "compat.h"/' $i
|
||||
done
|
||||
cp ../compat.h "$srcdir"/bcachefs/fs/bcachefs/
|
||||
}
|
||||
|
||||
package() {
|
||||
install -Dm644 "$srcdir/Makefile" "$pkgdir/usr/src/$pkgname-$pkgver/Makefile"
|
||||
install -Dm644 "$srcdir/dkms.conf" "$pkgdir/usr/src/$pkgname-$pkgver/dkms.conf"
|
||||
install -d -Dm755 "$pkgdir/usr/src/$pkgname-$pkgver/src/fs/bcachefs"
|
||||
install -m644 -t "$pkgdir/usr/src/$pkgname-$pkgver/src/fs/bcachefs" "$srcdir/$pkgname/fs/bcachefs"/*
|
||||
sed -i 's/$(CONFIG_BCACHEFS_FS)/m/g' "$pkgdir/usr/src/$pkgname-$pkgver/src/fs/bcachefs/Makefile"
|
||||
sed -i "s%^#define TRACE_INCLUDE_PATH \\.\\./\\.\\./fs/bcachefs\$%#define TRACE_INCLUDE_PATH /usr/src/$pkgname-$pkgver/src/fs/bcachefs%" "$pkgdir/usr/src/$pkgname-$pkgver/src/fs/bcachefs/trace.h"
|
||||
}
|
151
compat.h
Normal file
151
compat.h
Normal file
@ -0,0 +1,151 @@
|
||||
#include <linux/generic-radix-tree.h>
|
||||
|
||||
#define inode_state_wait_address(inode, bit) ((char *)&(inode)->i_state + (bit))
|
||||
|
||||
|
||||
static inline void inode_wake_up_bit(struct inode *inode, u32 bit)
|
||||
{
|
||||
/* Caller is responsible for correct memory barriers. */
|
||||
wake_up_var(inode_state_wait_address(inode, bit));
|
||||
}
|
||||
|
||||
static inline struct wait_queue_head *inode_bit_waitqueue(struct wait_bit_queue_entry *wqe,
|
||||
struct inode *inode, u32 bit)
|
||||
{
|
||||
void *bit_address;
|
||||
|
||||
bit_address = inode_state_wait_address(inode, bit);
|
||||
init_wait_var_entry(wqe, bit_address, 0);
|
||||
return __var_waitqueue(bit_address);
|
||||
}
|
||||
|
||||
#define genradix_ptr_alloc_preallocated_inlined(_radix, _idx, _new_node, _gfp)\
|
||||
(__genradix_cast(_radix) \
|
||||
(__genradix_ptr_inlined(&(_radix)->tree, \
|
||||
__genradix_idx_to_offset(_radix, _idx)) ?: \
|
||||
__genradix_ptr_alloc(&(_radix)->tree, \
|
||||
__genradix_idx_to_offset(_radix, _idx), \
|
||||
_gfp)))
|
||||
|
||||
#define GENRADIX_NODE_SHIFT 9
|
||||
#define GENRADIX_NODE_SIZE (1U << GENRADIX_NODE_SHIFT)
|
||||
|
||||
#define GENRADIX_ARY (GENRADIX_NODE_SIZE / sizeof(struct genradix_node *))
|
||||
#define GENRADIX_ARY_SHIFT ilog2(GENRADIX_ARY)
|
||||
|
||||
#define GENRADIX_MAX_DEPTH \
|
||||
DIV_ROUND_UP(BITS_PER_LONG - GENRADIX_NODE_SHIFT, GENRADIX_ARY_SHIFT)
|
||||
|
||||
#define GENRADIX_DEPTH_MASK \
|
||||
((unsigned long) (roundup_pow_of_two(GENRADIX_MAX_DEPTH + 1) - 1))
|
||||
|
||||
struct genradix_root;
|
||||
|
||||
static inline struct genradix_node *genradix_alloc_node(gfp_t gfp_mask)
|
||||
{
|
||||
return kzalloc(GENRADIX_NODE_SIZE, gfp_mask);
|
||||
}
|
||||
|
||||
static inline void genradix_free_node(struct genradix_node *node)
|
||||
{
|
||||
kfree(node);
|
||||
}
|
||||
|
||||
static inline int genradix_depth_shift(unsigned depth)
|
||||
{
|
||||
return GENRADIX_NODE_SHIFT + GENRADIX_ARY_SHIFT * depth;
|
||||
}
|
||||
|
||||
static inline struct genradix_node *genradix_root_to_node(struct genradix_root *r)
|
||||
{
|
||||
return (void *) ((unsigned long) r & ~GENRADIX_DEPTH_MASK);
|
||||
}
|
||||
|
||||
|
||||
static inline unsigned genradix_root_to_depth(struct genradix_root *r)
|
||||
{
|
||||
return (unsigned long) r & GENRADIX_DEPTH_MASK;
|
||||
}
|
||||
|
||||
struct genradix_node {
|
||||
union {
|
||||
/* Interior node: */
|
||||
struct genradix_node *children[GENRADIX_ARY];
|
||||
|
||||
/* Leaf: */
|
||||
u8 data[GENRADIX_NODE_SIZE];
|
||||
};
|
||||
};
|
||||
|
||||
static inline void *__genradix_ptr_inlined(struct __genradix *radix, size_t offset)
|
||||
{
|
||||
struct genradix_root *r = READ_ONCE(radix->root);
|
||||
struct genradix_node *n = genradix_root_to_node(r);
|
||||
unsigned level = genradix_root_to_depth(r);
|
||||
unsigned shift = genradix_depth_shift(level);
|
||||
|
||||
if (unlikely(ilog2(offset) >= genradix_depth_shift(level)))
|
||||
return NULL;
|
||||
|
||||
while (n && shift > GENRADIX_NODE_SHIFT) {
|
||||
shift -= GENRADIX_ARY_SHIFT;
|
||||
n = n->children[offset >> shift];
|
||||
offset &= (1UL << shift) - 1;
|
||||
}
|
||||
|
||||
return n ? &n->data[offset] : NULL;
|
||||
}
|
||||
|
||||
static inline bool rt_or_dl_prio(int prio)
|
||||
{
|
||||
return unlikely(prio < MAX_RT_PRIO);
|
||||
}
|
||||
|
||||
static inline bool rt_or_dl_task(struct task_struct *p)
|
||||
{
|
||||
return rt_or_dl_prio(p->prio);
|
||||
}
|
||||
|
||||
#ifdef _BCACHEFS_FS_H
|
||||
inline void __iget(struct inode *inode)
|
||||
{
|
||||
atomic_inc(&inode->i_count);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define __closure_wait_event_timeout(waitlist, _cond, _until) \
|
||||
({ \
|
||||
struct closure cl; \
|
||||
long _t; \
|
||||
\
|
||||
closure_init_stack(&cl); \
|
||||
\
|
||||
while (1) { \
|
||||
closure_wait(waitlist, &cl); \
|
||||
if (_cond) { \
|
||||
_t = max_t(long, 1L, _until - jiffies); \
|
||||
break; \
|
||||
} \
|
||||
_t = max_t(long, 0L, _until - jiffies); \
|
||||
if (!_t) \
|
||||
break; \
|
||||
closure_sync_timeout(&cl, _t); \
|
||||
} \
|
||||
closure_wake_up(waitlist); \
|
||||
closure_sync(&cl); \
|
||||
_t; \
|
||||
})
|
||||
|
||||
/*
|
||||
* Returns 0 if timeout expired, remaining time in jiffies (at least 1) if
|
||||
* condition became true
|
||||
*/
|
||||
#define closure_wait_event_timeout(waitlist, _cond, _timeout) \
|
||||
({ \
|
||||
unsigned long _until = jiffies + _timeout; \
|
||||
(_cond) \
|
||||
? max_t(long, 1L, _until - jiffies) \
|
||||
: __closure_wait_event_timeout(waitlist, _cond, _until);\
|
||||
})
|
||||
|
6
dkms.conf
Normal file
6
dkms.conf
Normal file
@ -0,0 +1,6 @@
|
||||
PACKAGE_NAME="bcachefs"
|
||||
PACKAGE_VERSION="@PACKAGE_VERSION@"
|
||||
BUILT_MODULE_NAME[0]="bcachefs"
|
||||
BUILT_MODULE_LOCATION[0]="src/fs/bcachefs"
|
||||
DEST_MODULE_LOCATION[0]="/kernel/fs/bcachefs"
|
||||
AUTOINSTALL="yes"
|
70
fix-kernel-6.11.patch
Normal file
70
fix-kernel-6.11.patch
Normal file
@ -0,0 +1,70 @@
|
||||
From ed055b79a4503094656f19455a847fc9ae2fa799 Mon Sep 17 00:00:00 2001
|
||||
From: nyyu <mail@nyyu.dev>
|
||||
Date: Sun, 6 Oct 2024 18:15:55 +0200
|
||||
Subject: [PATCH] fix: kernel 6.11
|
||||
|
||||
---
|
||||
fs/bcachefs/fs-io-buffered.c | 8 +++++---
|
||||
fs/bcachefs/fs-io-buffered.h | 4 ++--
|
||||
2 files changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/fs/bcachefs/fs-io-buffered.c b/fs/bcachefs/fs-io-buffered.c
|
||||
index 48a1ab9..2f96017 100644
|
||||
--- a/fs/bcachefs/fs-io-buffered.c
|
||||
+++ b/fs/bcachefs/fs-io-buffered.c
|
||||
@@ -648,7 +648,7 @@ int bch2_writepages(struct address_space *mapping, struct writeback_control *wbc
|
||||
|
||||
int bch2_write_begin(struct file *file, struct address_space *mapping,
|
||||
loff_t pos, unsigned len,
|
||||
- struct folio **foliop, void **fsdata)
|
||||
+ struct page **pagep, void **fsdata)
|
||||
{
|
||||
struct bch_inode_info *inode = to_bch_ei(mapping->host);
|
||||
struct bch_fs *c = inode->v.i_sb->s_fs_info;
|
||||
@@ -717,11 +717,12 @@ out:
|
||||
goto err;
|
||||
}
|
||||
|
||||
- *foliop = folio;
|
||||
+ *pagep = &folio->page;
|
||||
return 0;
|
||||
err:
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
+ *pagep = NULL;
|
||||
err_unlock:
|
||||
bch2_pagecache_add_put(inode);
|
||||
kfree(res);
|
||||
@@ -731,11 +732,12 @@ err_unlock:
|
||||
|
||||
int bch2_write_end(struct file *file, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned copied,
|
||||
- struct folio *folio, void *fsdata)
|
||||
+ struct page *page, void *fsdata)
|
||||
{
|
||||
struct bch_inode_info *inode = to_bch_ei(mapping->host);
|
||||
struct bch_fs *c = inode->v.i_sb->s_fs_info;
|
||||
struct bch2_folio_reservation *res = fsdata;
|
||||
+ struct folio *folio = page_folio(page);
|
||||
unsigned offset = pos - folio_pos(folio);
|
||||
|
||||
lockdep_assert_held(&inode->v.i_rwsem);
|
||||
diff --git a/fs/bcachefs/fs-io-buffered.h b/fs/bcachefs/fs-io-buffered.h
|
||||
index 3207ebb..40ce76c 100644
|
||||
--- a/fs/bcachefs/fs-io-buffered.h
|
||||
+++ b/fs/bcachefs/fs-io-buffered.h
|
||||
@@ -11,9 +11,9 @@ int bch2_writepages(struct address_space *, struct writeback_control *);
|
||||
void bch2_readahead(struct readahead_control *);
|
||||
|
||||
int bch2_write_begin(struct file *, struct address_space *, loff_t pos,
|
||||
- unsigned len, struct folio **, void **);
|
||||
+ unsigned len, struct page **, void **);
|
||||
int bch2_write_end(struct file *, struct address_space *, loff_t,
|
||||
- unsigned len, unsigned copied, struct folio *, void *);
|
||||
+ unsigned len, unsigned copied, struct page *, void *);
|
||||
|
||||
ssize_t bch2_write_iter(struct kiocb *, struct iov_iter *);
|
||||
|
||||
--
|
||||
2.46.2
|
||||
|
Loading…
Reference in New Issue
Block a user