diff options
Diffstat (limited to 'fs/affs/file.c')
| -rw-r--r-- | fs/affs/file.c | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/fs/affs/file.c b/fs/affs/file.c index 7a71018e3f67..144b17482d12 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c @@ -15,6 +15,7 @@ #include <linux/uio.h> #include <linux/blkdev.h> +#include <linux/filelock.h> #include <linux/mpage.h> #include "affs.h" @@ -23,7 +24,7 @@ static struct buffer_head *affs_get_extblock_slow(struct inode *inode, u32 ext); static int affs_file_open(struct inode *inode, struct file *filp) { - pr_debug("open(%lu,%d)\n", + pr_debug("open(%llu,%d)\n", inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); atomic_inc(&AFFS_I(inode)->i_opencnt); return 0; @@ -32,7 +33,7 @@ affs_file_open(struct inode *inode, struct file *filp) static int affs_file_release(struct inode *inode, struct file *filp) { - pr_debug("release(%lu, %d)\n", + pr_debug("release(%llu, %d)\n", inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); if (atomic_dec_and_test(&AFFS_I(inode)->i_opencnt)) { @@ -139,14 +140,14 @@ affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext) AFFS_TAIL(sb, new_bh)->parent = cpu_to_be32(inode->i_ino); affs_fix_checksum(sb, new_bh); - mark_buffer_dirty_inode(new_bh, inode); + mmb_mark_buffer_dirty(new_bh, &AFFS_I(inode)->i_metadata_bhs); tmp = be32_to_cpu(AFFS_TAIL(sb, bh)->extension); if (tmp) affs_warning(sb, "alloc_ext", "previous extension set (%x)", tmp); AFFS_TAIL(sb, bh)->extension = cpu_to_be32(blocknr); affs_adjust_checksum(bh, blocknr - tmp); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); AFFS_I(inode)->i_extcnt++; mark_inode_dirty(inode); @@ -300,7 +301,7 @@ affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_resul struct buffer_head *ext_bh; u32 ext; - pr_debug("%s(%lu, %llu)\n", __func__, inode->i_ino, + pr_debug("%s(%llu, %llu)\n", __func__, inode->i_ino, (unsigned long long)block); BUG_ON(block > (sector_t)0x7fffffffUL); @@ -415,13 +416,14 @@ affs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) return ret; } -static int affs_write_begin(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, - struct folio **foliop, void **fsdata) +static int affs_write_begin(const struct kiocb *iocb, + struct address_space *mapping, + loff_t pos, unsigned len, + struct folio **foliop, void **fsdata) { int ret; - ret = cont_write_begin(file, mapping, pos, len, foliop, fsdata, + ret = cont_write_begin(iocb, mapping, pos, len, foliop, fsdata, affs_get_block, &AFFS_I(mapping->host)->mmu_private); if (unlikely(ret)) @@ -430,14 +432,15 @@ static int affs_write_begin(struct file *file, struct address_space *mapping, return ret; } -static int affs_write_end(struct file *file, struct address_space *mapping, - loff_t pos, unsigned int len, unsigned int copied, +static int affs_write_end(const struct kiocb *iocb, + struct address_space *mapping, loff_t pos, + unsigned int len, unsigned int copied, struct folio *folio, void *fsdata) { struct inode *inode = mapping->host; int ret; - ret = generic_write_end(file, mapping, pos, len, copied, folio, fsdata); + ret = generic_write_end(iocb, mapping, pos, len, copied, folio, fsdata); /* Clear Archived bit on file writes, as AmigaOS would do */ if (AFFS_I(inode)->i_protect & FIBF_ARCHIVED) { @@ -531,7 +534,7 @@ static int affs_do_read_folio_ofs(struct folio *folio, size_t to, int create) size_t bidx, boff, bsize; u32 tmp; - pr_debug("%s(%lu, %ld, 0, %zu)\n", __func__, inode->i_ino, + pr_debug("%s(%llu, %ld, 0, %zu)\n", __func__, inode->i_ino, folio->index, to); BUG_ON(to > folio_size(folio)); bsize = AFFS_SB(sb)->s_data_blksize; @@ -563,7 +566,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize) u32 size, bsize; u32 tmp; - pr_debug("%s(%lu, %d)\n", __func__, inode->i_ino, newsize); + pr_debug("%s(%llu, %d)\n", __func__, inode->i_ino, newsize); bsize = AFFS_SB(sb)->s_data_blksize; bh = NULL; size = AFFS_I(inode)->mmu_private; @@ -578,7 +581,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize) memset(AFFS_DATA(bh) + boff, 0, tmp); be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp); affs_fix_checksum(sb, bh); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); size += tmp; bidx++; } else if (bidx) { @@ -600,7 +603,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize) AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); affs_fix_checksum(sb, bh); bh->b_state &= ~(1UL << BH_New); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); if (prev_bh) { u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); @@ -610,7 +613,8 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize) bidx, tmp_next); AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); - mark_buffer_dirty_inode(prev_bh, inode); + mmb_mark_buffer_dirty(prev_bh, + &AFFS_I(inode)->i_metadata_bhs); affs_brelse(prev_bh); } size += bsize; @@ -631,7 +635,7 @@ static int affs_read_folio_ofs(struct file *file, struct folio *folio) size_t to; int err; - pr_debug("%s(%lu, %ld)\n", __func__, inode->i_ino, folio->index); + pr_debug("%s(%llu, %ld)\n", __func__, inode->i_ino, folio->index); to = folio_size(folio); if (folio_pos(folio) + to > inode->i_size) { to = inode->i_size - folio_pos(folio); @@ -645,7 +649,8 @@ static int affs_read_folio_ofs(struct file *file, struct folio *folio) return err; } -static int affs_write_begin_ofs(struct file *file, struct address_space *mapping, +static int affs_write_begin_ofs(const struct kiocb *iocb, + struct address_space *mapping, loff_t pos, unsigned len, struct folio **foliop, void **fsdata) { @@ -654,7 +659,7 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping pgoff_t index; int err = 0; - pr_debug("%s(%lu, %llu, %llu)\n", __func__, inode->i_ino, pos, + pr_debug("%s(%llu, %llu, %llu)\n", __func__, inode->i_ino, pos, pos + len); if (pos > AFFS_I(inode)->mmu_private) { /* XXX: this probably leaves a too-big i_size in case of @@ -684,9 +689,10 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping return err; } -static int affs_write_end_ofs(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, unsigned copied, - struct folio *folio, void *fsdata) +static int affs_write_end_ofs(const struct kiocb *iocb, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct folio *folio, void *fsdata) { struct inode *inode = mapping->host; struct super_block *sb = inode->i_sb; @@ -705,7 +711,7 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, * due to write_begin. */ - pr_debug("%s(%lu, %llu, %llu)\n", __func__, inode->i_ino, pos, + pr_debug("%s(%llu, %llu, %llu)\n", __func__, inode->i_ino, pos, pos + len); bsize = AFFS_SB(sb)->s_data_blksize; data = folio_address(folio); @@ -727,7 +733,7 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, AFFS_DATA_HEAD(bh)->size = cpu_to_be32( max(boff + tmp, be32_to_cpu(AFFS_DATA_HEAD(bh)->size))); affs_fix_checksum(sb, bh); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); written += tmp; from += tmp; bidx++; @@ -760,12 +766,13 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, bidx, tmp_next); AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); - mark_buffer_dirty_inode(prev_bh, inode); + mmb_mark_buffer_dirty(prev_bh, + &AFFS_I(inode)->i_metadata_bhs); } } affs_brelse(prev_bh); affs_fix_checksum(sb, bh); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); written += bsize; from += bsize; bidx++; @@ -794,13 +801,14 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, bidx, tmp_next); AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); - mark_buffer_dirty_inode(prev_bh, inode); + mmb_mark_buffer_dirty(prev_bh, + &AFFS_I(inode)->i_metadata_bhs); } } else if (be32_to_cpu(AFFS_DATA_HEAD(bh)->size) < tmp) AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); affs_brelse(prev_bh); affs_fix_checksum(sb, bh); - mark_buffer_dirty_inode(bh, inode); + mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs); written += tmp; from += tmp; bidx++; @@ -849,7 +857,7 @@ affs_free_prealloc(struct inode *inode) { struct super_block *sb = inode->i_sb; - pr_debug("free_prealloc(ino=%lu)\n", inode->i_ino); + pr_debug("free_prealloc(ino=%llu)\n", inode->i_ino); while (AFFS_I(inode)->i_pa_cnt) { AFFS_I(inode)->i_pa_cnt--; @@ -869,7 +877,7 @@ affs_truncate(struct inode *inode) struct buffer_head *ext_bh; int i; - pr_debug("truncate(inode=%lu, oldsize=%llu, newsize=%llu)\n", + pr_debug("truncate(inode=%llu, oldsize=%llu, newsize=%llu)\n", inode->i_ino, AFFS_I(inode)->mmu_private, inode->i_size); last_blk = 0; @@ -937,7 +945,7 @@ affs_truncate(struct inode *inode) } AFFS_TAIL(sb, ext_bh)->extension = 0; affs_fix_checksum(sb, ext_bh); - mark_buffer_dirty_inode(ext_bh, inode); + mmb_mark_buffer_dirty(ext_bh, &AFFS_I(inode)->i_metadata_bhs); affs_brelse(ext_bh); if (inode->i_size) { @@ -999,13 +1007,14 @@ const struct file_operations affs_file_operations = { .llseek = generic_file_llseek, .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, - .mmap = generic_file_mmap, + .mmap_prepare = generic_file_mmap_prepare, .open = affs_file_open, .release = affs_file_release, .fsync = affs_file_fsync, .splice_read = filemap_splice_read, + .setlease = generic_setlease, }; const struct inode_operations affs_file_inode_operations = { - .setattr = affs_notify_change, + .setattr = affs_setattr, }; |
