diff --git a/kmod/src/data.c b/kmod/src/data.c index 70e1098cb..4565cda00 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c @@ -664,8 +664,8 @@ static int scoutfs_get_block_read(struct inode *inode, sector_t iblock, return ret; } -static int scoutfs_get_block_write(struct inode *inode, sector_t iblock, - struct buffer_head *bh, int create) +int scoutfs_get_block_write(struct inode *inode, sector_t iblock, + struct buffer_head *bh, int create) { struct scoutfs_inode_info *si = SCOUTFS_I(inode); int ret; diff --git a/kmod/src/data.h b/kmod/src/data.h index c056915e2..2d4a119a9 100644 --- a/kmod/src/data.h +++ b/kmod/src/data.h @@ -49,6 +49,8 @@ int scoutfs_data_truncate_items(struct super_block *sb, struct inode *inode, int scoutfs_data_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, u64 start, u64 len); long scoutfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len); +int scoutfs_get_block_write(struct inode *inode, sector_t iblock, + struct buffer_head *bh, int create); int scoutfs_data_init_offline_extent(struct inode *inode, u64 size, struct scoutfs_lock *lock); int scoutfs_data_move_blocks(struct inode *from, u64 from_off, diff --git a/kmod/src/inode.c b/kmod/src/inode.c index 9d22f52a7..7d007688b 100644 --- a/kmod/src/inode.c +++ b/kmod/src/inode.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "format.h" #include "super.h" @@ -354,15 +355,22 @@ static int set_inode_size(struct inode *inode, struct scoutfs_lock *lock, { struct scoutfs_inode_info *si = SCOUTFS_I(inode); struct super_block *sb = inode->i_sb; + SCOUTFS_DECLARE_PER_TASK_ENTRY(pt_ent); LIST_HEAD(ind_locks); int ret; if (!S_ISREG(inode->i_mode)) return 0; + scoutfs_per_task_add(&si->pt_data_lock, &pt_ent, lock); + ret = block_truncate_page(inode->i_mapping, new_size, scoutfs_get_block_write); + scoutfs_per_task_del(&si->pt_data_lock, &pt_ent); + if (ret) + goto out; + ret = scoutfs_inode_index_lock_hold(inode, &ind_locks, true, false); if (ret) - return ret; + goto out; if (new_size != i_size_read(inode)) scoutfs_inode_inc_data_version(inode); @@ -378,6 +386,7 @@ static int set_inode_size(struct inode *inode, struct scoutfs_lock *lock, scoutfs_release_trans(sb); scoutfs_inode_index_unlock(sb, &ind_locks); +out: return ret; }