summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-11-04 20:08:28 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-01-30 20:40:39 -0500
commit7ccde9c6d3ccdad1c8b45b3642b66df5cb5c4b9c (patch)
tree4d686c67f09ac25493830ffe13431e5fbd104268
parentd47d9ba87a19841ff42ebc30ea8c5cf689871dad (diff)
bcachefs: pass around struct bch_inode_info *, not struct inode *
-rw-r--r--fs/bcachefs/acl.c31
-rw-r--r--fs/bcachefs/dirent.c18
-rw-r--r--fs/bcachefs/dirent.h5
-rw-r--r--fs/bcachefs/fs-io.c404
-rw-r--r--fs/bcachefs/fs-io.h2
-rw-r--r--fs/bcachefs/fs.c573
-rw-r--r--fs/bcachefs/xattr.c35
-rw-r--r--fs/bcachefs/xattr.h5
8 files changed, 525 insertions, 548 deletions
diff --git a/fs/bcachefs/acl.c b/fs/bcachefs/acl.c
index 2dda0debaeb9..03f1d33074a9 100644
--- a/fs/bcachefs/acl.c
+++ b/fs/bcachefs/acl.c
@@ -8,8 +8,9 @@
#include <linux/sched.h>
#include <linux/slab.h>
-#include "xattr.h"
#include "acl.h"
+#include "fs.h"
+#include "xattr.h"
/*
* Convert from filesystem to in-memory representation.
@@ -134,9 +135,10 @@ fail:
return ERR_PTR(-EINVAL);
}
-struct posix_acl *bch2_get_acl(struct inode *inode, int type)
+struct posix_acl *bch2_get_acl(struct inode *vinode, int type)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
int name_index;
char *value = NULL;
struct posix_acl *acl;
@@ -152,12 +154,12 @@ struct posix_acl *bch2_get_acl(struct inode *inode, int type)
default:
BUG();
}
- ret = bch2_xattr_get(c, inode, "", NULL, 0, name_index);
+ ret = bch2_xattr_get(c, ei, "", NULL, 0, name_index);
if (ret > 0) {
value = kmalloc(ret, GFP_KERNEL);
if (!value)
return ERR_PTR(-ENOMEM);
- ret = bch2_xattr_get(c, inode, "", value,
+ ret = bch2_xattr_get(c, ei, "", value,
ret, name_index);
}
if (ret > 0)
@@ -169,14 +171,15 @@ struct posix_acl *bch2_get_acl(struct inode *inode, int type)
kfree(value);
if (!IS_ERR(acl))
- set_cached_acl(inode, type, acl);
+ set_cached_acl(&ei->v, type, acl);
return acl;
}
-int bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+int bch2_set_acl(struct inode *vinode, struct posix_acl *acl, int type)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
int name_index;
void *value = NULL;
size_t size = 0;
@@ -186,12 +189,12 @@ int bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
case ACL_TYPE_ACCESS:
name_index = BCH_XATTR_INDEX_POSIX_ACL_ACCESS;
if (acl) {
- ret = posix_acl_equiv_mode(acl, &inode->i_mode);
+ ret = posix_acl_equiv_mode(acl, &ei->v.i_mode);
if (ret < 0)
return ret;
else {
- inode->i_ctime = current_time(inode);
- mark_inode_dirty(inode);
+ ei->v.i_ctime = current_time(&ei->v);
+ mark_inode_dirty(&ei->v);
if (ret == 0)
acl = NULL;
}
@@ -200,7 +203,7 @@ int bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
case ACL_TYPE_DEFAULT:
name_index = BCH_XATTR_INDEX_POSIX_ACL_DEFAULT;
- if (!S_ISDIR(inode->i_mode))
+ if (!S_ISDIR(ei->v.i_mode))
return acl ? -EACCES : 0;
break;
@@ -214,7 +217,7 @@ int bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
return (int)PTR_ERR(value);
}
- ret = bch2_xattr_set(c, inode, "", value, size, 0, name_index);
+ ret = bch2_xattr_set(c, ei, "", value, size, 0, name_index);
kfree(value);
@@ -222,7 +225,7 @@ int bch2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
ret = -E2BIG;
if (!ret)
- set_cached_acl(inode, type, acl);
+ set_cached_acl(&ei->v, type, acl);
return ret;
}
diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c
index d63f05ad4089..5d65445d4b42 100644
--- a/fs/bcachefs/dirent.c
+++ b/fs/bcachefs/dirent.c
@@ -199,12 +199,10 @@ static struct bpos bch2_dirent_pos(struct bch_inode_info *ei,
}
int bch2_dirent_rename(struct bch_fs *c,
- struct inode *src_dir, const struct qstr *src_name,
- struct inode *dst_dir, const struct qstr *dst_name,
- u64 *journal_seq, enum bch_rename_mode mode)
+ struct bch_inode_info *src_ei, const struct qstr *src_name,
+ struct bch_inode_info *dst_ei, const struct qstr *dst_name,
+ u64 *journal_seq, enum bch_rename_mode mode)
{
- struct bch_inode_info *src_ei = to_bch_ei(src_dir);
- struct bch_inode_info *dst_ei = to_bch_ei(dst_dir);
struct btree_iter src_iter, dst_iter, whiteout_iter;
struct bkey_s_c old_src, old_dst;
struct bkey delete;
@@ -395,7 +393,7 @@ int bch2_empty_dir(struct bch_fs *c, u64 dir_inum)
int bch2_readdir(struct bch_fs *c, struct file *file,
struct dir_context *ctx)
{
- struct inode *inode = file_inode(file);
+ struct bch_inode_info *ei = file_bch_inode(file);
struct btree_iter iter;
struct bkey_s_c k;
struct bkey_s_c_dirent dirent;
@@ -404,10 +402,10 @@ int bch2_readdir(struct bch_fs *c, struct file *file,
if (!dir_emit_dots(file, ctx))
return 0;
- pr_debug("listing for %lu from %llu", inode->i_ino, ctx->pos);
+ pr_debug("listing for %lu from %llu", ei->v.i_ino, ctx->pos);
for_each_btree_key(&iter, c, BTREE_ID_DIRENTS,
- POS(inode->i_ino, ctx->pos), 0, k) {
+ POS(ei->v.i_ino, ctx->pos), 0, k) {
if (k.k->type != BCH_DIRENT)
continue;
@@ -417,10 +415,10 @@ int bch2_readdir(struct bch_fs *c, struct file *file,
k.k->p.inode, k.k->p.offset,
dirent.v->d_name, dirent.v->d_inum);
- if (bkey_cmp(k.k->p, POS(inode->i_ino, ctx->pos)) < 0)
+ if (bkey_cmp(k.k->p, POS(ei->v.i_ino, ctx->pos)) < 0)
continue;
- if (k.k->p.inode > inode->i_ino)
+ if (k.k->p.inode > ei->v.i_ino)
break;
len = bch2_dirent_name_bytes(dirent);
diff --git a/fs/bcachefs/dirent.h b/fs/bcachefs/dirent.h
index 9fe3d8f669a9..98405b5be2b8 100644
--- a/fs/bcachefs/dirent.h
+++ b/fs/bcachefs/dirent.h
@@ -11,6 +11,7 @@ struct file;
struct dir_context;
struct bch_fs;
struct bch_hash_info;
+struct bch_inode_info;
unsigned bch2_dirent_name_bytes(struct bkey_s_c_dirent);
int bch2_dirent_create(struct bch_fs *c, u64, const struct bch_hash_info *,
@@ -25,8 +26,8 @@ enum bch_rename_mode {
};
int bch2_dirent_rename(struct bch_fs *,
- struct inode *, const struct qstr *,
- struct inode *, const struct qstr *,
+ struct bch_inode_info *, const struct qstr *,
+ struct bch_inode_info *, const struct qstr *,
u64 *, enum bch_rename_mode);
u64 bch2_dirent_lookup(struct bch_fs *, u64, const struct bch_hash_info *,
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index 15cacf25f4c4..3ab0bc624a1b 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -142,15 +142,14 @@ static int inode_clear_i_sectors_dirty(struct bch_inode_info *ei,
return 0;
}
-static void i_sectors_dirty_put(struct bch_inode_info *ei,
+static void i_sectors_dirty_put(struct bch_fs *c,
+ struct bch_inode_info *ei,
struct i_sectors_hook *h)
{
- struct inode *inode = &ei->v;
-
if (h->sectors) {
- spin_lock(&inode->i_lock);
- inode->i_blocks += h->sectors;
- spin_unlock(&inode->i_lock);
+ spin_lock(&ei->v.i_lock);
+ ei->v.i_blocks += h->sectors;
+ spin_unlock(&ei->v.i_lock);
atomic64_add(h->sectors, &ei->ei_sectors);
EBUG_ON(atomic64_read(&ei->ei_sectors) < 0);
@@ -161,7 +160,6 @@ static void i_sectors_dirty_put(struct bch_inode_info *ei,
mutex_lock(&ei->ei_update_lock);
if (atomic_long_dec_and_test(&ei->ei_sectors_dirty_count)) {
- struct bch_fs *c = ei->v.i_sb->s_fs_info;
int ret = __bch2_write_inode(c, ei, inode_clear_i_sectors_dirty, NULL);
ret = ret;
@@ -170,7 +168,8 @@ static void i_sectors_dirty_put(struct bch_inode_info *ei,
mutex_unlock(&ei->ei_update_lock);
}
-static int __must_check i_sectors_dirty_get(struct bch_inode_info *ei,
+static int __must_check i_sectors_dirty_get(struct bch_fs *c,
+ struct bch_inode_info *ei,
struct i_sectors_hook *h)
{
int ret = 0;
@@ -186,11 +185,8 @@ static int __must_check i_sectors_dirty_get(struct bch_inode_info *ei,
mutex_lock(&ei->ei_update_lock);
- if (!(ei->ei_flags & BCH_INODE_I_SECTORS_DIRTY)) {
- struct bch_fs *c = ei->v.i_sb->s_fs_info;
-
+ if (!(ei->ei_flags & BCH_INODE_I_SECTORS_DIRTY))
ret = __bch2_write_inode(c, ei, inode_set_i_sectors_dirty, NULL);
- }
if (!ret)
atomic_long_inc(&ei->ei_sectors_dirty_count);
@@ -220,7 +216,6 @@ bchfs_extent_update_hook(struct extent_insert_hook *hook,
struct bchfs_extent_trans_hook *h = container_of(hook,
struct bchfs_extent_trans_hook, hook);
struct bch_inode_info *ei = h->op->ei;
- struct inode *inode = &ei->v;
int sign = bkey_extent_is_allocation(&insert->k) -
(k.k && bkey_extent_is_allocation(k.k));
s64 sectors = (s64) (next_pos.offset - committed_pos.offset) * sign;
@@ -244,7 +239,7 @@ bchfs_extent_update_hook(struct extent_insert_hook *hook,
ei->ei_size = offset;
if (h->op->is_dio)
- i_size_write(inode, offset);
+ i_size_write(&ei->v, offset);
}
if (sectors) {
@@ -261,9 +256,9 @@ bchfs_extent_update_hook(struct extent_insert_hook *hook,
h->op->sectors_added += sectors;
if (h->op->is_dio) {
- spin_lock(&inode->i_lock);
- inode->i_blocks += sectors;
- spin_unlock(&inode->i_lock);
+ spin_lock(&ei->v.i_lock);
+ ei->v.i_blocks += sectors;
+ spin_unlock(&ei->v.i_lock);
}
}
@@ -477,8 +472,8 @@ static int bch2_get_page_reservation(struct bch_fs *c, struct page *page,
static void bch2_clear_page_bits(struct page *page)
{
- struct inode *inode = page->mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(page->mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct disk_reservation res = { .sectors = PAGE_SECTORS };
struct bch_page_state s;
@@ -489,9 +484,9 @@ static void bch2_clear_page_bits(struct page *page)
ClearPagePrivate(page);
if (s.dirty_sectors) {
- spin_lock(&inode->i_lock);
- inode->i_blocks -= s.dirty_sectors;
- spin_unlock(&inode->i_lock);
+ spin_lock(&ei->v.i_lock);
+ ei->v.i_blocks -= s.dirty_sectors;
+ spin_unlock(&ei->v.i_lock);
}
if (s.reserved)
@@ -507,11 +502,11 @@ int bch2_set_page_dirty(struct page *page)
);
if (old.dirty_sectors != new.dirty_sectors) {
- struct inode *inode = page->mapping->host;
+ struct bch_inode_info *ei = to_bch_ei(page->mapping->host);
- spin_lock(&inode->i_lock);
- inode->i_blocks += new.dirty_sectors - old.dirty_sectors;
- spin_unlock(&inode->i_lock);
+ spin_lock(&ei->v.i_lock);
+ ei->v.i_blocks += new.dirty_sectors - old.dirty_sectors;
+ spin_unlock(&ei->v.i_lock);
}
return __set_page_dirty_nobuffers(page);
@@ -698,7 +693,7 @@ static void readpage_bio_extend(struct readpages_iter *iter,
}
static void bchfs_read(struct bch_fs *c, struct btree_iter *iter,
- struct bch_read_bio *rbio, u64 inode,
+ struct bch_read_bio *rbio, u64 inum,
struct readpages_iter *readpages_iter)
{
struct bio *bio = &rbio->bio;
@@ -712,7 +707,7 @@ static void bchfs_read(struct bch_fs *c, struct btree_iter *iter,
unsigned bytes;
bool is_last;
- bch2_btree_iter_set_pos(iter, POS(inode, bio->bi_iter.bi_sector));
+ bch2_btree_iter_set_pos(iter, POS(inum, bio->bi_iter.bi_sector));
k = bch2_btree_iter_peek_with_holes(iter);
BUG_ON(!k.k);
@@ -781,8 +776,8 @@ static void bchfs_read(struct bch_fs *c, struct btree_iter *iter,
int bch2_readpages(struct file *file, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages)
{
- struct inode *inode = mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct btree_iter iter;
struct page *page;
struct readpages_iter readpages_iter = {
@@ -809,7 +804,7 @@ int bch2_readpages(struct file *file, struct address_space *mapping,
rbio->bio.bi_end_io = bch2_readpages_end_io;
bio_add_page_contig(&rbio->bio, page);
- bchfs_read(c, &iter, rbio, inode->i_ino, &readpages_iter);
+ bchfs_read(c, &iter, rbio, ei->v.i_ino, &readpages_iter);
}
if (current->pagecache_lock != &mapping->add_lock)
@@ -819,7 +814,7 @@ int bch2_readpages(struct file *file, struct address_space *mapping,
}
static void __bchfs_readpage(struct bch_fs *c, struct bch_read_bio *rbio,
- u64 inode, struct page *page)
+ u64 inum, struct page *page)
{
struct btree_iter iter;
@@ -844,20 +839,19 @@ static void __bchfs_readpage(struct bch_fs *c, struct bch_read_bio *rbio,
bio_add_page_contig(&rbio->bio, page);
bch2_btree_iter_init(&iter, c, BTREE_ID_EXTENTS, POS_MIN, 0);
- bchfs_read(c, &iter, rbio, inode, NULL);
+ bchfs_read(c, &iter, rbio, inum, NULL);
}
int bch2_readpage(struct file *file, struct page *page)
{
- struct address_space *mapping = page->mapping;
- struct inode *inode = mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(page->mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct bch_read_bio *rbio;
rbio = to_rbio(bio_alloc_bioset(GFP_NOFS, 1, &c->bio_read));
rbio->bio.bi_end_io = bch2_readpages_end_io;
- __bchfs_readpage(c, rbio, inode->i_ino, page);
+ __bchfs_readpage(c, rbio, ei->v.i_ino, page);
return 0;
}
@@ -921,11 +915,11 @@ static void bch2_writepage_io_done(struct closure *cl)
* before calling end_page_writeback:
*/
if (io->op.sectors_added) {
- struct inode *inode = &io->op.ei->v;
+ struct bch_inode_info *ei = io->op.ei;
- spin_lock(&inode->i_lock);
- inode->i_blocks += io->op.sectors_added;
- spin_unlock(&inode->i_lock);
+ spin_lock(&ei->v.i_lock);
+ ei->v.i_blocks += io->op.sectors_added;
+ spin_unlock(&ei->v.i_lock);
}
bio_for_each_segment_all(bvec, bio, i)
@@ -1002,11 +996,10 @@ static int __bch2_writepage(struct bch_fs *c, struct page *page,
struct writeback_control *wbc,
struct bch_writepage_state *w)
{
- struct inode *inode = page->mapping->host;
- struct bch_inode_info *ei = to_bch_ei(inode);
+ struct bch_inode_info *ei = to_bch_ei(page->mapping->host);
struct bch_page_state new, old;
unsigned offset;
- loff_t i_size = i_size_read(inode);
+ loff_t i_size = i_size_read(&ei->v);
pgoff_t end_index = i_size >> PAGE_SHIFT;
EBUG_ON(!PageUptodate(page));
@@ -1233,8 +1226,8 @@ static void bch2_read_single_page_end_io(struct bio *bio)
static int bch2_read_single_page(struct page *page,
struct address_space *mapping)
{
- struct inode *inode = mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct bch_read_bio *rbio;
int ret;
DECLARE_COMPLETION_ONSTACK(done);
@@ -1243,7 +1236,7 @@ static int bch2_read_single_page(struct page *page,
rbio->bio.bi_private = &done;
rbio->bio.bi_end_io = bch2_read_single_page_end_io;
- __bchfs_readpage(c, rbio, inode->i_ino, page);
+ __bchfs_readpage(c, rbio, ei->v.i_ino, page);
wait_for_completion(&done);
ret = blk_status_to_errno(rbio->bio.bi_status);
@@ -1260,14 +1253,14 @@ int bch2_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata)
{
- struct inode *inode = mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
pgoff_t index = pos >> PAGE_SHIFT;
unsigned offset = pos & (PAGE_SIZE - 1);
struct page *page;
int ret = -ENOMEM;
- BUG_ON(inode_unhashed(mapping->host));
+ BUG_ON(inode_unhashed(&ei->v));
/* Not strictly necessary - same reason as mkwrite(): */
pagecache_add_get(&mapping->add_lock);
@@ -1283,13 +1276,13 @@ int bch2_write_begin(struct file *file, struct address_space *mapping,
if (len == PAGE_SIZE)
goto out;
- if (!offset && pos + len >= inode->i_size) {
+ if (!offset && pos + len >= ei->v.i_size) {
zero_user_segment(page, len, PAGE_SIZE);
flush_dcache_page(page);
goto out;
}
- if (index > inode->i_size >> PAGE_SHIFT) {
+ if (index > ei->v.i_size >> PAGE_SHIFT) {
zero_user_segments(page, 0, offset, offset + len, PAGE_SIZE);
flush_dcache_page(page);
goto out;
@@ -1329,11 +1322,10 @@ int bch2_write_end(struct file *filp, struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata)
{
- struct inode *inode = page->mapping->host;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(page->mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
- lockdep_assert_held(&inode->i_rwsem);
+ lockdep_assert_held(&ei->v.i_rwsem);
if (unlikely(copied < len && !PageUptodate(page))) {
/*
@@ -1346,8 +1338,8 @@ int bch2_write_end(struct file *filp, struct address_space *mapping,
copied = 0;
}
- if (pos + copied > inode->i_size)
- i_size_write(inode, pos + copied);
+ if (pos + copied > ei->v.i_size)
+ i_size_write(&ei->v, pos + copied);
if (copied) {
if (!PageUptodate(page))
@@ -1394,7 +1386,7 @@ static void bch2_direct_IO_read_split_endio(struct bio *bio)
}
static int bch2_direct_IO_read(struct bch_fs *c, struct kiocb *req,
- struct file *file, struct inode *inode,
+ struct file *file, struct bch_inode_info *ei,
struct iov_iter *iter, loff_t offset)
{
struct dio_read *dio;
@@ -1406,7 +1398,7 @@ static int bch2_direct_IO_read(struct bch_fs *c, struct kiocb *req,
return -EINVAL;
ret = min_t(loff_t, iter->count,
- max_t(loff_t, 0, i_size_read(inode) - offset));
+ max_t(loff_t, 0, i_size_read(&ei->v) - offset));
iov_iter_truncate(iter, round_up(ret, block_bytes(c)));
if (!ret)
@@ -1464,7 +1456,7 @@ start:
if (iter->count)
closure_get(&dio->cl);
- bch2_read(c, to_rbio(bio), inode->i_ino);
+ bch2_read(c, to_rbio(bio), ei->v.i_ino);
}
if (sync) {
@@ -1482,13 +1474,13 @@ static long __bch2_dio_write_complete(struct dio_write *dio)
{
struct file *file = dio->req->ki_filp;
struct address_space *mapping = file->f_mapping;
- struct inode *inode = file->f_inode;
+ struct bch_inode_info *ei = file_bch_inode(file);
long ret = dio->error ?: dio->written;
bch2_disk_reservation_put(dio->c, &dio->res);
__pagecache_block_put(&mapping->add_lock);
- inode_dio_end(inode);
+ inode_dio_end(&ei->v);
if (dio->iovec && dio->iovec != dio->inline_vecs)
kfree(dio->iovec);
@@ -1525,8 +1517,7 @@ static void bch2_dio_write_done(struct dio_write *dio)
static void bch2_do_direct_IO_write(struct dio_write *dio)
{
struct file *file = dio->req->ki_filp;
- struct inode *inode = file->f_inode;
- struct bch_inode_info *ei = to_bch_ei(inode);
+ struct bch_inode_info *ei = file_bch_inode(file);
struct bio *bio = &dio->iop.op.wbio.bio;
unsigned flags = 0;
int ret;
@@ -1552,10 +1543,10 @@ static void bch2_do_direct_IO_write(struct dio_write *dio)
dio->iop.is_dio = true;
dio->iop.new_i_size = U64_MAX;
bch2_write_op_init(&dio->iop.op, dio->c, dio->res,
- foreground_write_point(dio->c, (unsigned long) current),
- POS(inode->i_ino, (dio->offset + dio->written) >> 9),
- &ei->ei_journal_seq,
- flags|BCH_WRITE_THROTTLE);
+ foreground_write_point(dio->c, (unsigned long) current),
+ POS(ei->v.i_ino, (dio->offset + dio->written) >> 9),
+ &ei->ei_journal_seq,
+ flags|BCH_WRITE_THROTTLE);
dio->iop.op.index_update_fn = bchfs_write_index_update;
dio->res.sectors -= bio_sectors(bio);
@@ -1594,8 +1585,9 @@ static void bch2_dio_write_loop_async(struct closure *cl)
}
}
-static int bch2_direct_IO_write(struct bch_fs *c, struct kiocb *req,
- struct file *file, struct inode *inode,
+static int bch2_direct_IO_write(struct bch_fs *c,
+ struct kiocb *req, struct file *file,
+ struct bch_inode_info *ei,
struct iov_iter *iter, loff_t offset)
{
struct address_space *mapping = file->f_mapping;
@@ -1604,7 +1596,7 @@ static int bch2_direct_IO_write(struct bch_fs *c, struct kiocb *req,
ssize_t ret;
bool sync = is_sync_kiocb(req);
- lockdep_assert_held(&inode->i_rwsem);
+ lockdep_assert_held(&ei->v.i_rwsem);
if (unlikely(!iter->count))
return 0;
@@ -1626,7 +1618,7 @@ static int bch2_direct_IO_write(struct bch_fs *c, struct kiocb *req,
dio->mm = current->mm;
closure_init(&dio->cl, NULL);
- if (offset + iter->count > inode->i_size)
+ if (offset + iter->count > ei->v.i_size)
sync = true;
/*
@@ -1644,7 +1636,7 @@ static int bch2_direct_IO_write(struct bch_fs *c, struct kiocb *req,
return ret;
}
- inode_dio_begin(inode);
+ inode_dio_begin(&ei->v);
__pagecache_block_get(&mapping->add_lock);
if (sync) {
@@ -1685,15 +1677,15 @@ static int bch2_direct_IO_write(struct bch_fs *c, struct kiocb *req,
ssize_t bch2_direct_IO(struct kiocb *req, struct iov_iter *iter)
{
struct file *file = req->ki_filp;
- struct inode *inode = file->f_inode;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct blk_plug plug;
ssize_t ret;
blk_start_plug(&plug);
ret = ((iov_iter_rw(iter) == WRITE)
? bch2_direct_IO_write
- : bch2_direct_IO_read)(c, req, file, inode, iter, req->ki_pos);
+ : bch2_direct_IO_read)(c, req, file, ei, iter, req->ki_pos);
blk_finish_plug(&plug);
return ret;
@@ -1703,8 +1695,8 @@ static ssize_t
bch2_direct_write(struct kiocb *iocb, struct iov_iter *iter)
{
struct file *file = iocb->ki_filp;
- struct inode *inode = file->f_inode;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct address_space *mapping = file->f_mapping;
loff_t pos = iocb->ki_pos;
ssize_t ret;
@@ -1717,7 +1709,7 @@ bch2_direct_write(struct kiocb *iocb, struct iov_iter *iter)
if (unlikely(ret))
goto err;
- ret = bch2_direct_IO_write(c, iocb, file, inode, iter, pos);
+ ret = bch2_direct_IO_write(c, iocb, file, ei, iter, pos);
err:
pagecache_block_put(&mapping->add_lock);
@@ -1727,12 +1719,11 @@ err:
static ssize_t __bch2_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
struct file *file = iocb->ki_filp;
- struct address_space *mapping = file->f_mapping;
- struct inode *inode = mapping->host;
+ struct bch_inode_info *ei = file_bch_inode(file);
ssize_t ret;
/* We can write back this queue in page reclaim */
- current->backing_dev_info = inode_to_bdi(inode);
+ current->backing_dev_info = inode_to_bdi(&ei->v);
ret = file_remove_privs(file);
if (ret)
goto out;
@@ -1754,16 +1745,15 @@ out:
ssize_t bch2_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
- struct file *file = iocb->ki_filp;
- struct inode *inode = file->f_mapping->host;
+ struct bch_inode_info *ei = file_bch_inode(iocb->ki_filp);
bool direct = iocb->ki_flags & IOCB_DIRECT;
ssize_t ret;
- inode_lock(inode);
+ inode_lock(&ei->v);
ret = generic_write_checks(iocb, from);
if (ret > 0)
ret = __bch2_write_iter(iocb, from);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
if (ret > 0 && !direct)
ret = generic_write_sync(iocb, ret);
@@ -1775,12 +1765,12 @@ int bch2_page_mkwrite(struct vm_fault *vmf)
{
struct page *page = vmf->page;
struct file *file = vmf->vma->vm_file;
- struct inode *inode = file_inode(file);
- struct address_space *mapping = inode->i_mapping;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct address_space *mapping = ei->v.i_mapping;
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
int ret = VM_FAULT_LOCKED;
- sb_start_pagefault(inode->i_sb);
+ sb_start_pagefault(ei->v.i_sb);
file_update_time(file);
/*
@@ -1794,7 +1784,7 @@ int bch2_page_mkwrite(struct vm_fault *vmf)
lock_page(page);
if (page->mapping != mapping ||
- page_offset(page) > i_size_read(inode)) {
+ page_offset(page) > i_size_read(&ei->v)) {
unlock_page(page);
ret = VM_FAULT_NOPAGE;
goto out;
@@ -1812,7 +1802,7 @@ int bch2_page_mkwrite(struct vm_fault *vmf)
out:
if (current->pagecache_lock != &mapping->add_lock)
pagecache_add_put(&mapping->add_lock);
- sb_end_pagefault(inode->i_sb);
+ sb_end_pagefault(ei->v.i_sb);
return ret;
}
@@ -1862,12 +1852,11 @@ int bch2_migrate_page(struct address_space *mapping, struct page *newpage,
int bch2_fsync(struct file *file, loff_t start, loff_t end, int datasync)
{
- struct inode *inode = file->f_mapping->host;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
int ret;
- ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+ ret = filemap_write_and_wait_range(ei->v.i_mapping, start, end);
if (ret)
return ret;
@@ -1880,8 +1869,8 @@ int bch2_fsync(struct file *file, loff_t start, loff_t end, int datasync)
static int __bch2_truncate_page(struct address_space *mapping,
pgoff_t index, loff_t start, loff_t end)
{
- struct inode *inode = mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(mapping->host);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
unsigned start_offset = start & (PAGE_SIZE - 1);
unsigned end_offset = ((end - 1) & (PAGE_SIZE - 1)) + 1;
struct page *page;
@@ -1893,7 +1882,7 @@ static int __bch2_truncate_page(struct address_space *mapping,
return 0;
/* Above i_size? */
- if (index << PAGE_SHIFT >= inode->i_size)
+ if (index << PAGE_SHIFT >= ei->v.i_size)
return 0;
page = find_lock_page(mapping, index);
@@ -1906,10 +1895,10 @@ static int __bch2_truncate_page(struct address_space *mapping,
* page
*/
for_each_btree_key(&iter, c, BTREE_ID_EXTENTS,
- POS(inode->i_ino,
+ POS(ei->v.i_ino,
index << PAGE_SECTOR_SHIFT), 0, k) {
if (bkey_cmp(bkey_start_pos(k.k),
- POS(inode->i_ino,
+ POS(ei->v.i_ino,
(index + 1) << PAGE_SECTOR_SHIFT)) >= 0)
break;
@@ -1967,18 +1956,17 @@ static int bch2_truncate_page(struct address_space *mapping, loff_t from)
from, from + PAGE_SIZE);
}
-int bch2_truncate(struct inode *inode, struct iattr *iattr)
+int bch2_truncate(struct bch_inode_info *ei, struct iattr *iattr)
{
- struct address_space *mapping = inode->i_mapping;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
- bool shrink = iattr->ia_size <= inode->i_size;
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
+ struct address_space *mapping = ei->v.i_mapping;
+ bool shrink = iattr->ia_size <= ei->v.i_size;
int ret = 0;
- inode_dio_wait(inode);
+ inode_dio_wait(&ei->v);
pagecache_block_get(&mapping->add_lock);
- truncate_setsize(inode, iattr->ia_size);
+ truncate_setsize(&ei->v, iattr->ia_size);
/* sync appends.. */
/* XXX what protects ei->i_size? */
@@ -1989,7 +1977,7 @@ int bch2_truncate(struct inode *inode, struct iattr *iattr)
mutex_lock(&ei->ei_update_lock);
i_size_dirty_get(ei);
- ret = bch2_write_inode_size(c, ei, inode->i_size);
+ ret = bch2_write_inode_size(c, ei, ei->v.i_size);
mutex_unlock(&ei->ei_update_lock);
if (unlikely(ret))
@@ -2005,34 +1993,34 @@ int bch2_truncate(struct inode *inode, struct iattr *iattr)
struct i_sectors_hook i_sectors_hook;
int ret;
- ret = i_sectors_dirty_get(ei, &i_sectors_hook);
+ ret = i_sectors_dirty_get(c, ei, &i_sectors_hook);
if (unlikely(ret))
goto err;
- ret = bch2_truncate_page(inode->i_mapping, iattr->ia_size);
+ ret = bch2_truncate_page(ei->v.i_mapping, iattr->ia_size);
if (unlikely(ret)) {
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
goto err;
}
- ret = bch2_inode_truncate(c, inode->i_ino,
+ ret = bch2_inode_truncate(c, ei->v.i_ino,
round_up(iattr->ia_size, PAGE_SIZE) >> 9,
&i_sectors_hook.hook,
&ei->ei_journal_seq);
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
if (unlikely(ret))
goto err;
}
mutex_lock(&ei->ei_update_lock);
- setattr_copy(inode, iattr);
- inode->i_mtime = inode->i_ctime = current_time(inode);
+ setattr_copy(&ei->v, iattr);
+ ei->v.i_mtime = ei->v.i_ctime = current_time(&ei->v);
out:
/* clear I_SIZE_DIRTY: */
i_size_dirty_put(ei);
- ret = bch2_write_inode_size(c, ei, inode->i_size);
+ ret = bch2_write_inode_size(c, ei, ei->v.i_size);
mutex_unlock(&ei->ei_update_lock);
err_put_pagecache:
@@ -2043,36 +2031,35 @@ err:
goto out;
}
-static long bch2_fpunch(struct inode *inode, loff_t offset, loff_t len)
+static long bch2_fpunch(struct bch_inode_info *ei, loff_t offset, loff_t len)
{
- struct address_space *mapping = inode->i_mapping;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
- u64 ino = inode->i_ino;
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
+ struct address_space *mapping = ei->v.i_mapping;
+ u64 ino = ei->v.i_ino;
u64 discard_start = round_up(offset, PAGE_SIZE) >> 9;
u64 discard_end = round_down(offset + len, PAGE_SIZE) >> 9;
int ret = 0;
- inode_lock(inode);
- inode_dio_wait(inode);
+ inode_lock(&ei->v);
+ inode_dio_wait(&ei->v);
pagecache_block_get(&mapping->add_lock);
- ret = __bch2_truncate_page(inode->i_mapping,
- offset >> PAGE_SHIFT,
- offset, offset + len);
+ ret = __bch2_truncate_page(mapping,
+ offset >> PAGE_SHIFT,
+ offset, offset + len);
if (unlikely(ret))
goto out;
if (offset >> PAGE_SHIFT !=
(offset + len) >> PAGE_SHIFT) {
- ret = __bch2_truncate_page(inode->i_mapping,
- (offset + len) >> PAGE_SHIFT,
- offset, offset + len);
+ ret = __bch2_truncate_page(mapping,
+ (offset + len) >> PAGE_SHIFT,
+ offset, offset + len);
if (unlikely(ret))
goto out;
}
- truncate_pagecache_range(inode, offset, offset + len - 1);
+ truncate_pagecache_range(&ei->v, offset, offset + len - 1);
if (discard_start < discard_end) {
struct disk_reservation disk_res;
@@ -2081,7 +2068,7 @@ static long bch2_fpunch(struct inode *inode, loff_t offset, loff_t len)
BUG_ON(bch2_disk_reservation_get(c, &disk_res, 0, 0));
- ret = i_sectors_dirty_get(ei, &i_sectors_hook);
+ ret = i_sectors_dirty_get(c, ei, &i_sectors_hook);
if (unlikely(ret))
goto out;
@@ -2094,21 +2081,21 @@ static long bch2_fpunch(struct inode *inode, loff_t offset, loff_t len)
&i_sectors_hook.hook,
&ei->ei_journal_seq);
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
bch2_disk_reservation_put(c, &disk_res);
}
out:
pagecache_block_put(&mapping->add_lock);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
return ret;
}
-static long bch2_fcollapse(struct inode *inode, loff_t offset, loff_t len)
+static long bch2_fcollapse(struct bch_inode_info *ei,
+ loff_t offset, loff_t len)
{
- struct address_space *mapping = inode->i_mapping;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
+ struct address_space *mapping = ei->v.i_mapping;
struct btree_iter src;
struct btree_iter dst;
BKEY_PADDED(k) copy;
@@ -2121,7 +2108,7 @@ static long bch2_fcollapse(struct inode *inode, loff_t offset, loff_t len)
return -EINVAL;
bch2_btree_iter_init(&dst, c, BTREE_ID_EXTENTS,
- POS(inode->i_ino, offset >> 9),
+ POS(ei->v.i_ino, offset >> 9),
BTREE_ITER_INTENT);
/* position will be set from dst iter's position: */
bch2_btree_iter_init(&src, c, BTREE_ID_EXTENTS, POS_MIN, 0);
@@ -2133,30 +2120,29 @@ static long bch2_fcollapse(struct inode *inode, loff_t offset, loff_t len)
* locking for the extents btree itself, because we're using linked
* iterators
*/
- inode_lock(inode);
- inode_dio_wait(inode);
+ inode_lock(&ei->v);
+ inode_dio_wait(&ei->v);
pagecache_block_get(&mapping->add_lock);
ret = -EINVAL;
- if (offset + len >= inode->i_size)
+ if (offset + len >= ei->v.i_size)
goto err;
- if (inode->i_size < len)
+ if (ei->v.i_size < len)
goto err;
- new_size = inode->i_size - len;
+ new_size = ei->v.i_size - len;
- ret = write_invalidate_inode_pages_range(inode->i_mapping,
- offset, LLONG_MAX);
+ ret = write_invalidate_inode_pages_range(mapping, offset, LLONG_MAX);
if (ret)
goto err;
- ret = i_sectors_dirty_get(ei, &i_sectors_hook);
+ ret = i_sectors_dirty_get(c, ei, &i_sectors_hook);
if (ret)
goto err;
while (bkey_cmp(dst.pos,
- POS(inode->i_ino,
+ POS(ei->v.i_ino,
round_up(new_size, PAGE_SIZE) >> 9)) < 0) {
struct disk_reservation disk_res;
@@ -2201,22 +2187,22 @@ btree_iter_err:
bch2_btree_iter_unlock(&src);
bch2_btree_iter_unlock(&dst);
- ret = bch2_inode_truncate(c, inode->i_ino,
+ ret = bch2_inode_truncate(c, ei->v.i_ino,
round_up(new_size, PAGE_SIZE) >> 9,
&i_sectors_hook.hook,
&ei->ei_journal_seq);
if (ret)
goto err_unwind;
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
mutex_lock(&ei->ei_update_lock);
- i_size_write(inode, new_size);
- ret = bch2_write_inode_size(c, ei, inode->i_size);
+ i_size_write(&ei->v, new_size);
+ ret = bch2_write_inode_size(c, ei, ei->v.i_size);
mutex_unlock(&ei->ei_update_lock);
pagecache_block_put(&mapping->add_lock);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
return ret;
err_unwind:
@@ -2224,21 +2210,20 @@ err_unwind:
* XXX: we've left data with multiple pointers... which isn't a _super_
* serious problem...
*/
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
err:
bch2_btree_iter_unlock(&src);
bch2_btree_iter_unlock(&dst);
pagecache_block_put(&mapping->add_lock);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
return ret;
}
-static long bch2_fallocate(struct inode *inode, int mode,
+static long bch2_fallocate(struct bch_inode_info *ei, int mode,
loff_t offset, loff_t len)
{
- struct address_space *mapping = inode->i_mapping;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct address_space *mapping = ei->v.i_mapping;
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct i_sectors_hook i_sectors_hook;
struct btree_iter iter;
struct bpos end;
@@ -2251,33 +2236,33 @@ static long bch2_fallocate(struct inode *inode, int mode,
bch2_btree_iter_init(&iter, c, BTREE_ID_EXTENTS, POS_MIN,
BTREE_ITER_INTENT);
- inode_lock(inode);
- inode_dio_wait(inode);
+ inode_lock(&ei->v);
+ inode_dio_wait(&ei->v);
pagecache_block_get(&mapping->add_lock);
if (!(mode & FALLOC_FL_KEEP_SIZE) &&
- new_size > inode->i_size) {
- ret = inode_newsize_ok(inode, new_size);
+ new_size > ei->v.i_size) {
+ ret = inode_newsize_ok(&ei->v, new_size);
if (ret)
goto err;
}
if (mode & FALLOC_FL_ZERO_RANGE) {
- ret = __bch2_truncate_page(inode->i_mapping,
- offset >> PAGE_SHIFT,
- offset, offset + len);
+ ret = __bch2_truncate_page(mapping,
+ offset >> PAGE_SHIFT,
+ offset, offset + len);
if (!ret &&
offset >> PAGE_SHIFT !=
(offset + len) >> PAGE_SHIFT)
- ret = __bch2_truncate_page(inode->i_mapping,
- (offset + len) >> PAGE_SHIFT,
- offset, offset + len);
+ ret = __bch2_truncate_page(mapping,
+ (offset + len) >> PAGE_SHIFT,
+ offset, offset + len);
if (unlikely(ret))
goto err;
- truncate_pagecache_range(inode, offset, offset + len - 1);
+ truncate_pagecache_range(&ei->v, offset, offset + len - 1);
block_start = round_up(offset, PAGE_SIZE);
block_end = round_down(offset + len, PAGE_SIZE);
@@ -2286,10 +2271,10 @@ static long bch2_fallocate(struct inode *inode, int mode,
block_end = round_up(offset + len, PAGE_SIZE);
}
- bch2_btree_iter_set_pos(&iter, POS(inode->i_ino, block_start >> 9));
- end = POS(inode->i_ino, block_end >> 9);
+ bch2_btree_iter_set_pos(&iter, POS(ei->v.i_ino, block_start >> 9));
+ end = POS(ei->v.i_ino, block_end >> 9);
- ret = i_sectors_dirty_get(ei, &i_sectors_hook);
+ ret = i_sectors_dirty_get(c, ei, &i_sectors_hook);
if (unlikely(ret))
goto err;
@@ -2350,59 +2335,59 @@ btree_iter_err:
}
bch2_btree_iter_unlock(&iter);
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
if (!(mode & FALLOC_FL_KEEP_SIZE) &&
- new_size > inode->i_size) {
- i_size_write(inode, new_size);
+ new_size > ei->v.i_size) {
+ i_size_write(&ei->v, new_size);
mutex_lock(&ei->ei_update_lock);
- ret = bch2_write_inode_size(c, ei, inode->i_size);
+ ret = bch2_write_inode_size(c, ei, ei->v.i_size);
mutex_unlock(&ei->ei_update_lock);
}
/* blech */
if ((mode & FALLOC_FL_KEEP_SIZE) &&
(mode & FALLOC_FL_ZERO_RANGE) &&
- ei->ei_size != inode->i_size) {
+ ei->ei_size != ei->v.i_size) {
/* sync appends.. */
ret = filemap_write_and_wait_range(mapping, ei->ei_size, S64_MAX);
if (ret)
goto err;
- if (ei->ei_size != inode->i_size) {
+ if (ei->ei_size != ei->v.i_size) {
mutex_lock(&ei->ei_update_lock);
- ret = bch2_write_inode_size(c, ei, inode->i_size);
+ ret = bch2_write_inode_size(c, ei, ei->v.i_size);
mutex_unlock(&ei->ei_update_lock);
}
}
pagecache_block_put(&mapping->add_lock);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
return 0;
err_put_sectors_dirty:
- i_sectors_dirty_put(ei, &i_sectors_hook);
+ i_sectors_dirty_put(c, ei, &i_sectors_hook);
err:
bch2_btree_iter_unlock(&iter);
pagecache_block_put(&mapping->add_lock);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
return ret;
}
long bch2_fallocate_dispatch(struct file *file, int mode,
loff_t offset, loff_t len)
{
- struct inode *inode = file_inode(file);
+ struct bch_inode_info *ei = file_bch_inode(file);
if (!(mode & ~(FALLOC_FL_KEEP_SIZE|FALLOC_FL_ZERO_RANGE)))
- return bch2_fallocate(inode, mode, offset, len);
+ return bch2_fallocate(ei, mode, offset, len);
if (mode == (FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE))
- return bch2_fpunch(inode, offset, len);
+ return bch2_fpunch(ei, offset, len);
if (mode == FALLOC_FL_COLLAPSE_RANGE)
- return bch2_fcollapse(inode, offset, len);
+ return bch2_fcollapse(ei, offset, len);
return -EOPNOTSUPP;
}
@@ -2415,11 +2400,11 @@ static bool page_is_data(struct page *page)
page_state(page)->dirty_sectors);
}
-static loff_t bch2_next_pagecache_data(struct inode *inode,
- loff_t start_offset,
- loff_t end_offset)
+static loff_t bch2_next_pagecache_data(struct inode *vinode,
+ loff_t start_offset,
+ loff_t end_offset)
{
- struct address_space *mapping = inode->i_mapping;
+ struct address_space *mapping = vinode->i_mapping;
struct page *page;
pgoff_t index;
@@ -2446,20 +2431,20 @@ static loff_t bch2_next_pagecache_data(struct inode *inode,
static loff_t bch2_seek_data(struct file *file, u64 offset)
{
- struct inode *inode = file->f_mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct btree_iter iter;
struct bkey_s_c k;
u64 isize, next_data = MAX_LFS_FILESIZE;
int ret;
- isize = i_size_read(inode);
+ isize = i_size_read(&ei->v);
if (offset >= isize)
return -ENXIO;
for_each_btree_key(&iter, c, BTREE_ID_EXTENTS,
- POS(inode->i_ino, offset >> 9), 0, k) {
- if (k.k->p.inode != inode->i_ino) {
+ POS(ei->v.i_ino, offset >> 9), 0, k) {
+ if (k.k->p.inode != ei->v.i_ino) {
break;
} else if (bkey_extent_is_data(k.k)) {
next_data = max(offset, bkey_start_offset(k.k) << 9);
@@ -2473,7 +2458,8 @@ static loff_t bch2_seek_data(struct file *file, u64 offset)
return ret;
if (next_data > offset)
- next_data = bch2_next_pagecache_data(inode, offset, next_data);
+ next_data = bch2_next_pagecache_data(&ei->v,
+ offset, next_data);
if (next_data > isize)
return -ENXIO;
@@ -2496,11 +2482,11 @@ static bool page_slot_is_data(struct address_space *mapping, pgoff_t index)
return ret;
}
-static loff_t bch2_next_pagecache_hole(struct inode *inode,
- loff_t start_offset,
- loff_t end_offset)
+static loff_t bch2_next_pagecache_hole(struct inode *vinode,
+ loff_t start_offset,
+ loff_t end_offset)
{
- struct address_space *mapping = inode->i_mapping;
+ struct address_space *mapping = vinode->i_mapping;
pgoff_t index;
for (index = start_offset >> PAGE_SHIFT;
@@ -2515,26 +2501,26 @@ static loff_t bch2_next_pagecache_hole(struct inode *inode,
static loff_t bch2_seek_hole(struct file *file, u64 offset)
{
- struct inode *inode = file->f_mapping->host;
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
struct btree_iter iter;
struct bkey_s_c k;
u64 isize, next_hole = MAX_LFS_FILESIZE;
int ret;
- isize = i_size_read(inode);
+ isize = i_size_read(&ei->v);
if (offset >= isize)
return -ENXIO;
for_each_btree_key(&iter, c, BTREE_ID_EXTENTS,
- POS(inode->i_ino, offset >> 9),
+ POS(ei->v.i_ino, offset >> 9),
BTREE_ITER_WITH_HOLES, k) {
- if (k.k->p.inode != inode->i_ino) {
- next_hole = bch2_next_pagecache_hole(inode,
+ if (k.k->p.inode != ei->v.i_ino) {
+ next_hole = bch2_next_pagecache_hole(&ei->v,
offset, MAX_LFS_FILESIZE);
break;
} else if (!bkey_extent_is_data(k.k)) {
- next_hole = bch2_next_pagecache_hole(inode,
+ next_hole = bch2_next_pagecache_hole(&ei->v,
max(offset, bkey_start_offset(k.k) << 9),
k.k->p.offset << 9);
diff --git a/fs/bcachefs/fs-io.h b/fs/bcachefs/fs-io.h
index 9fdcb6b6602a..cea71ba1be29 100644
--- a/fs/bcachefs/fs-io.h
+++ b/fs/bcachefs/fs-io.h
@@ -24,7 +24,7 @@ ssize_t bch2_write_iter(struct kiocb *, struct iov_iter *);
int bch2_fsync(struct file *, loff_t, loff_t, int);
-int bch2_truncate(struct inode *, struct iattr *);
+int bch2_truncate(struct bch_inode_info *, struct iattr *);
long bch2_fallocate_dispatch(struct file *, int, loff_t, loff_t);
loff_t bch2_llseek(struct file *, loff_t, int);
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index c5e991591796..2363f4d97ce2 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -67,11 +67,10 @@ int __must_check __bch2_write_inode(struct bch_fs *c,
void *p)
{
struct btree_iter iter;
- struct inode *inode = &ei->v;
struct bch_inode_unpacked inode_u;
struct bkey_inode_buf inode_p;
- u64 inum = inode->i_ino;
- unsigned i_nlink = READ_ONCE(inode->i_nlink);
+ u64 inum = ei->v.i_ino;
+ unsigned i_nlink = READ_ONCE(ei->v.i_nlink);
int ret;
/*
@@ -112,16 +111,16 @@ int __must_check __bch2_write_inode(struct bch_fs *c,
goto out;
}
- BUG_ON(i_nlink < nlink_bias(inode->i_mode));
+ BUG_ON(i_nlink < nlink_bias(ei->v.i_mode));
- inode_u.bi_mode = inode->i_mode;
- inode_u.bi_uid = i_uid_read(inode);
- inode_u.bi_gid = i_gid_read(inode);
- inode_u.bi_nlink= i_nlink - nlink_bias(inode->i_mode);
- inode_u.bi_dev = inode->i_rdev;
- inode_u.bi_atime= timespec_to_bch2_time(c, inode->i_atime);
- inode_u.bi_mtime= timespec_to_bch2_time(c, inode->i_mtime);
- inode_u.bi_ctime= timespec_to_bch2_time(c, inode->i_ctime);
+ inode_u.bi_mode = ei->v.i_mode;
+ inode_u.bi_uid = i_uid_read(&ei->v);
+ inode_u.bi_gid = i_gid_read(&ei->v);
+ inode_u.bi_nlink= i_nlink - nlink_bias(ei->v.i_mode);
+ inode_u.bi_dev = ei->v.i_rdev;
+ inode_u.bi_atime= timespec_to_bch2_time(c, ei->v.i_atime);
+ inode_u.bi_mtime= timespec_to_bch2_time(c, ei->v.i_mtime);
+ inode_u.bi_ctime= timespec_to_bch2_time(c, ei->v.i_ctime);
bch2_inode_pack(&inode_p, &inode_u);
@@ -171,221 +170,212 @@ int bch2_dec_nlink(struct bch_fs *c, struct bch_inode_info *ei)
return ret;
}
-static struct inode *bch2_vfs_inode_get(struct super_block *sb, u64 inum)
+static struct inode *bch2_vfs_inode_get(struct bch_fs *c, u64 inum)
{
- struct bch_fs *c = sb->s_fs_info;
- struct inode *inode;
struct bch_inode_unpacked inode_u;
struct bch_inode_info *ei;
int ret;
pr_debug("inum %llu", inum);
- inode = iget_locked(sb, inum);
- if (unlikely(!inode))
+ ei = to_bch_ei(iget_locked(c->vfs_sb, inum));
+ if (unlikely(!ei))
return ERR_PTR(-ENOMEM);
- if (!(inode->i_state & I_NEW))
- return inode;
+ if (!(ei->v.i_state & I_NEW))
+ return &ei->v;
ret = bch2_inode_find_by_inum(c, inum, &inode_u);
if (ret) {
- iget_failed(inode);
+ iget_failed(&ei->v);
return ERR_PTR(ret);
}
- ei = to_bch_ei(inode);
bch2_vfs_inode_init(c, ei, &inode_u);
ei->ei_journal_seq = bch2_inode_journal_seq(&c->journal, inum);
- unlock_new_inode(inode);
+ unlock_new_inode(&ei->v);
- return inode;
+ return &ei->v;
}
-static struct inode *bch2_vfs_inode_create(struct bch_fs *c,
- struct inode *parent,
- umode_t mode, dev_t rdev)
+static struct bch_inode_info *bch2_vfs_inode_create(struct bch_fs *c,
+ struct bch_inode_info *dir_ei,
+ umode_t mode, dev_t rdev)
{
- struct inode *inode;
struct posix_acl *default_acl = NULL, *acl = NULL;
struct bch_inode_info *ei;
struct bch_inode_unpacked inode_u;
int ret;
- inode = new_inode(parent->i_sb);
- if (unlikely(!inode))
+ ei = to_bch_ei(new_inode(c->vfs_sb));
+ if (unlikely(!ei))
return ERR_PTR(-ENOMEM);
- inode_init_owner(inode, parent, mode);
+ inode_init_owner(&ei->v, &dir_ei->v, mode);
#ifdef CONFIG_BCACHEFS_POSIX_ACL
- ret = posix_acl_create(parent, &inode->i_mode, &default_acl, &acl);
+ ret = posix_acl_create(&dir_ei->v, &ei->v.i_mode, &default_acl, &acl);
if (ret) {
- make_bad_inode(inode);
+ make_bad_inode(&ei->v);
goto err;
}
#endif
- ei = to_bch_ei(inode);
-
- bch2_inode_init(c, &inode_u, i_uid_read(inode),
- i_gid_read(inode), inode->i_mode, rdev);
+ bch2_inode_init(c, &inode_u,
+ i_uid_read(&ei->v),
+ i_gid_read(&ei->v),
+ ei->v.i_mode, rdev);
ret = bch2_inode_create(c, &inode_u,
- BLOCKDEV_INODE_MAX, 0,
- &c->unused_inode_hint);
+ BLOCKDEV_INODE_MAX, 0,
+ &c->unused_inode_hint);
if (unlikely(ret)) {
/*
* indicate to bch_evict_inode that the inode was never actually
* created:
*/
- make_bad_inode(inode);
+ make_bad_inode(&ei->v);
goto err;
}
bch2_vfs_inode_init(c, ei, &inode_u);
if (default_acl) {
- ret = bch2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
+ ret = bch2_set_acl(&ei->v, default_acl, ACL_TYPE_DEFAULT);
if (unlikely(ret))
goto err;
}
if (acl) {
- ret = bch2_set_acl(inode, acl, ACL_TYPE_ACCESS);
+ ret = bch2_set_acl(&ei->v, acl, ACL_TYPE_ACCESS);
if (unlikely(ret))
goto err;
}
- insert_inode_hash(inode);
+ insert_inode_hash(&ei->v);
atomic_long_inc(&c->nr_inodes);
out:
posix_acl_release(default_acl);
posix_acl_release(acl);
- return inode;
+ return ei;
err:
- clear_nlink(inode);
- iput(inode);
- inode = ERR_PTR(ret);
+ clear_nlink(&ei->v);
+ iput(&ei->v);
+ ei = ERR_PTR(ret);
goto out;
}
-static int bch2_vfs_dirent_create(struct bch_fs *c, struct inode *dir,
+static int bch2_vfs_dirent_create(struct bch_fs *c,
+ struct bch_inode_info *dir_ei,
u8 type, const struct qstr *name,
- struct inode *dst)
+ u64 dst)
{
- struct bch_inode_info *dir_ei = to_bch_ei(dir);
int ret;
- ret = bch2_dirent_create(c, dir->i_ino, &dir_ei->ei_str_hash,
- type, name, dst->i_ino,
+ ret = bch2_dirent_create(c, dir_ei->v.i_ino, &dir_ei->ei_str_hash,
+ type, name, dst,
&dir_ei->ei_journal_seq,
BCH_HASH_SET_MUST_CREATE);
if (unlikely(ret))
return ret;
- dir->i_mtime = dir->i_ctime = current_time(dir);
- mark_inode_dirty_sync(dir);
+ dir_ei->v.i_mtime = dir_ei->v.i_ctime = current_time(&dir_ei->v);
+ mark_inode_dirty_sync(&dir_ei->v);
return 0;
}
-static int __bch2_create(struct inode *dir, struct dentry *dentry,
+static int __bch2_create(struct bch_inode_info *dir_ei, struct dentry *dentry,
umode_t mode, dev_t rdev)
{
- struct bch_inode_info *dir_ei = to_bch_ei(dir);
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct inode *inode;
+ struct bch_fs *c = dir_ei->v.i_sb->s_fs_info;
struct bch_inode_info *ei;
int ret;
- inode = bch2_vfs_inode_create(c, dir, mode, rdev);
- if (unlikely(IS_ERR(inode)))
- return PTR_ERR(inode);
+ ei = bch2_vfs_inode_create(c, dir_ei, mode, rdev);
+ if (unlikely(IS_ERR(ei)))
+ return PTR_ERR(ei);
- ei = to_bch_ei(inode);
-
- ret = bch2_vfs_dirent_create(c, dir, mode_to_type(mode),
- &dentry->d_name, inode);
+ ret = bch2_vfs_dirent_create(c, dir_ei, mode_to_type(mode),
+ &dentry->d_name, ei->v.i_ino);
if (unlikely(ret)) {
- clear_nlink(inode);
- iput(inode);
+ clear_nlink(&ei->v);
+ iput(&ei->v);
return ret;
}
if (dir_ei->ei_journal_seq > ei->ei_journal_seq)
ei->ei_journal_seq = dir_ei->ei_journal_seq;
- d_instantiate(dentry, inode);
+ d_instantiate(dentry, &ei->v);
return 0;
}
/* methods */
-static struct dentry *bch2_lookup(struct inode *dir, struct dentry *dentry,
+static struct dentry *bch2_lookup(struct inode *vdir, struct dentry *dentry,
unsigned int flags)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct bch_inode_info *dir_ei = to_bch_ei(dir);
- struct inode *inode = NULL;
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir);
+ struct inode *vinode = NULL;
u64 inum;
- inum = bch2_dirent_lookup(c, dir->i_ino,
- &dir_ei->ei_str_hash,
- &dentry->d_name);
+ inum = bch2_dirent_lookup(c, dir_ei->v.i_ino,
+ &dir_ei->ei_str_hash,
+ &dentry->d_name);
if (inum)
- inode = bch2_vfs_inode_get(dir->i_sb, inum);
+ vinode = bch2_vfs_inode_get(c, inum);
- return d_splice_alias(inode, dentry);
+ return d_splice_alias(vinode, dentry);
}
-static int bch2_create(struct inode *dir, struct dentry *dentry,
+static int bch2_create(struct inode *vdir, struct dentry *dentry,
umode_t mode, bool excl)
{
- return __bch2_create(dir, dentry, mode|S_IFREG, 0);
+ return __bch2_create(to_bch_ei(vdir), dentry, mode|S_IFREG, 0);
}
-static int bch2_link(struct dentry *old_dentry, struct inode *dir,
+static int bch2_link(struct dentry *old_dentry, struct inode *vdir,
struct dentry *dentry)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct inode *inode = old_dentry->d_inode;
- struct bch_inode_info *ei = to_bch_ei(inode);
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir);
+ struct bch_inode_info *ei = to_bch_ei(old_dentry->d_inode);
int ret;
- lockdep_assert_held(&inode->i_rwsem);
+ lockdep_assert_held(&ei->v.i_rwsem);
- inode->i_ctime = current_time(dir);
+ ei->v.i_ctime = current_time(&dir_ei->v);
ret = bch2_inc_nlink(c, ei);
if (ret)
return ret;
- ihold(inode);
+ ihold(&ei->v);
- ret = bch2_vfs_dirent_create(c, dir, mode_to_type(inode->i_mode),
- &dentry->d_name, inode);
+ ret = bch2_vfs_dirent_create(c, dir_ei, mode_to_type(ei->v.i_mode),
+ &dentry->d_name, ei->v.i_ino);
if (unlikely(ret)) {
bch2_dec_nlink(c, ei);
- iput(inode);
+ iput(&ei->v);
return ret;
}
- d_instantiate(dentry, inode);
+ d_instantiate(dentry, &ei->v);
return 0;
}
-static int bch2_unlink(struct inode *dir, struct dentry *dentry)
+static int bch2_unlink(struct inode *vdir, struct dentry *dentry)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct bch_inode_info *dir_ei = to_bch_ei(dir);
- struct inode *inode = dentry->d_inode;
- struct bch_inode_info *ei = to_bch_ei(inode);
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir);
+ struct bch_inode_info *ei = to_bch_ei(dentry->d_inode);
int ret;
- lockdep_assert_held(&inode->i_rwsem);
+ lockdep_assert_held(&ei->v.i_rwsem);
- ret = bch2_dirent_delete(c, dir->i_ino, &dir_ei->ei_str_hash,
+ ret = bch2_dirent_delete(c, dir_ei->v.i_ino, &dir_ei->ei_str_hash,
&dentry->d_name, &dir_ei->ei_journal_seq);
if (ret)
return ret;
@@ -393,11 +383,11 @@ static int bch2_unlink(struct inode *dir, struct dentry *dentry)
if (dir_ei->ei_journal_seq > ei->ei_journal_seq)
ei->ei_journal_seq = dir_ei->ei_journal_seq;
- inode->i_ctime = dir->i_ctime;
+ ei->v.i_ctime = dir_ei->v.i_ctime;
- if (S_ISDIR(inode->i_mode)) {
+ if (S_ISDIR(ei->v.i_mode)) {
bch2_dec_nlink(c, dir_ei);
- drop_nlink(inode);
+ drop_nlink(&ei->v);
}
bch2_dec_nlink(c, ei);
@@ -405,28 +395,25 @@ static int bch2_unlink(struct inode *dir, struct dentry *dentry)
return 0;
}
-static int bch2_symlink(struct inode *dir, struct dentry *dentry,
+static int bch2_symlink(struct inode *vdir, struct dentry *dentry,
const char *symname)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct inode *inode;
- struct bch_inode_info *ei, *dir_ei = to_bch_ei(dir);
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir), *ei;
int ret;
- inode = bch2_vfs_inode_create(c, dir, S_IFLNK|S_IRWXUGO, 0);
- if (unlikely(IS_ERR(inode)))
- return PTR_ERR(inode);
-
- ei = to_bch_ei(inode);
+ ei = bch2_vfs_inode_create(c, dir_ei, S_IFLNK|S_IRWXUGO, 0);
+ if (unlikely(IS_ERR(ei)))
+ return PTR_ERR(ei);
- inode_lock(inode);
- ret = page_symlink(inode, symname, strlen(symname) + 1);
- inode_unlock(inode);
+ inode_lock(&ei->v);
+ ret = page_symlink(&ei->v, symname, strlen(symname) + 1);
+ inode_unlock(&ei->v);
if (unlikely(ret))
goto err;
- ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
+ ret = filemap_write_and_wait_range(ei->v.i_mapping, 0, LLONG_MAX);
if (unlikely(ret))
goto err;
@@ -434,204 +421,207 @@ static int bch2_symlink(struct inode *dir, struct dentry *dentry,
if (dir_ei->ei_journal_seq < ei->ei_journal_seq)
dir_ei->ei_journal_seq = ei->ei_journal_seq;
- ret = bch2_vfs_dirent_create(c, dir, DT_LNK, &dentry->d_name, inode);
+ ret = bch2_vfs_dirent_create(c, dir_ei, DT_LNK, &dentry->d_name,
+ ei->v.i_ino);
if (unlikely(ret))
goto err;
- d_instantiate(dentry, inode);
+ d_instantiate(dentry, &ei->v);
return 0;
err:
- clear_nlink(inode);
- iput(inode);
+ clear_nlink(&ei->v);
+ iput(&ei->v);
return ret;
}
-static int bch2_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
+static int bch2_mkdir(struct inode *vdir, struct dentry *dentry, umode_t mode)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir);
int ret;
- lockdep_assert_held(&dir->i_rwsem);
+ lockdep_assert_held(&dir_ei->v.i_rwsem);
- ret = __bch2_create(dir, dentry, mode|S_IFDIR, 0);
+ ret = __bch2_create(dir_ei, dentry, mode|S_IFDIR, 0);
if (unlikely(ret))
return ret;
- bch2_inc_nlink(c, to_bch_ei(dir));
+ bch2_inc_nlink(c, dir_ei);
return 0;
}
-static int bch2_rmdir(struct inode *dir, struct dentry *dentry)
+static int bch2_rmdir(struct inode *vdir, struct dentry *dentry)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct inode *inode = dentry->d_inode;
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
- if (bch2_empty_dir(c, inode->i_ino))
+ if (bch2_empty_dir(c, dentry->d_inode->i_ino))
return -ENOTEMPTY;
- return bch2_unlink(dir, dentry);
+ return bch2_unlink(vdir, dentry);
}
-static int bch2_mknod(struct inode *dir, struct dentry *dentry,
+static int bch2_mknod(struct inode *vdir, struct dentry *dentry,
umode_t mode, dev_t rdev)
{
- return __bch2_create(dir, dentry, mode, rdev);
+ return __bch2_create(to_bch_ei(vdir), dentry, mode, rdev);
}
-static int bch2_rename(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry)
+static int bch2_rename(struct bch_fs *c,
+ struct bch_inode_info *old_dir,
+ struct dentry *old_dentry,
+ struct bch_inode_info *new_dir,
+ struct dentry *new_dentry)
{
- struct bch_fs *c = old_dir->i_sb->s_fs_info;
- struct inode *old_inode = old_dentry->d_inode;
- struct bch_inode_info *ei = to_bch_ei(old_inode);
- struct inode *new_inode = new_dentry->d_inode;
- struct timespec now = current_time(old_dir);
+ struct bch_inode_info *old_inode = to_bch_ei(old_dentry->d_inode);
+ struct bch_inode_info *new_inode = to_bch_ei(new_dentry->d_inode);
+ struct timespec now = current_time(&old_dir->v);
int ret;
- lockdep_assert_held(&old_dir->i_rwsem);
- lockdep_assert_held(&new_dir->i_rwsem);
+ lockdep_assert_held(&old_dir->v.i_rwsem);
+ lockdep_assert_held(&new_dir->v.i_rwsem);
if (new_inode)
- filemap_write_and_wait_range(old_inode->i_mapping,
+ filemap_write_and_wait_range(old_inode->v.i_mapping,
0, LLONG_MAX);
- if (new_inode && S_ISDIR(old_inode->i_mode)) {
- lockdep_assert_held(&new_inode->i_rwsem);
+ if (new_inode && S_ISDIR(old_inode->v.i_mode)) {
+ lockdep_assert_held(&new_inode->v.i_rwsem);
- if (!S_ISDIR(new_inode->i_mode))
+ if (!S_ISDIR(new_inode->v.i_mode))
return -ENOTDIR;
- if (bch2_empty_dir(c, new_inode->i_ino))
+ if (bch2_empty_dir(c, new_inode->v.i_ino))
return -ENOTEMPTY;
ret = bch2_dirent_rename(c,
- old_dir, &old_dentry->d_name,
- new_dir, &new_dentry->d_name,
- &ei->ei_journal_seq, BCH_RENAME_OVERWRITE);
+ old_dir, &old_dentry->d_name,
+ new_dir, &new_dentry->d_name,
+ &old_inode->ei_journal_seq, BCH_RENAME_OVERWRITE);
if (unlikely(ret))
return ret;
- clear_nlink(new_inode);
- bch2_dec_nlink(c, to_bch_ei(old_dir));
+ clear_nlink(&new_inode->v);
+ bch2_dec_nlink(c, old_dir);
} else if (new_inode) {
- lockdep_assert_held(&new_inode->i_rwsem);
+ lockdep_assert_held(&new_inode->v.i_rwsem);
ret = bch2_dirent_rename(c,
- old_dir, &old_dentry->d_name,
- new_dir, &new_dentry->d_name,
- &ei->ei_journal_seq, BCH_RENAME_OVERWRITE);
+ old_dir, &old_dentry->d_name,
+ new_dir, &new_dentry->d_name,
+ &old_inode->ei_journal_seq, BCH_RENAME_OVERWRITE);
if (unlikely(ret))
return ret;
- new_inode->i_ctime = now;
- bch2_dec_nlink(c, to_bch_ei(new_inode));
- } else if (S_ISDIR(old_inode->i_mode)) {
+ new_inode->v.i_ctime = now;
+ bch2_dec_nlink(c, new_inode);
+ } else if (S_ISDIR(old_inode->v.i_mode)) {
ret = bch2_dirent_rename(c,
- old_dir, &old_dentry->d_name,
- new_dir, &new_dentry->d_name,
- &ei->ei_journal_seq, BCH_RENAME);
+ old_dir, &old_dentry->d_name,
+ new_dir, &new_dentry->d_name,
+ &old_inode->ei_journal_seq, BCH_RENAME);
if (unlikely(ret))
return ret;
- bch2_inc_nlink(c, to_bch_ei(new_dir));
- bch2_dec_nlink(c, to_bch_ei(old_dir));
+ bch2_inc_nlink(c, new_dir);
+ bch2_dec_nlink(c, old_dir);
} else {
ret = bch2_dirent_rename(c,
- old_dir, &old_dentry->d_name,
- new_dir, &new_dentry->d_name,
- &ei->ei_journal_seq, BCH_RENAME);
+ old_dir, &old_dentry->d_name,
+ new_dir, &new_dentry->d_name,
+ &old_inode->ei_journal_seq, BCH_RENAME);
if (unlikely(ret))
return ret;
}
- old_dir->i_ctime = old_dir->i_mtime = now;
- new_dir->i_ctime = new_dir->i_mtime = now;
- mark_inode_dirty_sync(old_dir);
- mark_inode_dirty_sync(new_dir);
+ old_dir->v.i_ctime = old_dir->v.i_mtime = now;
+ new_dir->v.i_ctime = new_dir->v.i_mtime = now;
+ mark_inode_dirty_sync(&old_dir->v);
+ mark_inode_dirty_sync(&new_dir->v);
- old_inode->i_ctime = now;
- mark_inode_dirty_sync(old_inode);
+ old_inode->v.i_ctime = now;
+ mark_inode_dirty_sync(&old_inode->v);
return 0;
}
-static int bch2_rename_exchange(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry)
+static int bch2_rename_exchange(struct bch_fs *c,
+ struct bch_inode_info *old_dir,
+ struct dentry *old_dentry,
+ struct bch_inode_info *new_dir,
+ struct dentry *new_dentry)
{
- struct bch_fs *c = old_dir->i_sb->s_fs_info;
- struct inode *old_inode = old_dentry->d_inode;
- struct inode *new_inode = new_dentry->d_inode;
- struct bch_inode_info *ei = to_bch_ei(old_inode);
- struct timespec now = current_time(old_dir);
+ struct bch_inode_info *old_inode = to_bch_ei(old_dentry->d_inode);
+ struct bch_inode_info *new_inode = to_bch_ei(new_dentry->d_inode);
+ struct timespec now = current_time(&old_dir->v);
int ret;
ret = bch2_dirent_rename(c,
- old_dir, &old_dentry->d_name,
- new_dir, &new_dentry->d_name,
- &ei->ei_journal_seq, BCH_RENAME_EXCHANGE);
+ old_dir, &old_dentry->d_name,
+ new_dir, &new_dentry->d_name,
+ &old_inode->ei_journal_seq, BCH_RENAME_EXCHANGE);
if (unlikely(ret))
return ret;
- if (S_ISDIR(old_inode->i_mode) !=
- S_ISDIR(new_inode->i_mode)) {
- if (S_ISDIR(old_inode->i_mode)) {
- bch2_inc_nlink(c, to_bch_ei(new_dir));
- bch2_dec_nlink(c, to_bch_ei(old_dir));
+ if (S_ISDIR(old_inode->v.i_mode) !=
+ S_ISDIR(new_inode->v.i_mode)) {
+ if (S_ISDIR(old_inode->v.i_mode)) {
+ bch2_inc_nlink(c, new_dir);
+ bch2_dec_nlink(c, old_dir);
} else {
- bch2_dec_nlink(c, to_bch_ei(new_dir));
- bch2_inc_nlink(c, to_bch_ei(old_dir));
+ bch2_dec_nlink(c, new_dir);
+ bch2_inc_nlink(c, old_dir);
}
}
- old_dir->i_ctime = old_dir->i_mtime = now;
- new_dir->i_ctime = new_dir->i_mtime = now;
- mark_inode_dirty_sync(old_dir);
- mark_inode_dirty_sync(new_dir);
+ old_dir->v.i_ctime = old_dir->v.i_mtime = now;
+ new_dir->v.i_ctime = new_dir->v.i_mtime = now;
+ mark_inode_dirty_sync(&old_dir->v);
+ mark_inode_dirty_sync(&new_dir->v);
- old_inode->i_ctime = now;
- new_inode->i_ctime = now;
- mark_inode_dirty_sync(old_inode);
- mark_inode_dirty_sync(new_inode);
+ old_inode->v.i_ctime = now;
+ new_inode->v.i_ctime = now;
+ mark_inode_dirty_sync(&old_inode->v);
+ mark_inode_dirty_sync(&new_inode->v);
return 0;
}
-static int bch2_rename2(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry,
+static int bch2_rename2(struct inode *old_vdir, struct dentry *old_dentry,
+ struct inode *new_vdir, struct dentry *new_dentry,
unsigned flags)
{
+ struct bch_fs *c = old_vdir->i_sb->s_fs_info;
+ struct bch_inode_info *old_dir = to_bch_ei(old_vdir);
+ struct bch_inode_info *new_dir = to_bch_ei(new_vdir);
+
if (flags & ~(RENAME_NOREPLACE|RENAME_EXCHANGE))
return -EINVAL;
if (flags & RENAME_EXCHANGE)
- return bch2_rename_exchange(old_dir, old_dentry,
- new_dir, new_dentry);
+ return bch2_rename_exchange(c, old_dir, old_dentry,
+ new_dir, new_dentry);
- return bch2_rename(old_dir, old_dentry, new_dir, new_dentry);
+ return bch2_rename(c, old_dir, old_dentry, new_dir, new_dentry);
}
static int bch2_setattr(struct dentry *dentry, struct iattr *iattr)
{
- struct inode *inode = dentry->d_inode;
- struct bch_inode_info *ei = to_bch_ei(inode);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(dentry->d_inode);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
int ret = 0;
- lockdep_assert_held(&inode->i_rwsem);
-
- pr_debug("i_size was %llu update has %llu",
- inode->i_size, iattr->ia_size);
+ lockdep_assert_held(&ei->v.i_rwsem);
ret = setattr_prepare(dentry, iattr);
if (ret)
return ret;
if (iattr->ia_valid & ATTR_SIZE) {
- ret = bch2_truncate(inode, iattr);
+ ret = bch2_truncate(ei, iattr);
} else {
mutex_lock(&ei->ei_update_lock);
- setattr_copy(inode, iattr);
+ setattr_copy(&ei->v, iattr);
ret = bch2_write_inode(c, ei);
mutex_unlock(&ei->ei_update_lock);
}
@@ -640,22 +630,23 @@ static int bch2_setattr(struct dentry *dentry, struct iattr *iattr)
return ret;
if (iattr->ia_valid & ATTR_MODE)
- ret = posix_acl_chmod(inode, inode->i_mode);
+ ret = posix_acl_chmod(&ei->v, ei->v.i_mode);
return ret;
}
-static int bch2_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
+static int bch2_tmpfile(struct inode *vdir, struct dentry *dentry, umode_t mode)
{
- struct bch_fs *c = dir->i_sb->s_fs_info;
- struct inode *inode;
+ struct bch_fs *c = vdir->i_sb->s_fs_info;
+ struct bch_inode_info *dir_ei = to_bch_ei(vdir);
+ struct bch_inode_info *ei;
/* XXX: i_nlink should be 0? */
- inode = bch2_vfs_inode_create(c, dir, mode, 0);
- if (unlikely(IS_ERR(inode)))
- return PTR_ERR(inode);
+ ei = bch2_vfs_inode_create(c, dir_ei, mode, 0);
+ if (unlikely(IS_ERR(ei)))
+ return PTR_ERR(ei);
- d_tmpfile(dentry, inode);
+ d_tmpfile(dentry, &ei->v);
return 0;
}
@@ -702,10 +693,11 @@ static int bch2_fill_extent(struct fiemap_extent_info *info,
}
}
-static int bch2_fiemap(struct inode *inode, struct fiemap_extent_info *info,
+static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info,
u64 start, u64 len)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_fs *c = vinode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
struct btree_iter iter;
struct bkey_s_c k;
BKEY_PADDED(k) tmp;
@@ -716,11 +708,11 @@ static int bch2_fiemap(struct inode *inode, struct fiemap_extent_info *info,
return -EINVAL;
for_each_btree_key(&iter, c, BTREE_ID_EXTENTS,
- POS(inode->i_ino, start >> 9), 0, k)
+ POS(ei->v.i_ino, start >> 9), 0, k)
if (bkey_extent_is_data(k.k) ||
k.k->type == BCH_RESERVATION) {
if (bkey_cmp(bkey_start_pos(k.k),
- POS(inode->i_ino, (start + len) >> 9)) >= 0)
+ POS(ei->v.i_ino, (start + len) >> 9)) >= 0)
break;
if (have_extent) {
@@ -772,15 +764,15 @@ static const unsigned bch_inode_flags_to_user_flags_map[] = {
};
/* Set VFS inode flags from bcachefs inode: */
-static void bch2_inode_flags_to_vfs(struct inode *inode)
+static void bch2_inode_flags_to_vfs(struct bch_inode_info *ei)
{
- unsigned i, flags = to_bch_ei(inode)->ei_flags;
+ unsigned i, flags = ei->ei_flags;
for (i = 0; i < ARRAY_SIZE(bch_inode_flags_to_vfs_flags_map); i++)
if (flags & (1 << i))
- inode->i_flags |= bch_inode_flags_to_vfs_flags_map[i];
+ ei->v.i_flags |= bch_inode_flags_to_vfs_flags_map[i];
else
- inode->i_flags &= ~bch_inode_flags_to_vfs_flags_map[i];
+ ei->v.i_flags &= ~bch_inode_flags_to_vfs_flags_map[i];
}
/* Get FS_IOC_GETFLAGS flags from bcachefs inode: */
@@ -833,13 +825,12 @@ static int bch2_inode_user_flags_set(struct bch_inode_info *ei,
#define FS_IOC_GOINGDOWN _IOR ('X', 125, __u32)
-static long bch2_fs_file_ioctl(struct file *filp, unsigned int cmd,
+static long bch2_fs_file_ioctl(struct file *file, unsigned int cmd,
unsigned long arg)
{
- struct inode *inode = file_inode(filp);
- struct super_block *sb = inode->i_sb;
+ struct bch_inode_info *ei = file_bch_inode(file);
+ struct super_block *sb = ei->v.i_sb;
struct bch_fs *c = sb->s_fs_info;
- struct bch_inode_info *ei = to_bch_ei(inode);
unsigned flags;
int ret;
@@ -849,11 +840,11 @@ static long bch2_fs_file_ioctl(struct file *filp, unsigned int cmd,
(int __user *) arg);
case FS_IOC_SETFLAGS: {
- ret = mnt_want_write_file(filp);
+ ret = mnt_want_write_file(file);
if (ret)
return ret;
- if (!inode_owner_or_capable(inode)) {
+ if (!inode_owner_or_capable(&ei->v)) {
ret = -EACCES;
goto setflags_out;
}
@@ -863,25 +854,25 @@ static long bch2_fs_file_ioctl(struct file *filp, unsigned int cmd,
goto setflags_out;
}
- if (!S_ISREG(inode->i_mode) &&
- !S_ISDIR(inode->i_mode) &&
+ if (!S_ISREG(ei->v.i_mode) &&
+ !S_ISDIR(ei->v.i_mode) &&
(flags & (FS_NODUMP_FL|FS_NOATIME_FL)) != flags) {
ret = -EINVAL;
goto setflags_out;
}
- inode_lock(inode);
+ inode_lock(&ei->v);
mutex_lock(&ei->ei_update_lock);
ret = __bch2_write_inode(c, ei, bch2_inode_user_flags_set, &flags);
mutex_unlock(&ei->ei_update_lock);
if (!ret)
- bch2_inode_flags_to_vfs(inode);
+ bch2_inode_flags_to_vfs(ei);
- inode_unlock(inode);
+ inode_unlock(&ei->v);
setflags_out:
- mnt_drop_write_file(filp);
+ mnt_drop_write_file(file);
return ret;
}
@@ -933,8 +924,7 @@ static loff_t bch2_dir_llseek(struct file *file, loff_t offset, int whence)
static int bch2_vfs_readdir(struct file *file, struct dir_context *ctx)
{
- struct inode *inode = file_inode(file);
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_fs *c = file_inode(file)->i_sb->s_fs_info;
return bch2_readdir(c, file, ctx);
}
@@ -1034,20 +1024,21 @@ static const struct address_space_operations bch_address_space_operations = {
static struct inode *bch2_nfs_get_inode(struct super_block *sb,
u64 ino, u32 generation)
{
- struct inode *inode;
+ struct bch_fs *c = sb->s_fs_info;
+ struct inode *vinode;
if (ino < BCACHEFS_ROOT_INO)
return ERR_PTR(-ESTALE);
- inode = bch2_vfs_inode_get(sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
- if (generation && inode->i_generation != generation) {
+ vinode = bch2_vfs_inode_get(c, ino);
+ if (IS_ERR(vinode))
+ return ERR_CAST(vinode);
+ if (generation && vinode->i_generation != generation) {
/* we didn't find the right inode.. */
- iput(inode);
+ iput(vinode);
return ERR_PTR(-ESTALE);
}
- return inode;
+ return vinode;
}
static struct dentry *bch2_fh_to_dentry(struct super_block *sb, struct fid *fid,
@@ -1074,51 +1065,49 @@ static void bch2_vfs_inode_init(struct bch_fs *c,
struct bch_inode_info *ei,
struct bch_inode_unpacked *bi)
{
- struct inode *inode = &ei->v;
-
pr_debug("init inode %llu with mode %o",
bi->bi_inum, bi->bi_mode);
ei->ei_flags = bi->bi_flags;
ei->ei_size = bi->bi_size;
- inode->i_mode = bi->bi_mode;
- i_uid_write(inode, bi->bi_uid);
- i_gid_write(inode, bi->bi_gid);
+ ei->v.i_mode = bi->bi_mode;
+ i_uid_write(&ei->v, bi->bi_uid);
+ i_gid_write(&ei->v, bi->bi_gid);
atomic64_set(&ei->ei_sectors, bi->bi_sectors);
- inode->i_blocks = bi->bi_sectors;
-
- inode->i_ino = bi->bi_inum;
- set_nlink(inode, bi->bi_nlink + nlink_bias(inode->i_mode));
- inode->i_rdev = bi->bi_dev;
- inode->i_generation = bi->bi_generation;
- inode->i_size = bi->bi_size;
- inode->i_atime = bch2_time_to_timespec(c, bi->bi_atime);
- inode->i_mtime = bch2_time_to_timespec(c, bi->bi_mtime);
- inode->i_ctime = bch2_time_to_timespec(c, bi->bi_ctime);
- bch2_inode_flags_to_vfs(inode);
+ ei->v.i_blocks = bi->bi_sectors;
+
+ ei->v.i_ino = bi->bi_inum;
+ set_nlink(&ei->v, bi->bi_nlink + nlink_bias(ei->v.i_mode));
+ ei->v.i_rdev = bi->bi_dev;
+ ei->v.i_generation = bi->bi_generation;
+ ei->v.i_size = bi->bi_size;
+ ei->v.i_atime = bch2_time_to_timespec(c, bi->bi_atime);
+ ei->v.i_mtime = bch2_time_to_timespec(c, bi->bi_mtime);
+ ei->v.i_ctime = bch2_time_to_timespec(c, bi->bi_ctime);
+ bch2_inode_flags_to_vfs(ei);
ei->ei_str_hash = bch2_hash_info_init(c, bi);
- inode->i_mapping->a_ops = &bch_address_space_operations;
+ ei->v.i_mapping->a_ops = &bch_address_space_operations;
- switch (inode->i_mode & S_IFMT) {
+ switch (ei->v.i_mode & S_IFMT) {
case S_IFREG:
- inode->i_op = &bch_file_inode_operations;
- inode->i_fop = &bch_file_operations;
+ ei->v.i_op = &bch_file_inode_operations;
+ ei->v.i_fop = &bch_file_operations;
break;
case S_IFDIR:
- inode->i_op = &bch_dir_inode_operations;
- inode->i_fop = &bch_dir_file_operations;
+ ei->v.i_op = &bch_dir_inode_operations;
+ ei->v.i_fop = &bch_dir_file_operations;
break;
case S_IFLNK:
- inode_nohighmem(inode);
- inode->i_op = &bch_symlink_inode_operations;
+ inode_nohighmem(&ei->v);
+ ei->v.i_op = &bch_symlink_inode_operations;
break;
default:
- init_special_inode(inode, inode->i_mode, inode->i_rdev);
- inode->i_op = &bch_special_inode_operations;
+ init_special_inode(&ei->v, ei->v.i_mode, ei->v.i_rdev);
+ ei->v.i_op = &bch_special_inode_operations;
break;
}
}
@@ -1144,21 +1133,22 @@ static struct inode *bch2_alloc_inode(struct super_block *sb)
static void bch2_i_callback(struct rcu_head *head)
{
- struct inode *inode = container_of(head, struct inode, i_rcu);
+ struct inode *vinode = container_of(head, struct inode, i_rcu);
+ struct bch_inode_info *ei = to_bch_ei(vinode);
- kmem_cache_free(bch2_inode_cache, to_bch_ei(inode));
+ kmem_cache_free(bch2_inode_cache, ei);
}
-static void bch2_destroy_inode(struct inode *inode)
+static void bch2_destroy_inode(struct inode *vinode)
{
- call_rcu(&inode->i_rcu, bch2_i_callback);
+ call_rcu(&vinode->i_rcu, bch2_i_callback);
}
-static int bch2_vfs_write_inode(struct inode *inode,
+static int bch2_vfs_write_inode(struct inode *vinode,
struct writeback_control *wbc)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
- struct bch_inode_info *ei = to_bch_ei(inode);
+ struct bch_fs *c = vinode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
int ret;
mutex_lock(&ei->ei_update_lock);
@@ -1174,24 +1164,23 @@ static int bch2_vfs_write_inode(struct inode *inode,
return ret;
}
-static void bch2_evict_inode(struct inode *inode)
+static void bch2_evict_inode(struct inode *vinode)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
-
- truncate_inode_pages_final(&inode->i_data);
+ struct bch_fs *c = vinode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
- if (!bch2_journal_error(&c->journal) && !is_bad_inode(inode)) {
- struct bch_inode_info *ei = to_bch_ei(inode);
+ truncate_inode_pages_final(&ei->v.i_data);
+ if (!bch2_journal_error(&c->journal) && !is_bad_inode(&ei->v)) {
/* XXX - we want to check this stuff iff there weren't IO errors: */
BUG_ON(atomic_long_read(&ei->ei_sectors_dirty_count));
- BUG_ON(atomic64_read(&ei->ei_sectors) != inode->i_blocks);
+ BUG_ON(atomic64_read(&ei->ei_sectors) != ei->v.i_blocks);
}
- clear_inode(inode);
+ clear_inode(&ei->v);
- if (!inode->i_nlink && !is_bad_inode(inode)) {
- bch2_inode_rm(c, inode->i_ino);
+ if (!ei->v.i_nlink && !is_bad_inode(&ei->v)) {
+ bch2_inode_rm(c, ei->v.i_ino);
atomic_long_dec(&c->nr_inodes);
}
}
@@ -1416,7 +1405,7 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
struct bch_fs *c;
struct bch_dev *ca;
struct super_block *sb;
- struct inode *inode;
+ struct inode *vinode;
struct bch_opts opts = bch2_opts_empty();
unsigned i;
int ret;
@@ -1484,13 +1473,13 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
sb->s_flags |= MS_POSIXACL;
#endif
- inode = bch2_vfs_inode_get(sb, BCACHEFS_ROOT_INO);
- if (IS_ERR(inode)) {
- ret = PTR_ERR(inode);
+ vinode = bch2_vfs_inode_get(c, BCACHEFS_ROOT_INO);
+ if (IS_ERR(vinode)) {
+ ret = PTR_ERR(vinode);
goto err_put_super;
}
- sb->s_root = d_make_root(inode);
+ sb->s_root = d_make_root(vinode);
if (!sb->s_root) {
ret = -ENOMEM;
goto err_put_super;
diff --git a/fs/bcachefs/xattr.c b/fs/bcachefs/xattr.c
index c44a5a24ac20..d3b80ec20db7 100644
--- a/fs/bcachefs/xattr.c
+++ b/fs/bcachefs/xattr.c
@@ -162,10 +162,9 @@ const struct bkey_ops bch2_bkey_xattr_ops = {
.val_to_text = bch2_xattr_to_text,
};
-int bch2_xattr_get(struct bch_fs *c, struct inode *inode,
+int bch2_xattr_get(struct bch_fs *c, struct bch_inode_info *ei,
const char *name, void *buffer, size_t size, int type)
{
- struct bch_inode_info *ei = to_bch_ei(inode);
struct btree_iter iter;
struct bkey_s_c k;
struct bkey_s_c_xattr xattr;
@@ -236,13 +235,11 @@ int __bch2_xattr_set(struct bch_fs *c, u64 inum,
return ret;
}
-int bch2_xattr_set(struct bch_fs *c, struct inode *inode,
- const char *name, const void *value, size_t size,
- int flags, int type)
+int bch2_xattr_set(struct bch_fs *c, struct bch_inode_info *ei,
+ const char *name, const void *value, size_t size,
+ int flags, int type)
{
- struct bch_inode_info *ei = to_bch_ei(inode);
-
- return __bch2_xattr_set(c, inode->i_ino, &ei->ei_str_hash,
+ return __bch2_xattr_set(c, ei->v.i_ino, &ei->ei_str_hash,
name, value, size, flags, type,
&ei->ei_journal_seq);
}
@@ -313,23 +310,25 @@ ssize_t bch2_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size)
}
static int bch2_xattr_get_handler(const struct xattr_handler *handler,
- struct dentry *dentry, struct inode *inode,
- const char *name, void *buffer, size_t size)
+ struct dentry *dentry, struct inode *vinode,
+ const char *name, void *buffer, size_t size)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
- return bch2_xattr_get(c, inode, name, buffer, size, handler->flags);
+ return bch2_xattr_get(c, ei, name, buffer, size, handler->flags);
}
static int bch2_xattr_set_handler(const struct xattr_handler *handler,
- struct dentry *dentry, struct inode *inode,
- const char *name, const void *value,
- size_t size, int flags)
+ struct dentry *dentry, struct inode *vinode,
+ const char *name, const void *value,
+ size_t size, int flags)
{
- struct bch_fs *c = inode->i_sb->s_fs_info;
+ struct bch_inode_info *ei = to_bch_ei(vinode);
+ struct bch_fs *c = ei->v.i_sb->s_fs_info;
- return bch2_xattr_set(c, inode, name, value, size, flags,
- handler->flags);
+ return bch2_xattr_set(c, ei, name, value, size, flags,
+ handler->flags);
}
static const struct xattr_handler bch_xattr_user_handler = {
diff --git a/fs/bcachefs/xattr.h b/fs/bcachefs/xattr.h
index 16310d89bf8f..9c815a2d7f52 100644
--- a/fs/bcachefs/xattr.h
+++ b/fs/bcachefs/xattr.h
@@ -9,12 +9,13 @@ extern const struct bkey_ops bch2_bkey_xattr_ops;
struct dentry;
struct xattr_handler;
struct bch_hash_info;
+struct bch_inode_info;
-int bch2_xattr_get(struct bch_fs *, struct inode *,
+int bch2_xattr_get(struct bch_fs *, struct bch_inode_info *,
const char *, void *, size_t, int);
int __bch2_xattr_set(struct bch_fs *, u64, const struct bch_hash_info *,
const char *, const void *, size_t, int, int, u64 *);
-int bch2_xattr_set(struct bch_fs *, struct inode *,
+int bch2_xattr_set(struct bch_fs *, struct bch_inode_info *,
const char *, const void *, size_t, int, int);
ssize_t bch2_xattr_list(struct dentry *, char *, size_t);