On Wed, Jun 26, 2019 at 03:23:34PM +0200, Andreas Gruenbacher wrote: > From: Christoph Hellwig <hch@xxxxxx> > > This effectively reverts a6d639da63ae ("fs: factor out a > __generic_write_end helper") as we now open code what is left of that > helper in iomap. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > Signed-off-by: Andreas Gruenbacher <agruenba@xxxxxxxxxx> Looks ok, Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/buffer.c | 62 ++++++++++++++++++++++++--------------------------- > fs/internal.h | 2 -- > 2 files changed, 29 insertions(+), 35 deletions(-) > > diff --git a/fs/buffer.c b/fs/buffer.c > index e450c55f6434..49a871570092 100644 > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -2086,38 +2086,6 @@ int block_write_begin(struct address_space *mapping, loff_t pos, unsigned len, > } > EXPORT_SYMBOL(block_write_begin); > > -void __generic_write_end(struct inode *inode, loff_t pos, unsigned copied, > - struct page *page) > -{ > - loff_t old_size = inode->i_size; > - bool i_size_changed = false; > - > - /* > - * No need to use i_size_read() here, the i_size cannot change under us > - * because we hold i_rwsem. > - * > - * But it's important to update i_size while still holding page lock: > - * page writeout could otherwise come in and zero beyond i_size. > - */ > - if (pos + copied > inode->i_size) { > - i_size_write(inode, pos + copied); > - i_size_changed = true; > - } > - > - unlock_page(page); > - > - if (old_size < pos) > - pagecache_isize_extended(inode, old_size, pos); > - /* > - * Don't mark the inode dirty under page lock. First, it unnecessarily > - * makes the holding time of page lock longer. Second, it forces lock > - * ordering of page lock and transaction start for journaling > - * filesystems. > - */ > - if (i_size_changed) > - mark_inode_dirty(inode); > -} > - > int block_write_end(struct file *file, struct address_space *mapping, > loff_t pos, unsigned len, unsigned copied, > struct page *page, void *fsdata) > @@ -2158,9 +2126,37 @@ int generic_write_end(struct file *file, struct address_space *mapping, > loff_t pos, unsigned len, unsigned copied, > struct page *page, void *fsdata) > { > + struct inode *inode = mapping->host; > + loff_t old_size = inode->i_size; > + bool i_size_changed = false; > + > copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); > - __generic_write_end(mapping->host, pos, copied, page); > + > + /* > + * No need to use i_size_read() here, the i_size cannot change under us > + * because we hold i_rwsem. > + * > + * But it's important to update i_size while still holding page lock: > + * page writeout could otherwise come in and zero beyond i_size. > + */ > + if (pos + copied > inode->i_size) { > + i_size_write(inode, pos + copied); > + i_size_changed = true; > + } > + > + unlock_page(page); > put_page(page); > + > + if (old_size < pos) > + pagecache_isize_extended(inode, old_size, pos); > + /* > + * Don't mark the inode dirty under page lock. First, it unnecessarily > + * makes the holding time of page lock longer. Second, it forces lock > + * ordering of page lock and transaction start for journaling > + * filesystems. > + */ > + if (i_size_changed) > + mark_inode_dirty(inode); > return copied; > } > EXPORT_SYMBOL(generic_write_end); > diff --git a/fs/internal.h b/fs/internal.h > index a48ef81be37d..2f3c3de51fad 100644 > --- a/fs/internal.h > +++ b/fs/internal.h > @@ -40,8 +40,6 @@ static inline int __sync_blockdev(struct block_device *bdev, int wait) > extern void guard_bio_eod(int rw, struct bio *bio); > extern int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, > get_block_t *get_block, struct iomap *iomap); > -void __generic_write_end(struct inode *inode, loff_t pos, unsigned copied, > - struct page *page); > > /* > * char_dev.c > -- > 2.20.1 >