1c59d87c4SChristoph Hellwig /* 2c59d87c4SChristoph Hellwig * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3c59d87c4SChristoph Hellwig * All Rights Reserved. 4c59d87c4SChristoph Hellwig * 5c59d87c4SChristoph Hellwig * This program is free software; you can redistribute it and/or 6c59d87c4SChristoph Hellwig * modify it under the terms of the GNU General Public License as 7c59d87c4SChristoph Hellwig * published by the Free Software Foundation. 8c59d87c4SChristoph Hellwig * 9c59d87c4SChristoph Hellwig * This program is distributed in the hope that it would be useful, 10c59d87c4SChristoph Hellwig * but WITHOUT ANY WARRANTY; without even the implied warranty of 11c59d87c4SChristoph Hellwig * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12c59d87c4SChristoph Hellwig * GNU General Public License for more details. 13c59d87c4SChristoph Hellwig * 14c59d87c4SChristoph Hellwig * You should have received a copy of the GNU General Public License 15c59d87c4SChristoph Hellwig * along with this program; if not, write the Free Software Foundation, 16c59d87c4SChristoph Hellwig * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17c59d87c4SChristoph Hellwig */ 18c59d87c4SChristoph Hellwig #include "xfs.h" 19c59d87c4SChristoph Hellwig #include "xfs_bit.h" 20c59d87c4SChristoph Hellwig #include "xfs_log.h" 21c59d87c4SChristoph Hellwig #include "xfs_inum.h" 22c59d87c4SChristoph Hellwig #include "xfs_sb.h" 23c59d87c4SChristoph Hellwig #include "xfs_ag.h" 24c59d87c4SChristoph Hellwig #include "xfs_trans.h" 25c59d87c4SChristoph Hellwig #include "xfs_mount.h" 26c59d87c4SChristoph Hellwig #include "xfs_bmap_btree.h" 27c59d87c4SChristoph Hellwig #include "xfs_dinode.h" 28c59d87c4SChristoph Hellwig #include "xfs_inode.h" 29*281627dfSChristoph Hellwig #include "xfs_inode_item.h" 30c59d87c4SChristoph Hellwig #include "xfs_alloc.h" 31c59d87c4SChristoph Hellwig #include "xfs_error.h" 32c59d87c4SChristoph Hellwig #include "xfs_rw.h" 33c59d87c4SChristoph Hellwig #include "xfs_iomap.h" 34c59d87c4SChristoph Hellwig #include "xfs_vnodeops.h" 35c59d87c4SChristoph Hellwig #include "xfs_trace.h" 36c59d87c4SChristoph Hellwig #include "xfs_bmap.h" 37c59d87c4SChristoph Hellwig #include <linux/gfp.h> 38c59d87c4SChristoph Hellwig #include <linux/mpage.h> 39c59d87c4SChristoph Hellwig #include <linux/pagevec.h> 40c59d87c4SChristoph Hellwig #include <linux/writeback.h> 41c59d87c4SChristoph Hellwig 42c59d87c4SChristoph Hellwig void 43c59d87c4SChristoph Hellwig xfs_count_page_state( 44c59d87c4SChristoph Hellwig struct page *page, 45c59d87c4SChristoph Hellwig int *delalloc, 46c59d87c4SChristoph Hellwig int *unwritten) 47c59d87c4SChristoph Hellwig { 48c59d87c4SChristoph Hellwig struct buffer_head *bh, *head; 49c59d87c4SChristoph Hellwig 50c59d87c4SChristoph Hellwig *delalloc = *unwritten = 0; 51c59d87c4SChristoph Hellwig 52c59d87c4SChristoph Hellwig bh = head = page_buffers(page); 53c59d87c4SChristoph Hellwig do { 54c59d87c4SChristoph Hellwig if (buffer_unwritten(bh)) 55c59d87c4SChristoph Hellwig (*unwritten) = 1; 56c59d87c4SChristoph Hellwig else if (buffer_delay(bh)) 57c59d87c4SChristoph Hellwig (*delalloc) = 1; 58c59d87c4SChristoph Hellwig } while ((bh = bh->b_this_page) != head); 59c59d87c4SChristoph Hellwig } 60c59d87c4SChristoph Hellwig 61c59d87c4SChristoph Hellwig STATIC struct block_device * 62c59d87c4SChristoph Hellwig xfs_find_bdev_for_inode( 63c59d87c4SChristoph Hellwig struct inode *inode) 64c59d87c4SChristoph Hellwig { 65c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 66c59d87c4SChristoph Hellwig struct xfs_mount *mp = ip->i_mount; 67c59d87c4SChristoph Hellwig 68c59d87c4SChristoph Hellwig if (XFS_IS_REALTIME_INODE(ip)) 69c59d87c4SChristoph Hellwig return mp->m_rtdev_targp->bt_bdev; 70c59d87c4SChristoph Hellwig else 71c59d87c4SChristoph Hellwig return mp->m_ddev_targp->bt_bdev; 72c59d87c4SChristoph Hellwig } 73c59d87c4SChristoph Hellwig 74c59d87c4SChristoph Hellwig /* 75c59d87c4SChristoph Hellwig * We're now finished for good with this ioend structure. 76c59d87c4SChristoph Hellwig * Update the page state via the associated buffer_heads, 77c59d87c4SChristoph Hellwig * release holds on the inode and bio, and finally free 78c59d87c4SChristoph Hellwig * up memory. Do not use the ioend after this. 79c59d87c4SChristoph Hellwig */ 80c59d87c4SChristoph Hellwig STATIC void 81c59d87c4SChristoph Hellwig xfs_destroy_ioend( 82c59d87c4SChristoph Hellwig xfs_ioend_t *ioend) 83c59d87c4SChristoph Hellwig { 84c59d87c4SChristoph Hellwig struct buffer_head *bh, *next; 85c59d87c4SChristoph Hellwig 86c59d87c4SChristoph Hellwig for (bh = ioend->io_buffer_head; bh; bh = next) { 87c59d87c4SChristoph Hellwig next = bh->b_private; 88c59d87c4SChristoph Hellwig bh->b_end_io(bh, !ioend->io_error); 89c59d87c4SChristoph Hellwig } 90c59d87c4SChristoph Hellwig 91c859cdd1SChristoph Hellwig if (ioend->io_iocb) { 9204f658eeSChristoph Hellwig if (ioend->io_isasync) { 9304f658eeSChristoph Hellwig aio_complete(ioend->io_iocb, ioend->io_error ? 9404f658eeSChristoph Hellwig ioend->io_error : ioend->io_result, 0); 9504f658eeSChristoph Hellwig } 96c859cdd1SChristoph Hellwig inode_dio_done(ioend->io_inode); 97c859cdd1SChristoph Hellwig } 984a06fd26SChristoph Hellwig 99c59d87c4SChristoph Hellwig mempool_free(ioend, xfs_ioend_pool); 100c59d87c4SChristoph Hellwig } 101c59d87c4SChristoph Hellwig 102c59d87c4SChristoph Hellwig /* 103fc0063c4SChristoph Hellwig * Fast and loose check if this write could update the on-disk inode size. 104fc0063c4SChristoph Hellwig */ 105fc0063c4SChristoph Hellwig static inline bool xfs_ioend_is_append(struct xfs_ioend *ioend) 106fc0063c4SChristoph Hellwig { 107fc0063c4SChristoph Hellwig return ioend->io_offset + ioend->io_size > 108fc0063c4SChristoph Hellwig XFS_I(ioend->io_inode)->i_d.di_size; 109fc0063c4SChristoph Hellwig } 110fc0063c4SChristoph Hellwig 111*281627dfSChristoph Hellwig STATIC int 112*281627dfSChristoph Hellwig xfs_setfilesize_trans_alloc( 113*281627dfSChristoph Hellwig struct xfs_ioend *ioend) 114*281627dfSChristoph Hellwig { 115*281627dfSChristoph Hellwig struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; 116*281627dfSChristoph Hellwig struct xfs_trans *tp; 117*281627dfSChristoph Hellwig int error; 118*281627dfSChristoph Hellwig 119*281627dfSChristoph Hellwig tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); 120*281627dfSChristoph Hellwig 121*281627dfSChristoph Hellwig error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0); 122*281627dfSChristoph Hellwig if (error) { 123*281627dfSChristoph Hellwig xfs_trans_cancel(tp, 0); 124*281627dfSChristoph Hellwig return error; 125*281627dfSChristoph Hellwig } 126*281627dfSChristoph Hellwig 127*281627dfSChristoph Hellwig ioend->io_append_trans = tp; 128*281627dfSChristoph Hellwig 129*281627dfSChristoph Hellwig /* 130*281627dfSChristoph Hellwig * We hand off the transaction to the completion thread now, so 131*281627dfSChristoph Hellwig * clear the flag here. 132*281627dfSChristoph Hellwig */ 133*281627dfSChristoph Hellwig current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); 134*281627dfSChristoph Hellwig return 0; 135*281627dfSChristoph Hellwig } 136*281627dfSChristoph Hellwig 137fc0063c4SChristoph Hellwig /* 1382813d682SChristoph Hellwig * Update on-disk file size now that data has been written to disk. 139c59d87c4SChristoph Hellwig */ 140*281627dfSChristoph Hellwig STATIC int 141c59d87c4SChristoph Hellwig xfs_setfilesize( 142aa6bf01dSChristoph Hellwig struct xfs_ioend *ioend) 143c59d87c4SChristoph Hellwig { 144aa6bf01dSChristoph Hellwig struct xfs_inode *ip = XFS_I(ioend->io_inode); 145*281627dfSChristoph Hellwig struct xfs_trans *tp = ioend->io_append_trans; 146c59d87c4SChristoph Hellwig xfs_fsize_t isize; 147c59d87c4SChristoph Hellwig 148*281627dfSChristoph Hellwig /* 149*281627dfSChristoph Hellwig * The transaction was allocated in the I/O submission thread, 150*281627dfSChristoph Hellwig * thus we need to mark ourselves as beeing in a transaction 151*281627dfSChristoph Hellwig * manually. 152*281627dfSChristoph Hellwig */ 153*281627dfSChristoph Hellwig current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); 154*281627dfSChristoph Hellwig 155aa6bf01dSChristoph Hellwig xfs_ilock(ip, XFS_ILOCK_EXCL); 1566923e686SChristoph Hellwig isize = xfs_new_eof(ip, ioend->io_offset + ioend->io_size); 157*281627dfSChristoph Hellwig if (!isize) { 158*281627dfSChristoph Hellwig xfs_iunlock(ip, XFS_ILOCK_EXCL); 159*281627dfSChristoph Hellwig xfs_trans_cancel(tp, 0); 160*281627dfSChristoph Hellwig return 0; 161c59d87c4SChristoph Hellwig } 162c59d87c4SChristoph Hellwig 163*281627dfSChristoph Hellwig trace_xfs_setfilesize(ip, ioend->io_offset, ioend->io_size); 164*281627dfSChristoph Hellwig 165*281627dfSChristoph Hellwig ip->i_d.di_size = isize; 166*281627dfSChristoph Hellwig xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 167*281627dfSChristoph Hellwig xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 168*281627dfSChristoph Hellwig 169*281627dfSChristoph Hellwig return xfs_trans_commit(tp, 0); 170c59d87c4SChristoph Hellwig } 171c59d87c4SChristoph Hellwig 172c59d87c4SChristoph Hellwig /* 173c59d87c4SChristoph Hellwig * Schedule IO completion handling on the final put of an ioend. 174fc0063c4SChristoph Hellwig * 175fc0063c4SChristoph Hellwig * If there is no work to do we might as well call it a day and free the 176fc0063c4SChristoph Hellwig * ioend right now. 177c59d87c4SChristoph Hellwig */ 178c59d87c4SChristoph Hellwig STATIC void 179c59d87c4SChristoph Hellwig xfs_finish_ioend( 180c59d87c4SChristoph Hellwig struct xfs_ioend *ioend) 181c59d87c4SChristoph Hellwig { 182c59d87c4SChristoph Hellwig if (atomic_dec_and_test(&ioend->io_remaining)) { 183aa6bf01dSChristoph Hellwig struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; 184aa6bf01dSChristoph Hellwig 185c59d87c4SChristoph Hellwig if (ioend->io_type == IO_UNWRITTEN) 186aa6bf01dSChristoph Hellwig queue_work(mp->m_unwritten_workqueue, &ioend->io_work); 187*281627dfSChristoph Hellwig else if (ioend->io_append_trans) 188aa6bf01dSChristoph Hellwig queue_work(mp->m_data_workqueue, &ioend->io_work); 189fc0063c4SChristoph Hellwig else 190fc0063c4SChristoph Hellwig xfs_destroy_ioend(ioend); 191c59d87c4SChristoph Hellwig } 192c59d87c4SChristoph Hellwig } 193c59d87c4SChristoph Hellwig 194c59d87c4SChristoph Hellwig /* 195c59d87c4SChristoph Hellwig * IO write completion. 196c59d87c4SChristoph Hellwig */ 197c59d87c4SChristoph Hellwig STATIC void 198c59d87c4SChristoph Hellwig xfs_end_io( 199c59d87c4SChristoph Hellwig struct work_struct *work) 200c59d87c4SChristoph Hellwig { 201c59d87c4SChristoph Hellwig xfs_ioend_t *ioend = container_of(work, xfs_ioend_t, io_work); 202c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(ioend->io_inode); 203c59d87c4SChristoph Hellwig int error = 0; 204c59d87c4SChristoph Hellwig 20504f658eeSChristoph Hellwig if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { 206810627d9SChristoph Hellwig ioend->io_error = -EIO; 20704f658eeSChristoph Hellwig goto done; 20804f658eeSChristoph Hellwig } 20904f658eeSChristoph Hellwig if (ioend->io_error) 21004f658eeSChristoph Hellwig goto done; 21104f658eeSChristoph Hellwig 212c59d87c4SChristoph Hellwig /* 213c59d87c4SChristoph Hellwig * For unwritten extents we need to issue transactions to convert a 214c59d87c4SChristoph Hellwig * range to normal written extens after the data I/O has finished. 215c59d87c4SChristoph Hellwig */ 21604f658eeSChristoph Hellwig if (ioend->io_type == IO_UNWRITTEN) { 217*281627dfSChristoph Hellwig /* 218*281627dfSChristoph Hellwig * For buffered I/O we never preallocate a transaction when 219*281627dfSChristoph Hellwig * doing the unwritten extent conversion, but for direct I/O 220*281627dfSChristoph Hellwig * we do not know if we are converting an unwritten extent 221*281627dfSChristoph Hellwig * or not at the point where we preallocate the transaction. 222*281627dfSChristoph Hellwig */ 223*281627dfSChristoph Hellwig if (ioend->io_append_trans) { 224*281627dfSChristoph Hellwig ASSERT(ioend->io_isdirect); 225*281627dfSChristoph Hellwig 226*281627dfSChristoph Hellwig current_set_flags_nested( 227*281627dfSChristoph Hellwig &ioend->io_append_trans->t_pflags, PF_FSTRANS); 228*281627dfSChristoph Hellwig xfs_trans_cancel(ioend->io_append_trans, 0); 229*281627dfSChristoph Hellwig } 230*281627dfSChristoph Hellwig 231c59d87c4SChristoph Hellwig error = xfs_iomap_write_unwritten(ip, ioend->io_offset, 232c59d87c4SChristoph Hellwig ioend->io_size); 23304f658eeSChristoph Hellwig if (error) { 23404f658eeSChristoph Hellwig ioend->io_error = -error; 23504f658eeSChristoph Hellwig goto done; 23604f658eeSChristoph Hellwig } 237*281627dfSChristoph Hellwig } else if (ioend->io_append_trans) { 238*281627dfSChristoph Hellwig error = xfs_setfilesize(ioend); 239*281627dfSChristoph Hellwig if (error) 240*281627dfSChristoph Hellwig ioend->io_error = -error; 24184803fb7SChristoph Hellwig } else { 242*281627dfSChristoph Hellwig ASSERT(!xfs_ioend_is_append(ioend)); 24384803fb7SChristoph Hellwig } 24484803fb7SChristoph Hellwig 24504f658eeSChristoph Hellwig done: 246c59d87c4SChristoph Hellwig xfs_destroy_ioend(ioend); 247c59d87c4SChristoph Hellwig } 248c59d87c4SChristoph Hellwig 249c59d87c4SChristoph Hellwig /* 250c59d87c4SChristoph Hellwig * Call IO completion handling in caller context on the final put of an ioend. 251c59d87c4SChristoph Hellwig */ 252c59d87c4SChristoph Hellwig STATIC void 253c59d87c4SChristoph Hellwig xfs_finish_ioend_sync( 254c59d87c4SChristoph Hellwig struct xfs_ioend *ioend) 255c59d87c4SChristoph Hellwig { 256c59d87c4SChristoph Hellwig if (atomic_dec_and_test(&ioend->io_remaining)) 257c59d87c4SChristoph Hellwig xfs_end_io(&ioend->io_work); 258c59d87c4SChristoph Hellwig } 259c59d87c4SChristoph Hellwig 260c59d87c4SChristoph Hellwig /* 261c59d87c4SChristoph Hellwig * Allocate and initialise an IO completion structure. 262c59d87c4SChristoph Hellwig * We need to track unwritten extent write completion here initially. 263c59d87c4SChristoph Hellwig * We'll need to extend this for updating the ondisk inode size later 264c59d87c4SChristoph Hellwig * (vs. incore size). 265c59d87c4SChristoph Hellwig */ 266c59d87c4SChristoph Hellwig STATIC xfs_ioend_t * 267c59d87c4SChristoph Hellwig xfs_alloc_ioend( 268c59d87c4SChristoph Hellwig struct inode *inode, 269c59d87c4SChristoph Hellwig unsigned int type) 270c59d87c4SChristoph Hellwig { 271c59d87c4SChristoph Hellwig xfs_ioend_t *ioend; 272c59d87c4SChristoph Hellwig 273c59d87c4SChristoph Hellwig ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); 274c59d87c4SChristoph Hellwig 275c59d87c4SChristoph Hellwig /* 276c59d87c4SChristoph Hellwig * Set the count to 1 initially, which will prevent an I/O 277c59d87c4SChristoph Hellwig * completion callback from happening before we have started 278c59d87c4SChristoph Hellwig * all the I/O from calling the completion routine too early. 279c59d87c4SChristoph Hellwig */ 280c59d87c4SChristoph Hellwig atomic_set(&ioend->io_remaining, 1); 281c859cdd1SChristoph Hellwig ioend->io_isasync = 0; 282*281627dfSChristoph Hellwig ioend->io_isdirect = 0; 283c59d87c4SChristoph Hellwig ioend->io_error = 0; 284c59d87c4SChristoph Hellwig ioend->io_list = NULL; 285c59d87c4SChristoph Hellwig ioend->io_type = type; 286c59d87c4SChristoph Hellwig ioend->io_inode = inode; 287c59d87c4SChristoph Hellwig ioend->io_buffer_head = NULL; 288c59d87c4SChristoph Hellwig ioend->io_buffer_tail = NULL; 289c59d87c4SChristoph Hellwig ioend->io_offset = 0; 290c59d87c4SChristoph Hellwig ioend->io_size = 0; 291c59d87c4SChristoph Hellwig ioend->io_iocb = NULL; 292c59d87c4SChristoph Hellwig ioend->io_result = 0; 293*281627dfSChristoph Hellwig ioend->io_append_trans = NULL; 294c59d87c4SChristoph Hellwig 295c59d87c4SChristoph Hellwig INIT_WORK(&ioend->io_work, xfs_end_io); 296c59d87c4SChristoph Hellwig return ioend; 297c59d87c4SChristoph Hellwig } 298c59d87c4SChristoph Hellwig 299c59d87c4SChristoph Hellwig STATIC int 300c59d87c4SChristoph Hellwig xfs_map_blocks( 301c59d87c4SChristoph Hellwig struct inode *inode, 302c59d87c4SChristoph Hellwig loff_t offset, 303c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 304c59d87c4SChristoph Hellwig int type, 305c59d87c4SChristoph Hellwig int nonblocking) 306c59d87c4SChristoph Hellwig { 307c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 308c59d87c4SChristoph Hellwig struct xfs_mount *mp = ip->i_mount; 309c59d87c4SChristoph Hellwig ssize_t count = 1 << inode->i_blkbits; 310c59d87c4SChristoph Hellwig xfs_fileoff_t offset_fsb, end_fsb; 311c59d87c4SChristoph Hellwig int error = 0; 312c59d87c4SChristoph Hellwig int bmapi_flags = XFS_BMAPI_ENTIRE; 313c59d87c4SChristoph Hellwig int nimaps = 1; 314c59d87c4SChristoph Hellwig 315c59d87c4SChristoph Hellwig if (XFS_FORCED_SHUTDOWN(mp)) 316c59d87c4SChristoph Hellwig return -XFS_ERROR(EIO); 317c59d87c4SChristoph Hellwig 318c59d87c4SChristoph Hellwig if (type == IO_UNWRITTEN) 319c59d87c4SChristoph Hellwig bmapi_flags |= XFS_BMAPI_IGSTATE; 320c59d87c4SChristoph Hellwig 321c59d87c4SChristoph Hellwig if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { 322c59d87c4SChristoph Hellwig if (nonblocking) 323c59d87c4SChristoph Hellwig return -XFS_ERROR(EAGAIN); 324c59d87c4SChristoph Hellwig xfs_ilock(ip, XFS_ILOCK_SHARED); 325c59d87c4SChristoph Hellwig } 326c59d87c4SChristoph Hellwig 327c59d87c4SChristoph Hellwig ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || 328c59d87c4SChristoph Hellwig (ip->i_df.if_flags & XFS_IFEXTENTS)); 329c59d87c4SChristoph Hellwig ASSERT(offset <= mp->m_maxioffset); 330c59d87c4SChristoph Hellwig 331c59d87c4SChristoph Hellwig if (offset + count > mp->m_maxioffset) 332c59d87c4SChristoph Hellwig count = mp->m_maxioffset - offset; 333c59d87c4SChristoph Hellwig end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); 334c59d87c4SChristoph Hellwig offset_fsb = XFS_B_TO_FSBT(mp, offset); 3355c8ed202SDave Chinner error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, 3365c8ed202SDave Chinner imap, &nimaps, bmapi_flags); 337c59d87c4SChristoph Hellwig xfs_iunlock(ip, XFS_ILOCK_SHARED); 338c59d87c4SChristoph Hellwig 339c59d87c4SChristoph Hellwig if (error) 340c59d87c4SChristoph Hellwig return -XFS_ERROR(error); 341c59d87c4SChristoph Hellwig 342c59d87c4SChristoph Hellwig if (type == IO_DELALLOC && 343c59d87c4SChristoph Hellwig (!nimaps || isnullstartblock(imap->br_startblock))) { 344c59d87c4SChristoph Hellwig error = xfs_iomap_write_allocate(ip, offset, count, imap); 345c59d87c4SChristoph Hellwig if (!error) 346c59d87c4SChristoph Hellwig trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); 347c59d87c4SChristoph Hellwig return -XFS_ERROR(error); 348c59d87c4SChristoph Hellwig } 349c59d87c4SChristoph Hellwig 350c59d87c4SChristoph Hellwig #ifdef DEBUG 351c59d87c4SChristoph Hellwig if (type == IO_UNWRITTEN) { 352c59d87c4SChristoph Hellwig ASSERT(nimaps); 353c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != HOLESTARTBLOCK); 354c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != DELAYSTARTBLOCK); 355c59d87c4SChristoph Hellwig } 356c59d87c4SChristoph Hellwig #endif 357c59d87c4SChristoph Hellwig if (nimaps) 358c59d87c4SChristoph Hellwig trace_xfs_map_blocks_found(ip, offset, count, type, imap); 359c59d87c4SChristoph Hellwig return 0; 360c59d87c4SChristoph Hellwig } 361c59d87c4SChristoph Hellwig 362c59d87c4SChristoph Hellwig STATIC int 363c59d87c4SChristoph Hellwig xfs_imap_valid( 364c59d87c4SChristoph Hellwig struct inode *inode, 365c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 366c59d87c4SChristoph Hellwig xfs_off_t offset) 367c59d87c4SChristoph Hellwig { 368c59d87c4SChristoph Hellwig offset >>= inode->i_blkbits; 369c59d87c4SChristoph Hellwig 370c59d87c4SChristoph Hellwig return offset >= imap->br_startoff && 371c59d87c4SChristoph Hellwig offset < imap->br_startoff + imap->br_blockcount; 372c59d87c4SChristoph Hellwig } 373c59d87c4SChristoph Hellwig 374c59d87c4SChristoph Hellwig /* 375c59d87c4SChristoph Hellwig * BIO completion handler for buffered IO. 376c59d87c4SChristoph Hellwig */ 377c59d87c4SChristoph Hellwig STATIC void 378c59d87c4SChristoph Hellwig xfs_end_bio( 379c59d87c4SChristoph Hellwig struct bio *bio, 380c59d87c4SChristoph Hellwig int error) 381c59d87c4SChristoph Hellwig { 382c59d87c4SChristoph Hellwig xfs_ioend_t *ioend = bio->bi_private; 383c59d87c4SChristoph Hellwig 384c59d87c4SChristoph Hellwig ASSERT(atomic_read(&bio->bi_cnt) >= 1); 385c59d87c4SChristoph Hellwig ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; 386c59d87c4SChristoph Hellwig 387c59d87c4SChristoph Hellwig /* Toss bio and pass work off to an xfsdatad thread */ 388c59d87c4SChristoph Hellwig bio->bi_private = NULL; 389c59d87c4SChristoph Hellwig bio->bi_end_io = NULL; 390c59d87c4SChristoph Hellwig bio_put(bio); 391c59d87c4SChristoph Hellwig 392c59d87c4SChristoph Hellwig xfs_finish_ioend(ioend); 393c59d87c4SChristoph Hellwig } 394c59d87c4SChristoph Hellwig 395c59d87c4SChristoph Hellwig STATIC void 396c59d87c4SChristoph Hellwig xfs_submit_ioend_bio( 397c59d87c4SChristoph Hellwig struct writeback_control *wbc, 398c59d87c4SChristoph Hellwig xfs_ioend_t *ioend, 399c59d87c4SChristoph Hellwig struct bio *bio) 400c59d87c4SChristoph Hellwig { 401c59d87c4SChristoph Hellwig atomic_inc(&ioend->io_remaining); 402c59d87c4SChristoph Hellwig bio->bi_private = ioend; 403c59d87c4SChristoph Hellwig bio->bi_end_io = xfs_end_bio; 404c59d87c4SChristoph Hellwig submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE, bio); 405c59d87c4SChristoph Hellwig } 406c59d87c4SChristoph Hellwig 407c59d87c4SChristoph Hellwig STATIC struct bio * 408c59d87c4SChristoph Hellwig xfs_alloc_ioend_bio( 409c59d87c4SChristoph Hellwig struct buffer_head *bh) 410c59d87c4SChristoph Hellwig { 411c59d87c4SChristoph Hellwig int nvecs = bio_get_nr_vecs(bh->b_bdev); 412c59d87c4SChristoph Hellwig struct bio *bio = bio_alloc(GFP_NOIO, nvecs); 413c59d87c4SChristoph Hellwig 414c59d87c4SChristoph Hellwig ASSERT(bio->bi_private == NULL); 415c59d87c4SChristoph Hellwig bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9); 416c59d87c4SChristoph Hellwig bio->bi_bdev = bh->b_bdev; 417c59d87c4SChristoph Hellwig return bio; 418c59d87c4SChristoph Hellwig } 419c59d87c4SChristoph Hellwig 420c59d87c4SChristoph Hellwig STATIC void 421c59d87c4SChristoph Hellwig xfs_start_buffer_writeback( 422c59d87c4SChristoph Hellwig struct buffer_head *bh) 423c59d87c4SChristoph Hellwig { 424c59d87c4SChristoph Hellwig ASSERT(buffer_mapped(bh)); 425c59d87c4SChristoph Hellwig ASSERT(buffer_locked(bh)); 426c59d87c4SChristoph Hellwig ASSERT(!buffer_delay(bh)); 427c59d87c4SChristoph Hellwig ASSERT(!buffer_unwritten(bh)); 428c59d87c4SChristoph Hellwig 429c59d87c4SChristoph Hellwig mark_buffer_async_write(bh); 430c59d87c4SChristoph Hellwig set_buffer_uptodate(bh); 431c59d87c4SChristoph Hellwig clear_buffer_dirty(bh); 432c59d87c4SChristoph Hellwig } 433c59d87c4SChristoph Hellwig 434c59d87c4SChristoph Hellwig STATIC void 435c59d87c4SChristoph Hellwig xfs_start_page_writeback( 436c59d87c4SChristoph Hellwig struct page *page, 437c59d87c4SChristoph Hellwig int clear_dirty, 438c59d87c4SChristoph Hellwig int buffers) 439c59d87c4SChristoph Hellwig { 440c59d87c4SChristoph Hellwig ASSERT(PageLocked(page)); 441c59d87c4SChristoph Hellwig ASSERT(!PageWriteback(page)); 442c59d87c4SChristoph Hellwig if (clear_dirty) 443c59d87c4SChristoph Hellwig clear_page_dirty_for_io(page); 444c59d87c4SChristoph Hellwig set_page_writeback(page); 445c59d87c4SChristoph Hellwig unlock_page(page); 446c59d87c4SChristoph Hellwig /* If no buffers on the page are to be written, finish it here */ 447c59d87c4SChristoph Hellwig if (!buffers) 448c59d87c4SChristoph Hellwig end_page_writeback(page); 449c59d87c4SChristoph Hellwig } 450c59d87c4SChristoph Hellwig 451c59d87c4SChristoph Hellwig static inline int bio_add_buffer(struct bio *bio, struct buffer_head *bh) 452c59d87c4SChristoph Hellwig { 453c59d87c4SChristoph Hellwig return bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); 454c59d87c4SChristoph Hellwig } 455c59d87c4SChristoph Hellwig 456c59d87c4SChristoph Hellwig /* 457c59d87c4SChristoph Hellwig * Submit all of the bios for all of the ioends we have saved up, covering the 458c59d87c4SChristoph Hellwig * initial writepage page and also any probed pages. 459c59d87c4SChristoph Hellwig * 460c59d87c4SChristoph Hellwig * Because we may have multiple ioends spanning a page, we need to start 461c59d87c4SChristoph Hellwig * writeback on all the buffers before we submit them for I/O. If we mark the 462c59d87c4SChristoph Hellwig * buffers as we got, then we can end up with a page that only has buffers 463c59d87c4SChristoph Hellwig * marked async write and I/O complete on can occur before we mark the other 464c59d87c4SChristoph Hellwig * buffers async write. 465c59d87c4SChristoph Hellwig * 466c59d87c4SChristoph Hellwig * The end result of this is that we trip a bug in end_page_writeback() because 467c59d87c4SChristoph Hellwig * we call it twice for the one page as the code in end_buffer_async_write() 468c59d87c4SChristoph Hellwig * assumes that all buffers on the page are started at the same time. 469c59d87c4SChristoph Hellwig * 470c59d87c4SChristoph Hellwig * The fix is two passes across the ioend list - one to start writeback on the 471c59d87c4SChristoph Hellwig * buffer_heads, and then submit them for I/O on the second pass. 472c59d87c4SChristoph Hellwig */ 473c59d87c4SChristoph Hellwig STATIC void 474c59d87c4SChristoph Hellwig xfs_submit_ioend( 475c59d87c4SChristoph Hellwig struct writeback_control *wbc, 476c59d87c4SChristoph Hellwig xfs_ioend_t *ioend) 477c59d87c4SChristoph Hellwig { 478c59d87c4SChristoph Hellwig xfs_ioend_t *head = ioend; 479c59d87c4SChristoph Hellwig xfs_ioend_t *next; 480c59d87c4SChristoph Hellwig struct buffer_head *bh; 481c59d87c4SChristoph Hellwig struct bio *bio; 482c59d87c4SChristoph Hellwig sector_t lastblock = 0; 483c59d87c4SChristoph Hellwig 484c59d87c4SChristoph Hellwig /* Pass 1 - start writeback */ 485c59d87c4SChristoph Hellwig do { 486c59d87c4SChristoph Hellwig next = ioend->io_list; 487c59d87c4SChristoph Hellwig for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) 488c59d87c4SChristoph Hellwig xfs_start_buffer_writeback(bh); 489c59d87c4SChristoph Hellwig } while ((ioend = next) != NULL); 490c59d87c4SChristoph Hellwig 491c59d87c4SChristoph Hellwig /* Pass 2 - submit I/O */ 492c59d87c4SChristoph Hellwig ioend = head; 493c59d87c4SChristoph Hellwig do { 494c59d87c4SChristoph Hellwig next = ioend->io_list; 495c59d87c4SChristoph Hellwig bio = NULL; 496c59d87c4SChristoph Hellwig 497c59d87c4SChristoph Hellwig for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { 498c59d87c4SChristoph Hellwig 499c59d87c4SChristoph Hellwig if (!bio) { 500c59d87c4SChristoph Hellwig retry: 501c59d87c4SChristoph Hellwig bio = xfs_alloc_ioend_bio(bh); 502c59d87c4SChristoph Hellwig } else if (bh->b_blocknr != lastblock + 1) { 503c59d87c4SChristoph Hellwig xfs_submit_ioend_bio(wbc, ioend, bio); 504c59d87c4SChristoph Hellwig goto retry; 505c59d87c4SChristoph Hellwig } 506c59d87c4SChristoph Hellwig 507c59d87c4SChristoph Hellwig if (bio_add_buffer(bio, bh) != bh->b_size) { 508c59d87c4SChristoph Hellwig xfs_submit_ioend_bio(wbc, ioend, bio); 509c59d87c4SChristoph Hellwig goto retry; 510c59d87c4SChristoph Hellwig } 511c59d87c4SChristoph Hellwig 512c59d87c4SChristoph Hellwig lastblock = bh->b_blocknr; 513c59d87c4SChristoph Hellwig } 514c59d87c4SChristoph Hellwig if (bio) 515c59d87c4SChristoph Hellwig xfs_submit_ioend_bio(wbc, ioend, bio); 516c59d87c4SChristoph Hellwig xfs_finish_ioend(ioend); 517c59d87c4SChristoph Hellwig } while ((ioend = next) != NULL); 518c59d87c4SChristoph Hellwig } 519c59d87c4SChristoph Hellwig 520c59d87c4SChristoph Hellwig /* 521c59d87c4SChristoph Hellwig * Cancel submission of all buffer_heads so far in this endio. 522c59d87c4SChristoph Hellwig * Toss the endio too. Only ever called for the initial page 523c59d87c4SChristoph Hellwig * in a writepage request, so only ever one page. 524c59d87c4SChristoph Hellwig */ 525c59d87c4SChristoph Hellwig STATIC void 526c59d87c4SChristoph Hellwig xfs_cancel_ioend( 527c59d87c4SChristoph Hellwig xfs_ioend_t *ioend) 528c59d87c4SChristoph Hellwig { 529c59d87c4SChristoph Hellwig xfs_ioend_t *next; 530c59d87c4SChristoph Hellwig struct buffer_head *bh, *next_bh; 531c59d87c4SChristoph Hellwig 532c59d87c4SChristoph Hellwig do { 533c59d87c4SChristoph Hellwig next = ioend->io_list; 534c59d87c4SChristoph Hellwig bh = ioend->io_buffer_head; 535c59d87c4SChristoph Hellwig do { 536c59d87c4SChristoph Hellwig next_bh = bh->b_private; 537c59d87c4SChristoph Hellwig clear_buffer_async_write(bh); 538c59d87c4SChristoph Hellwig unlock_buffer(bh); 539c59d87c4SChristoph Hellwig } while ((bh = next_bh) != NULL); 540c59d87c4SChristoph Hellwig 541c59d87c4SChristoph Hellwig mempool_free(ioend, xfs_ioend_pool); 542c59d87c4SChristoph Hellwig } while ((ioend = next) != NULL); 543c59d87c4SChristoph Hellwig } 544c59d87c4SChristoph Hellwig 545c59d87c4SChristoph Hellwig /* 546c59d87c4SChristoph Hellwig * Test to see if we've been building up a completion structure for 547c59d87c4SChristoph Hellwig * earlier buffers -- if so, we try to append to this ioend if we 548c59d87c4SChristoph Hellwig * can, otherwise we finish off any current ioend and start another. 549c59d87c4SChristoph Hellwig * Return true if we've finished the given ioend. 550c59d87c4SChristoph Hellwig */ 551c59d87c4SChristoph Hellwig STATIC void 552c59d87c4SChristoph Hellwig xfs_add_to_ioend( 553c59d87c4SChristoph Hellwig struct inode *inode, 554c59d87c4SChristoph Hellwig struct buffer_head *bh, 555c59d87c4SChristoph Hellwig xfs_off_t offset, 556c59d87c4SChristoph Hellwig unsigned int type, 557c59d87c4SChristoph Hellwig xfs_ioend_t **result, 558c59d87c4SChristoph Hellwig int need_ioend) 559c59d87c4SChristoph Hellwig { 560c59d87c4SChristoph Hellwig xfs_ioend_t *ioend = *result; 561c59d87c4SChristoph Hellwig 562c59d87c4SChristoph Hellwig if (!ioend || need_ioend || type != ioend->io_type) { 563c59d87c4SChristoph Hellwig xfs_ioend_t *previous = *result; 564c59d87c4SChristoph Hellwig 565c59d87c4SChristoph Hellwig ioend = xfs_alloc_ioend(inode, type); 566c59d87c4SChristoph Hellwig ioend->io_offset = offset; 567c59d87c4SChristoph Hellwig ioend->io_buffer_head = bh; 568c59d87c4SChristoph Hellwig ioend->io_buffer_tail = bh; 569c59d87c4SChristoph Hellwig if (previous) 570c59d87c4SChristoph Hellwig previous->io_list = ioend; 571c59d87c4SChristoph Hellwig *result = ioend; 572c59d87c4SChristoph Hellwig } else { 573c59d87c4SChristoph Hellwig ioend->io_buffer_tail->b_private = bh; 574c59d87c4SChristoph Hellwig ioend->io_buffer_tail = bh; 575c59d87c4SChristoph Hellwig } 576c59d87c4SChristoph Hellwig 577c59d87c4SChristoph Hellwig bh->b_private = NULL; 578c59d87c4SChristoph Hellwig ioend->io_size += bh->b_size; 579c59d87c4SChristoph Hellwig } 580c59d87c4SChristoph Hellwig 581c59d87c4SChristoph Hellwig STATIC void 582c59d87c4SChristoph Hellwig xfs_map_buffer( 583c59d87c4SChristoph Hellwig struct inode *inode, 584c59d87c4SChristoph Hellwig struct buffer_head *bh, 585c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 586c59d87c4SChristoph Hellwig xfs_off_t offset) 587c59d87c4SChristoph Hellwig { 588c59d87c4SChristoph Hellwig sector_t bn; 589c59d87c4SChristoph Hellwig struct xfs_mount *m = XFS_I(inode)->i_mount; 590c59d87c4SChristoph Hellwig xfs_off_t iomap_offset = XFS_FSB_TO_B(m, imap->br_startoff); 591c59d87c4SChristoph Hellwig xfs_daddr_t iomap_bn = xfs_fsb_to_db(XFS_I(inode), imap->br_startblock); 592c59d87c4SChristoph Hellwig 593c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != HOLESTARTBLOCK); 594c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != DELAYSTARTBLOCK); 595c59d87c4SChristoph Hellwig 596c59d87c4SChristoph Hellwig bn = (iomap_bn >> (inode->i_blkbits - BBSHIFT)) + 597c59d87c4SChristoph Hellwig ((offset - iomap_offset) >> inode->i_blkbits); 598c59d87c4SChristoph Hellwig 599c59d87c4SChristoph Hellwig ASSERT(bn || XFS_IS_REALTIME_INODE(XFS_I(inode))); 600c59d87c4SChristoph Hellwig 601c59d87c4SChristoph Hellwig bh->b_blocknr = bn; 602c59d87c4SChristoph Hellwig set_buffer_mapped(bh); 603c59d87c4SChristoph Hellwig } 604c59d87c4SChristoph Hellwig 605c59d87c4SChristoph Hellwig STATIC void 606c59d87c4SChristoph Hellwig xfs_map_at_offset( 607c59d87c4SChristoph Hellwig struct inode *inode, 608c59d87c4SChristoph Hellwig struct buffer_head *bh, 609c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 610c59d87c4SChristoph Hellwig xfs_off_t offset) 611c59d87c4SChristoph Hellwig { 612c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != HOLESTARTBLOCK); 613c59d87c4SChristoph Hellwig ASSERT(imap->br_startblock != DELAYSTARTBLOCK); 614c59d87c4SChristoph Hellwig 615c59d87c4SChristoph Hellwig xfs_map_buffer(inode, bh, imap, offset); 616c59d87c4SChristoph Hellwig set_buffer_mapped(bh); 617c59d87c4SChristoph Hellwig clear_buffer_delay(bh); 618c59d87c4SChristoph Hellwig clear_buffer_unwritten(bh); 619c59d87c4SChristoph Hellwig } 620c59d87c4SChristoph Hellwig 621c59d87c4SChristoph Hellwig /* 622c59d87c4SChristoph Hellwig * Test if a given page is suitable for writing as part of an unwritten 623c59d87c4SChristoph Hellwig * or delayed allocate extent. 624c59d87c4SChristoph Hellwig */ 625c59d87c4SChristoph Hellwig STATIC int 626c59d87c4SChristoph Hellwig xfs_is_delayed_page( 627c59d87c4SChristoph Hellwig struct page *page, 628c59d87c4SChristoph Hellwig unsigned int type) 629c59d87c4SChristoph Hellwig { 630c59d87c4SChristoph Hellwig if (PageWriteback(page)) 631c59d87c4SChristoph Hellwig return 0; 632c59d87c4SChristoph Hellwig 633c59d87c4SChristoph Hellwig if (page->mapping && page_has_buffers(page)) { 634c59d87c4SChristoph Hellwig struct buffer_head *bh, *head; 635c59d87c4SChristoph Hellwig int acceptable = 0; 636c59d87c4SChristoph Hellwig 637c59d87c4SChristoph Hellwig bh = head = page_buffers(page); 638c59d87c4SChristoph Hellwig do { 639c59d87c4SChristoph Hellwig if (buffer_unwritten(bh)) 640c59d87c4SChristoph Hellwig acceptable = (type == IO_UNWRITTEN); 641c59d87c4SChristoph Hellwig else if (buffer_delay(bh)) 642c59d87c4SChristoph Hellwig acceptable = (type == IO_DELALLOC); 643c59d87c4SChristoph Hellwig else if (buffer_dirty(bh) && buffer_mapped(bh)) 644c59d87c4SChristoph Hellwig acceptable = (type == IO_OVERWRITE); 645c59d87c4SChristoph Hellwig else 646c59d87c4SChristoph Hellwig break; 647c59d87c4SChristoph Hellwig } while ((bh = bh->b_this_page) != head); 648c59d87c4SChristoph Hellwig 649c59d87c4SChristoph Hellwig if (acceptable) 650c59d87c4SChristoph Hellwig return 1; 651c59d87c4SChristoph Hellwig } 652c59d87c4SChristoph Hellwig 653c59d87c4SChristoph Hellwig return 0; 654c59d87c4SChristoph Hellwig } 655c59d87c4SChristoph Hellwig 656c59d87c4SChristoph Hellwig /* 657c59d87c4SChristoph Hellwig * Allocate & map buffers for page given the extent map. Write it out. 658c59d87c4SChristoph Hellwig * except for the original page of a writepage, this is called on 659c59d87c4SChristoph Hellwig * delalloc/unwritten pages only, for the original page it is possible 660c59d87c4SChristoph Hellwig * that the page has no mapping at all. 661c59d87c4SChristoph Hellwig */ 662c59d87c4SChristoph Hellwig STATIC int 663c59d87c4SChristoph Hellwig xfs_convert_page( 664c59d87c4SChristoph Hellwig struct inode *inode, 665c59d87c4SChristoph Hellwig struct page *page, 666c59d87c4SChristoph Hellwig loff_t tindex, 667c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 668c59d87c4SChristoph Hellwig xfs_ioend_t **ioendp, 669c59d87c4SChristoph Hellwig struct writeback_control *wbc) 670c59d87c4SChristoph Hellwig { 671c59d87c4SChristoph Hellwig struct buffer_head *bh, *head; 672c59d87c4SChristoph Hellwig xfs_off_t end_offset; 673c59d87c4SChristoph Hellwig unsigned long p_offset; 674c59d87c4SChristoph Hellwig unsigned int type; 675c59d87c4SChristoph Hellwig int len, page_dirty; 676c59d87c4SChristoph Hellwig int count = 0, done = 0, uptodate = 1; 677c59d87c4SChristoph Hellwig xfs_off_t offset = page_offset(page); 678c59d87c4SChristoph Hellwig 679c59d87c4SChristoph Hellwig if (page->index != tindex) 680c59d87c4SChristoph Hellwig goto fail; 681c59d87c4SChristoph Hellwig if (!trylock_page(page)) 682c59d87c4SChristoph Hellwig goto fail; 683c59d87c4SChristoph Hellwig if (PageWriteback(page)) 684c59d87c4SChristoph Hellwig goto fail_unlock_page; 685c59d87c4SChristoph Hellwig if (page->mapping != inode->i_mapping) 686c59d87c4SChristoph Hellwig goto fail_unlock_page; 687c59d87c4SChristoph Hellwig if (!xfs_is_delayed_page(page, (*ioendp)->io_type)) 688c59d87c4SChristoph Hellwig goto fail_unlock_page; 689c59d87c4SChristoph Hellwig 690c59d87c4SChristoph Hellwig /* 691c59d87c4SChristoph Hellwig * page_dirty is initially a count of buffers on the page before 692c59d87c4SChristoph Hellwig * EOF and is decremented as we move each into a cleanable state. 693c59d87c4SChristoph Hellwig * 694c59d87c4SChristoph Hellwig * Derivation: 695c59d87c4SChristoph Hellwig * 696c59d87c4SChristoph Hellwig * End offset is the highest offset that this page should represent. 697c59d87c4SChristoph Hellwig * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) 698c59d87c4SChristoph Hellwig * will evaluate non-zero and be less than PAGE_CACHE_SIZE and 699c59d87c4SChristoph Hellwig * hence give us the correct page_dirty count. On any other page, 700c59d87c4SChristoph Hellwig * it will be zero and in that case we need page_dirty to be the 701c59d87c4SChristoph Hellwig * count of buffers on the page. 702c59d87c4SChristoph Hellwig */ 703c59d87c4SChristoph Hellwig end_offset = min_t(unsigned long long, 704c59d87c4SChristoph Hellwig (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, 705c59d87c4SChristoph Hellwig i_size_read(inode)); 706c59d87c4SChristoph Hellwig 707c59d87c4SChristoph Hellwig len = 1 << inode->i_blkbits; 708c59d87c4SChristoph Hellwig p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), 709c59d87c4SChristoph Hellwig PAGE_CACHE_SIZE); 710c59d87c4SChristoph Hellwig p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; 711c59d87c4SChristoph Hellwig page_dirty = p_offset / len; 712c59d87c4SChristoph Hellwig 713c59d87c4SChristoph Hellwig bh = head = page_buffers(page); 714c59d87c4SChristoph Hellwig do { 715c59d87c4SChristoph Hellwig if (offset >= end_offset) 716c59d87c4SChristoph Hellwig break; 717c59d87c4SChristoph Hellwig if (!buffer_uptodate(bh)) 718c59d87c4SChristoph Hellwig uptodate = 0; 719c59d87c4SChristoph Hellwig if (!(PageUptodate(page) || buffer_uptodate(bh))) { 720c59d87c4SChristoph Hellwig done = 1; 721c59d87c4SChristoph Hellwig continue; 722c59d87c4SChristoph Hellwig } 723c59d87c4SChristoph Hellwig 724c59d87c4SChristoph Hellwig if (buffer_unwritten(bh) || buffer_delay(bh) || 725c59d87c4SChristoph Hellwig buffer_mapped(bh)) { 726c59d87c4SChristoph Hellwig if (buffer_unwritten(bh)) 727c59d87c4SChristoph Hellwig type = IO_UNWRITTEN; 728c59d87c4SChristoph Hellwig else if (buffer_delay(bh)) 729c59d87c4SChristoph Hellwig type = IO_DELALLOC; 730c59d87c4SChristoph Hellwig else 731c59d87c4SChristoph Hellwig type = IO_OVERWRITE; 732c59d87c4SChristoph Hellwig 733c59d87c4SChristoph Hellwig if (!xfs_imap_valid(inode, imap, offset)) { 734c59d87c4SChristoph Hellwig done = 1; 735c59d87c4SChristoph Hellwig continue; 736c59d87c4SChristoph Hellwig } 737c59d87c4SChristoph Hellwig 738c59d87c4SChristoph Hellwig lock_buffer(bh); 739c59d87c4SChristoph Hellwig if (type != IO_OVERWRITE) 740c59d87c4SChristoph Hellwig xfs_map_at_offset(inode, bh, imap, offset); 741c59d87c4SChristoph Hellwig xfs_add_to_ioend(inode, bh, offset, type, 742c59d87c4SChristoph Hellwig ioendp, done); 743c59d87c4SChristoph Hellwig 744c59d87c4SChristoph Hellwig page_dirty--; 745c59d87c4SChristoph Hellwig count++; 746c59d87c4SChristoph Hellwig } else { 747c59d87c4SChristoph Hellwig done = 1; 748c59d87c4SChristoph Hellwig } 749c59d87c4SChristoph Hellwig } while (offset += len, (bh = bh->b_this_page) != head); 750c59d87c4SChristoph Hellwig 751c59d87c4SChristoph Hellwig if (uptodate && bh == head) 752c59d87c4SChristoph Hellwig SetPageUptodate(page); 753c59d87c4SChristoph Hellwig 754c59d87c4SChristoph Hellwig if (count) { 755c59d87c4SChristoph Hellwig if (--wbc->nr_to_write <= 0 && 756c59d87c4SChristoph Hellwig wbc->sync_mode == WB_SYNC_NONE) 757c59d87c4SChristoph Hellwig done = 1; 758c59d87c4SChristoph Hellwig } 759c59d87c4SChristoph Hellwig xfs_start_page_writeback(page, !page_dirty, count); 760c59d87c4SChristoph Hellwig 761c59d87c4SChristoph Hellwig return done; 762c59d87c4SChristoph Hellwig fail_unlock_page: 763c59d87c4SChristoph Hellwig unlock_page(page); 764c59d87c4SChristoph Hellwig fail: 765c59d87c4SChristoph Hellwig return 1; 766c59d87c4SChristoph Hellwig } 767c59d87c4SChristoph Hellwig 768c59d87c4SChristoph Hellwig /* 769c59d87c4SChristoph Hellwig * Convert & write out a cluster of pages in the same extent as defined 770c59d87c4SChristoph Hellwig * by mp and following the start page. 771c59d87c4SChristoph Hellwig */ 772c59d87c4SChristoph Hellwig STATIC void 773c59d87c4SChristoph Hellwig xfs_cluster_write( 774c59d87c4SChristoph Hellwig struct inode *inode, 775c59d87c4SChristoph Hellwig pgoff_t tindex, 776c59d87c4SChristoph Hellwig struct xfs_bmbt_irec *imap, 777c59d87c4SChristoph Hellwig xfs_ioend_t **ioendp, 778c59d87c4SChristoph Hellwig struct writeback_control *wbc, 779c59d87c4SChristoph Hellwig pgoff_t tlast) 780c59d87c4SChristoph Hellwig { 781c59d87c4SChristoph Hellwig struct pagevec pvec; 782c59d87c4SChristoph Hellwig int done = 0, i; 783c59d87c4SChristoph Hellwig 784c59d87c4SChristoph Hellwig pagevec_init(&pvec, 0); 785c59d87c4SChristoph Hellwig while (!done && tindex <= tlast) { 786c59d87c4SChristoph Hellwig unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); 787c59d87c4SChristoph Hellwig 788c59d87c4SChristoph Hellwig if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) 789c59d87c4SChristoph Hellwig break; 790c59d87c4SChristoph Hellwig 791c59d87c4SChristoph Hellwig for (i = 0; i < pagevec_count(&pvec); i++) { 792c59d87c4SChristoph Hellwig done = xfs_convert_page(inode, pvec.pages[i], tindex++, 793c59d87c4SChristoph Hellwig imap, ioendp, wbc); 794c59d87c4SChristoph Hellwig if (done) 795c59d87c4SChristoph Hellwig break; 796c59d87c4SChristoph Hellwig } 797c59d87c4SChristoph Hellwig 798c59d87c4SChristoph Hellwig pagevec_release(&pvec); 799c59d87c4SChristoph Hellwig cond_resched(); 800c59d87c4SChristoph Hellwig } 801c59d87c4SChristoph Hellwig } 802c59d87c4SChristoph Hellwig 803c59d87c4SChristoph Hellwig STATIC void 804c59d87c4SChristoph Hellwig xfs_vm_invalidatepage( 805c59d87c4SChristoph Hellwig struct page *page, 806c59d87c4SChristoph Hellwig unsigned long offset) 807c59d87c4SChristoph Hellwig { 808c59d87c4SChristoph Hellwig trace_xfs_invalidatepage(page->mapping->host, page, offset); 809c59d87c4SChristoph Hellwig block_invalidatepage(page, offset); 810c59d87c4SChristoph Hellwig } 811c59d87c4SChristoph Hellwig 812c59d87c4SChristoph Hellwig /* 813c59d87c4SChristoph Hellwig * If the page has delalloc buffers on it, we need to punch them out before we 814c59d87c4SChristoph Hellwig * invalidate the page. If we don't, we leave a stale delalloc mapping on the 815c59d87c4SChristoph Hellwig * inode that can trip a BUG() in xfs_get_blocks() later on if a direct IO read 816c59d87c4SChristoph Hellwig * is done on that same region - the delalloc extent is returned when none is 817c59d87c4SChristoph Hellwig * supposed to be there. 818c59d87c4SChristoph Hellwig * 819c59d87c4SChristoph Hellwig * We prevent this by truncating away the delalloc regions on the page before 820c59d87c4SChristoph Hellwig * invalidating it. Because they are delalloc, we can do this without needing a 821c59d87c4SChristoph Hellwig * transaction. Indeed - if we get ENOSPC errors, we have to be able to do this 822c59d87c4SChristoph Hellwig * truncation without a transaction as there is no space left for block 823c59d87c4SChristoph Hellwig * reservation (typically why we see a ENOSPC in writeback). 824c59d87c4SChristoph Hellwig * 825c59d87c4SChristoph Hellwig * This is not a performance critical path, so for now just do the punching a 826c59d87c4SChristoph Hellwig * buffer head at a time. 827c59d87c4SChristoph Hellwig */ 828c59d87c4SChristoph Hellwig STATIC void 829c59d87c4SChristoph Hellwig xfs_aops_discard_page( 830c59d87c4SChristoph Hellwig struct page *page) 831c59d87c4SChristoph Hellwig { 832c59d87c4SChristoph Hellwig struct inode *inode = page->mapping->host; 833c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 834c59d87c4SChristoph Hellwig struct buffer_head *bh, *head; 835c59d87c4SChristoph Hellwig loff_t offset = page_offset(page); 836c59d87c4SChristoph Hellwig 837c59d87c4SChristoph Hellwig if (!xfs_is_delayed_page(page, IO_DELALLOC)) 838c59d87c4SChristoph Hellwig goto out_invalidate; 839c59d87c4SChristoph Hellwig 840c59d87c4SChristoph Hellwig if (XFS_FORCED_SHUTDOWN(ip->i_mount)) 841c59d87c4SChristoph Hellwig goto out_invalidate; 842c59d87c4SChristoph Hellwig 843c59d87c4SChristoph Hellwig xfs_alert(ip->i_mount, 844c59d87c4SChristoph Hellwig "page discard on page %p, inode 0x%llx, offset %llu.", 845c59d87c4SChristoph Hellwig page, ip->i_ino, offset); 846c59d87c4SChristoph Hellwig 847c59d87c4SChristoph Hellwig xfs_ilock(ip, XFS_ILOCK_EXCL); 848c59d87c4SChristoph Hellwig bh = head = page_buffers(page); 849c59d87c4SChristoph Hellwig do { 850c59d87c4SChristoph Hellwig int error; 851c59d87c4SChristoph Hellwig xfs_fileoff_t start_fsb; 852c59d87c4SChristoph Hellwig 853c59d87c4SChristoph Hellwig if (!buffer_delay(bh)) 854c59d87c4SChristoph Hellwig goto next_buffer; 855c59d87c4SChristoph Hellwig 856c59d87c4SChristoph Hellwig start_fsb = XFS_B_TO_FSBT(ip->i_mount, offset); 857c59d87c4SChristoph Hellwig error = xfs_bmap_punch_delalloc_range(ip, start_fsb, 1); 858c59d87c4SChristoph Hellwig if (error) { 859c59d87c4SChristoph Hellwig /* something screwed, just bail */ 860c59d87c4SChristoph Hellwig if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { 861c59d87c4SChristoph Hellwig xfs_alert(ip->i_mount, 862c59d87c4SChristoph Hellwig "page discard unable to remove delalloc mapping."); 863c59d87c4SChristoph Hellwig } 864c59d87c4SChristoph Hellwig break; 865c59d87c4SChristoph Hellwig } 866c59d87c4SChristoph Hellwig next_buffer: 867c59d87c4SChristoph Hellwig offset += 1 << inode->i_blkbits; 868c59d87c4SChristoph Hellwig 869c59d87c4SChristoph Hellwig } while ((bh = bh->b_this_page) != head); 870c59d87c4SChristoph Hellwig 871c59d87c4SChristoph Hellwig xfs_iunlock(ip, XFS_ILOCK_EXCL); 872c59d87c4SChristoph Hellwig out_invalidate: 873c59d87c4SChristoph Hellwig xfs_vm_invalidatepage(page, 0); 874c59d87c4SChristoph Hellwig return; 875c59d87c4SChristoph Hellwig } 876c59d87c4SChristoph Hellwig 877c59d87c4SChristoph Hellwig /* 878c59d87c4SChristoph Hellwig * Write out a dirty page. 879c59d87c4SChristoph Hellwig * 880c59d87c4SChristoph Hellwig * For delalloc space on the page we need to allocate space and flush it. 881c59d87c4SChristoph Hellwig * For unwritten space on the page we need to start the conversion to 882c59d87c4SChristoph Hellwig * regular allocated space. 883c59d87c4SChristoph Hellwig * For any other dirty buffer heads on the page we should flush them. 884c59d87c4SChristoph Hellwig */ 885c59d87c4SChristoph Hellwig STATIC int 886c59d87c4SChristoph Hellwig xfs_vm_writepage( 887c59d87c4SChristoph Hellwig struct page *page, 888c59d87c4SChristoph Hellwig struct writeback_control *wbc) 889c59d87c4SChristoph Hellwig { 890c59d87c4SChristoph Hellwig struct inode *inode = page->mapping->host; 891c59d87c4SChristoph Hellwig struct buffer_head *bh, *head; 892c59d87c4SChristoph Hellwig struct xfs_bmbt_irec imap; 893c59d87c4SChristoph Hellwig xfs_ioend_t *ioend = NULL, *iohead = NULL; 894c59d87c4SChristoph Hellwig loff_t offset; 895c59d87c4SChristoph Hellwig unsigned int type; 896c59d87c4SChristoph Hellwig __uint64_t end_offset; 897c59d87c4SChristoph Hellwig pgoff_t end_index, last_index; 898c59d87c4SChristoph Hellwig ssize_t len; 899c59d87c4SChristoph Hellwig int err, imap_valid = 0, uptodate = 1; 900c59d87c4SChristoph Hellwig int count = 0; 901c59d87c4SChristoph Hellwig int nonblocking = 0; 902c59d87c4SChristoph Hellwig 903c59d87c4SChristoph Hellwig trace_xfs_writepage(inode, page, 0); 904c59d87c4SChristoph Hellwig 905c59d87c4SChristoph Hellwig ASSERT(page_has_buffers(page)); 906c59d87c4SChristoph Hellwig 907c59d87c4SChristoph Hellwig /* 908c59d87c4SChristoph Hellwig * Refuse to write the page out if we are called from reclaim context. 909c59d87c4SChristoph Hellwig * 910c59d87c4SChristoph Hellwig * This avoids stack overflows when called from deeply used stacks in 911c59d87c4SChristoph Hellwig * random callers for direct reclaim or memcg reclaim. We explicitly 912c59d87c4SChristoph Hellwig * allow reclaim from kswapd as the stack usage there is relatively low. 913c59d87c4SChristoph Hellwig * 91494054fa3SMel Gorman * This should never happen except in the case of a VM regression so 91594054fa3SMel Gorman * warn about it. 916c59d87c4SChristoph Hellwig */ 91794054fa3SMel Gorman if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == 91894054fa3SMel Gorman PF_MEMALLOC)) 919c59d87c4SChristoph Hellwig goto redirty; 920c59d87c4SChristoph Hellwig 921c59d87c4SChristoph Hellwig /* 922c59d87c4SChristoph Hellwig * Given that we do not allow direct reclaim to call us, we should 923c59d87c4SChristoph Hellwig * never be called while in a filesystem transaction. 924c59d87c4SChristoph Hellwig */ 925c59d87c4SChristoph Hellwig if (WARN_ON(current->flags & PF_FSTRANS)) 926c59d87c4SChristoph Hellwig goto redirty; 927c59d87c4SChristoph Hellwig 928c59d87c4SChristoph Hellwig /* Is this page beyond the end of the file? */ 929c59d87c4SChristoph Hellwig offset = i_size_read(inode); 930c59d87c4SChristoph Hellwig end_index = offset >> PAGE_CACHE_SHIFT; 931c59d87c4SChristoph Hellwig last_index = (offset - 1) >> PAGE_CACHE_SHIFT; 932c59d87c4SChristoph Hellwig if (page->index >= end_index) { 933c59d87c4SChristoph Hellwig if ((page->index >= end_index + 1) || 934c59d87c4SChristoph Hellwig !(i_size_read(inode) & (PAGE_CACHE_SIZE - 1))) { 935c59d87c4SChristoph Hellwig unlock_page(page); 936c59d87c4SChristoph Hellwig return 0; 937c59d87c4SChristoph Hellwig } 938c59d87c4SChristoph Hellwig } 939c59d87c4SChristoph Hellwig 940c59d87c4SChristoph Hellwig end_offset = min_t(unsigned long long, 941c59d87c4SChristoph Hellwig (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, 942c59d87c4SChristoph Hellwig offset); 943c59d87c4SChristoph Hellwig len = 1 << inode->i_blkbits; 944c59d87c4SChristoph Hellwig 945c59d87c4SChristoph Hellwig bh = head = page_buffers(page); 946c59d87c4SChristoph Hellwig offset = page_offset(page); 947c59d87c4SChristoph Hellwig type = IO_OVERWRITE; 948c59d87c4SChristoph Hellwig 949c59d87c4SChristoph Hellwig if (wbc->sync_mode == WB_SYNC_NONE) 950c59d87c4SChristoph Hellwig nonblocking = 1; 951c59d87c4SChristoph Hellwig 952c59d87c4SChristoph Hellwig do { 953c59d87c4SChristoph Hellwig int new_ioend = 0; 954c59d87c4SChristoph Hellwig 955c59d87c4SChristoph Hellwig if (offset >= end_offset) 956c59d87c4SChristoph Hellwig break; 957c59d87c4SChristoph Hellwig if (!buffer_uptodate(bh)) 958c59d87c4SChristoph Hellwig uptodate = 0; 959c59d87c4SChristoph Hellwig 960c59d87c4SChristoph Hellwig /* 961c59d87c4SChristoph Hellwig * set_page_dirty dirties all buffers in a page, independent 962c59d87c4SChristoph Hellwig * of their state. The dirty state however is entirely 963c59d87c4SChristoph Hellwig * meaningless for holes (!mapped && uptodate), so skip 964c59d87c4SChristoph Hellwig * buffers covering holes here. 965c59d87c4SChristoph Hellwig */ 966c59d87c4SChristoph Hellwig if (!buffer_mapped(bh) && buffer_uptodate(bh)) { 967c59d87c4SChristoph Hellwig imap_valid = 0; 968c59d87c4SChristoph Hellwig continue; 969c59d87c4SChristoph Hellwig } 970c59d87c4SChristoph Hellwig 971c59d87c4SChristoph Hellwig if (buffer_unwritten(bh)) { 972c59d87c4SChristoph Hellwig if (type != IO_UNWRITTEN) { 973c59d87c4SChristoph Hellwig type = IO_UNWRITTEN; 974c59d87c4SChristoph Hellwig imap_valid = 0; 975c59d87c4SChristoph Hellwig } 976c59d87c4SChristoph Hellwig } else if (buffer_delay(bh)) { 977c59d87c4SChristoph Hellwig if (type != IO_DELALLOC) { 978c59d87c4SChristoph Hellwig type = IO_DELALLOC; 979c59d87c4SChristoph Hellwig imap_valid = 0; 980c59d87c4SChristoph Hellwig } 981c59d87c4SChristoph Hellwig } else if (buffer_uptodate(bh)) { 982c59d87c4SChristoph Hellwig if (type != IO_OVERWRITE) { 983c59d87c4SChristoph Hellwig type = IO_OVERWRITE; 984c59d87c4SChristoph Hellwig imap_valid = 0; 985c59d87c4SChristoph Hellwig } 986c59d87c4SChristoph Hellwig } else { 987c59d87c4SChristoph Hellwig if (PageUptodate(page)) { 988c59d87c4SChristoph Hellwig ASSERT(buffer_mapped(bh)); 989c59d87c4SChristoph Hellwig imap_valid = 0; 990c59d87c4SChristoph Hellwig } 991c59d87c4SChristoph Hellwig continue; 992c59d87c4SChristoph Hellwig } 993c59d87c4SChristoph Hellwig 994c59d87c4SChristoph Hellwig if (imap_valid) 995c59d87c4SChristoph Hellwig imap_valid = xfs_imap_valid(inode, &imap, offset); 996c59d87c4SChristoph Hellwig if (!imap_valid) { 997c59d87c4SChristoph Hellwig /* 998c59d87c4SChristoph Hellwig * If we didn't have a valid mapping then we need to 999c59d87c4SChristoph Hellwig * put the new mapping into a separate ioend structure. 1000c59d87c4SChristoph Hellwig * This ensures non-contiguous extents always have 1001c59d87c4SChristoph Hellwig * separate ioends, which is particularly important 1002c59d87c4SChristoph Hellwig * for unwritten extent conversion at I/O completion 1003c59d87c4SChristoph Hellwig * time. 1004c59d87c4SChristoph Hellwig */ 1005c59d87c4SChristoph Hellwig new_ioend = 1; 1006c59d87c4SChristoph Hellwig err = xfs_map_blocks(inode, offset, &imap, type, 1007c59d87c4SChristoph Hellwig nonblocking); 1008c59d87c4SChristoph Hellwig if (err) 1009c59d87c4SChristoph Hellwig goto error; 1010c59d87c4SChristoph Hellwig imap_valid = xfs_imap_valid(inode, &imap, offset); 1011c59d87c4SChristoph Hellwig } 1012c59d87c4SChristoph Hellwig if (imap_valid) { 1013c59d87c4SChristoph Hellwig lock_buffer(bh); 1014c59d87c4SChristoph Hellwig if (type != IO_OVERWRITE) 1015c59d87c4SChristoph Hellwig xfs_map_at_offset(inode, bh, &imap, offset); 1016c59d87c4SChristoph Hellwig xfs_add_to_ioend(inode, bh, offset, type, &ioend, 1017c59d87c4SChristoph Hellwig new_ioend); 1018c59d87c4SChristoph Hellwig count++; 1019c59d87c4SChristoph Hellwig } 1020c59d87c4SChristoph Hellwig 1021c59d87c4SChristoph Hellwig if (!iohead) 1022c59d87c4SChristoph Hellwig iohead = ioend; 1023c59d87c4SChristoph Hellwig 1024c59d87c4SChristoph Hellwig } while (offset += len, ((bh = bh->b_this_page) != head)); 1025c59d87c4SChristoph Hellwig 1026c59d87c4SChristoph Hellwig if (uptodate && bh == head) 1027c59d87c4SChristoph Hellwig SetPageUptodate(page); 1028c59d87c4SChristoph Hellwig 1029c59d87c4SChristoph Hellwig xfs_start_page_writeback(page, 1, count); 1030c59d87c4SChristoph Hellwig 1031c59d87c4SChristoph Hellwig if (ioend && imap_valid) { 1032c59d87c4SChristoph Hellwig xfs_off_t end_index; 1033c59d87c4SChristoph Hellwig 1034c59d87c4SChristoph Hellwig end_index = imap.br_startoff + imap.br_blockcount; 1035c59d87c4SChristoph Hellwig 1036c59d87c4SChristoph Hellwig /* to bytes */ 1037c59d87c4SChristoph Hellwig end_index <<= inode->i_blkbits; 1038c59d87c4SChristoph Hellwig 1039c59d87c4SChristoph Hellwig /* to pages */ 1040c59d87c4SChristoph Hellwig end_index = (end_index - 1) >> PAGE_CACHE_SHIFT; 1041c59d87c4SChristoph Hellwig 1042c59d87c4SChristoph Hellwig /* check against file size */ 1043c59d87c4SChristoph Hellwig if (end_index > last_index) 1044c59d87c4SChristoph Hellwig end_index = last_index; 1045c59d87c4SChristoph Hellwig 1046c59d87c4SChristoph Hellwig xfs_cluster_write(inode, page->index + 1, &imap, &ioend, 1047c59d87c4SChristoph Hellwig wbc, end_index); 1048c59d87c4SChristoph Hellwig } 1049c59d87c4SChristoph Hellwig 1050*281627dfSChristoph Hellwig if (iohead) { 1051*281627dfSChristoph Hellwig /* 1052*281627dfSChristoph Hellwig * Reserve log space if we might write beyond the on-disk 1053*281627dfSChristoph Hellwig * inode size. 1054*281627dfSChristoph Hellwig */ 1055*281627dfSChristoph Hellwig if (ioend->io_type != IO_UNWRITTEN && 1056*281627dfSChristoph Hellwig xfs_ioend_is_append(ioend)) { 1057*281627dfSChristoph Hellwig err = xfs_setfilesize_trans_alloc(ioend); 1058*281627dfSChristoph Hellwig if (err) 1059*281627dfSChristoph Hellwig goto error; 1060*281627dfSChristoph Hellwig } 1061*281627dfSChristoph Hellwig 1062c59d87c4SChristoph Hellwig xfs_submit_ioend(wbc, iohead); 1063*281627dfSChristoph Hellwig } 1064c59d87c4SChristoph Hellwig 1065c59d87c4SChristoph Hellwig return 0; 1066c59d87c4SChristoph Hellwig 1067c59d87c4SChristoph Hellwig error: 1068c59d87c4SChristoph Hellwig if (iohead) 1069c59d87c4SChristoph Hellwig xfs_cancel_ioend(iohead); 1070c59d87c4SChristoph Hellwig 1071c59d87c4SChristoph Hellwig if (err == -EAGAIN) 1072c59d87c4SChristoph Hellwig goto redirty; 1073c59d87c4SChristoph Hellwig 1074c59d87c4SChristoph Hellwig xfs_aops_discard_page(page); 1075c59d87c4SChristoph Hellwig ClearPageUptodate(page); 1076c59d87c4SChristoph Hellwig unlock_page(page); 1077c59d87c4SChristoph Hellwig return err; 1078c59d87c4SChristoph Hellwig 1079c59d87c4SChristoph Hellwig redirty: 1080c59d87c4SChristoph Hellwig redirty_page_for_writepage(wbc, page); 1081c59d87c4SChristoph Hellwig unlock_page(page); 1082c59d87c4SChristoph Hellwig return 0; 1083c59d87c4SChristoph Hellwig } 1084c59d87c4SChristoph Hellwig 1085c59d87c4SChristoph Hellwig STATIC int 1086c59d87c4SChristoph Hellwig xfs_vm_writepages( 1087c59d87c4SChristoph Hellwig struct address_space *mapping, 1088c59d87c4SChristoph Hellwig struct writeback_control *wbc) 1089c59d87c4SChristoph Hellwig { 1090c59d87c4SChristoph Hellwig xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); 1091c59d87c4SChristoph Hellwig return generic_writepages(mapping, wbc); 1092c59d87c4SChristoph Hellwig } 1093c59d87c4SChristoph Hellwig 1094c59d87c4SChristoph Hellwig /* 1095c59d87c4SChristoph Hellwig * Called to move a page into cleanable state - and from there 1096c59d87c4SChristoph Hellwig * to be released. The page should already be clean. We always 1097c59d87c4SChristoph Hellwig * have buffer heads in this call. 1098c59d87c4SChristoph Hellwig * 1099c59d87c4SChristoph Hellwig * Returns 1 if the page is ok to release, 0 otherwise. 1100c59d87c4SChristoph Hellwig */ 1101c59d87c4SChristoph Hellwig STATIC int 1102c59d87c4SChristoph Hellwig xfs_vm_releasepage( 1103c59d87c4SChristoph Hellwig struct page *page, 1104c59d87c4SChristoph Hellwig gfp_t gfp_mask) 1105c59d87c4SChristoph Hellwig { 1106c59d87c4SChristoph Hellwig int delalloc, unwritten; 1107c59d87c4SChristoph Hellwig 1108c59d87c4SChristoph Hellwig trace_xfs_releasepage(page->mapping->host, page, 0); 1109c59d87c4SChristoph Hellwig 1110c59d87c4SChristoph Hellwig xfs_count_page_state(page, &delalloc, &unwritten); 1111c59d87c4SChristoph Hellwig 1112c59d87c4SChristoph Hellwig if (WARN_ON(delalloc)) 1113c59d87c4SChristoph Hellwig return 0; 1114c59d87c4SChristoph Hellwig if (WARN_ON(unwritten)) 1115c59d87c4SChristoph Hellwig return 0; 1116c59d87c4SChristoph Hellwig 1117c59d87c4SChristoph Hellwig return try_to_free_buffers(page); 1118c59d87c4SChristoph Hellwig } 1119c59d87c4SChristoph Hellwig 1120c59d87c4SChristoph Hellwig STATIC int 1121c59d87c4SChristoph Hellwig __xfs_get_blocks( 1122c59d87c4SChristoph Hellwig struct inode *inode, 1123c59d87c4SChristoph Hellwig sector_t iblock, 1124c59d87c4SChristoph Hellwig struct buffer_head *bh_result, 1125c59d87c4SChristoph Hellwig int create, 1126c59d87c4SChristoph Hellwig int direct) 1127c59d87c4SChristoph Hellwig { 1128c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 1129c59d87c4SChristoph Hellwig struct xfs_mount *mp = ip->i_mount; 1130c59d87c4SChristoph Hellwig xfs_fileoff_t offset_fsb, end_fsb; 1131c59d87c4SChristoph Hellwig int error = 0; 1132c59d87c4SChristoph Hellwig int lockmode = 0; 1133c59d87c4SChristoph Hellwig struct xfs_bmbt_irec imap; 1134c59d87c4SChristoph Hellwig int nimaps = 1; 1135c59d87c4SChristoph Hellwig xfs_off_t offset; 1136c59d87c4SChristoph Hellwig ssize_t size; 1137c59d87c4SChristoph Hellwig int new = 0; 1138c59d87c4SChristoph Hellwig 1139c59d87c4SChristoph Hellwig if (XFS_FORCED_SHUTDOWN(mp)) 1140c59d87c4SChristoph Hellwig return -XFS_ERROR(EIO); 1141c59d87c4SChristoph Hellwig 1142c59d87c4SChristoph Hellwig offset = (xfs_off_t)iblock << inode->i_blkbits; 1143c59d87c4SChristoph Hellwig ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); 1144c59d87c4SChristoph Hellwig size = bh_result->b_size; 1145c59d87c4SChristoph Hellwig 1146c59d87c4SChristoph Hellwig if (!create && direct && offset >= i_size_read(inode)) 1147c59d87c4SChristoph Hellwig return 0; 1148c59d87c4SChristoph Hellwig 1149c59d87c4SChristoph Hellwig if (create) { 1150c59d87c4SChristoph Hellwig lockmode = XFS_ILOCK_EXCL; 1151c59d87c4SChristoph Hellwig xfs_ilock(ip, lockmode); 1152c59d87c4SChristoph Hellwig } else { 1153c59d87c4SChristoph Hellwig lockmode = xfs_ilock_map_shared(ip); 1154c59d87c4SChristoph Hellwig } 1155c59d87c4SChristoph Hellwig 1156c59d87c4SChristoph Hellwig ASSERT(offset <= mp->m_maxioffset); 1157c59d87c4SChristoph Hellwig if (offset + size > mp->m_maxioffset) 1158c59d87c4SChristoph Hellwig size = mp->m_maxioffset - offset; 1159c59d87c4SChristoph Hellwig end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + size); 1160c59d87c4SChristoph Hellwig offset_fsb = XFS_B_TO_FSBT(mp, offset); 1161c59d87c4SChristoph Hellwig 11625c8ed202SDave Chinner error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, 11635c8ed202SDave Chinner &imap, &nimaps, XFS_BMAPI_ENTIRE); 1164c59d87c4SChristoph Hellwig if (error) 1165c59d87c4SChristoph Hellwig goto out_unlock; 1166c59d87c4SChristoph Hellwig 1167c59d87c4SChristoph Hellwig if (create && 1168c59d87c4SChristoph Hellwig (!nimaps || 1169c59d87c4SChristoph Hellwig (imap.br_startblock == HOLESTARTBLOCK || 1170c59d87c4SChristoph Hellwig imap.br_startblock == DELAYSTARTBLOCK))) { 1171c59d87c4SChristoph Hellwig if (direct) { 1172c59d87c4SChristoph Hellwig error = xfs_iomap_write_direct(ip, offset, size, 1173c59d87c4SChristoph Hellwig &imap, nimaps); 1174c59d87c4SChristoph Hellwig } else { 1175c59d87c4SChristoph Hellwig error = xfs_iomap_write_delay(ip, offset, size, &imap); 1176c59d87c4SChristoph Hellwig } 1177c59d87c4SChristoph Hellwig if (error) 1178c59d87c4SChristoph Hellwig goto out_unlock; 1179c59d87c4SChristoph Hellwig 1180c59d87c4SChristoph Hellwig trace_xfs_get_blocks_alloc(ip, offset, size, 0, &imap); 1181c59d87c4SChristoph Hellwig } else if (nimaps) { 1182c59d87c4SChristoph Hellwig trace_xfs_get_blocks_found(ip, offset, size, 0, &imap); 1183c59d87c4SChristoph Hellwig } else { 1184c59d87c4SChristoph Hellwig trace_xfs_get_blocks_notfound(ip, offset, size); 1185c59d87c4SChristoph Hellwig goto out_unlock; 1186c59d87c4SChristoph Hellwig } 1187c59d87c4SChristoph Hellwig xfs_iunlock(ip, lockmode); 1188c59d87c4SChristoph Hellwig 1189c59d87c4SChristoph Hellwig if (imap.br_startblock != HOLESTARTBLOCK && 1190c59d87c4SChristoph Hellwig imap.br_startblock != DELAYSTARTBLOCK) { 1191c59d87c4SChristoph Hellwig /* 1192c59d87c4SChristoph Hellwig * For unwritten extents do not report a disk address on 1193c59d87c4SChristoph Hellwig * the read case (treat as if we're reading into a hole). 1194c59d87c4SChristoph Hellwig */ 1195c59d87c4SChristoph Hellwig if (create || !ISUNWRITTEN(&imap)) 1196c59d87c4SChristoph Hellwig xfs_map_buffer(inode, bh_result, &imap, offset); 1197c59d87c4SChristoph Hellwig if (create && ISUNWRITTEN(&imap)) { 1198c59d87c4SChristoph Hellwig if (direct) 1199c59d87c4SChristoph Hellwig bh_result->b_private = inode; 1200c59d87c4SChristoph Hellwig set_buffer_unwritten(bh_result); 1201c59d87c4SChristoph Hellwig } 1202c59d87c4SChristoph Hellwig } 1203c59d87c4SChristoph Hellwig 1204c59d87c4SChristoph Hellwig /* 1205c59d87c4SChristoph Hellwig * If this is a realtime file, data may be on a different device. 1206c59d87c4SChristoph Hellwig * to that pointed to from the buffer_head b_bdev currently. 1207c59d87c4SChristoph Hellwig */ 1208c59d87c4SChristoph Hellwig bh_result->b_bdev = xfs_find_bdev_for_inode(inode); 1209c59d87c4SChristoph Hellwig 1210c59d87c4SChristoph Hellwig /* 1211c59d87c4SChristoph Hellwig * If we previously allocated a block out beyond eof and we are now 1212c59d87c4SChristoph Hellwig * coming back to use it then we will need to flag it as new even if it 1213c59d87c4SChristoph Hellwig * has a disk address. 1214c59d87c4SChristoph Hellwig * 1215c59d87c4SChristoph Hellwig * With sub-block writes into unwritten extents we also need to mark 1216c59d87c4SChristoph Hellwig * the buffer as new so that the unwritten parts of the buffer gets 1217c59d87c4SChristoph Hellwig * correctly zeroed. 1218c59d87c4SChristoph Hellwig */ 1219c59d87c4SChristoph Hellwig if (create && 1220c59d87c4SChristoph Hellwig ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || 1221c59d87c4SChristoph Hellwig (offset >= i_size_read(inode)) || 1222c59d87c4SChristoph Hellwig (new || ISUNWRITTEN(&imap)))) 1223c59d87c4SChristoph Hellwig set_buffer_new(bh_result); 1224c59d87c4SChristoph Hellwig 1225c59d87c4SChristoph Hellwig if (imap.br_startblock == DELAYSTARTBLOCK) { 1226c59d87c4SChristoph Hellwig BUG_ON(direct); 1227c59d87c4SChristoph Hellwig if (create) { 1228c59d87c4SChristoph Hellwig set_buffer_uptodate(bh_result); 1229c59d87c4SChristoph Hellwig set_buffer_mapped(bh_result); 1230c59d87c4SChristoph Hellwig set_buffer_delay(bh_result); 1231c59d87c4SChristoph Hellwig } 1232c59d87c4SChristoph Hellwig } 1233c59d87c4SChristoph Hellwig 1234c59d87c4SChristoph Hellwig /* 1235c59d87c4SChristoph Hellwig * If this is O_DIRECT or the mpage code calling tell them how large 1236c59d87c4SChristoph Hellwig * the mapping is, so that we can avoid repeated get_blocks calls. 1237c59d87c4SChristoph Hellwig */ 1238c59d87c4SChristoph Hellwig if (direct || size > (1 << inode->i_blkbits)) { 1239c59d87c4SChristoph Hellwig xfs_off_t mapping_size; 1240c59d87c4SChristoph Hellwig 1241c59d87c4SChristoph Hellwig mapping_size = imap.br_startoff + imap.br_blockcount - iblock; 1242c59d87c4SChristoph Hellwig mapping_size <<= inode->i_blkbits; 1243c59d87c4SChristoph Hellwig 1244c59d87c4SChristoph Hellwig ASSERT(mapping_size > 0); 1245c59d87c4SChristoph Hellwig if (mapping_size > size) 1246c59d87c4SChristoph Hellwig mapping_size = size; 1247c59d87c4SChristoph Hellwig if (mapping_size > LONG_MAX) 1248c59d87c4SChristoph Hellwig mapping_size = LONG_MAX; 1249c59d87c4SChristoph Hellwig 1250c59d87c4SChristoph Hellwig bh_result->b_size = mapping_size; 1251c59d87c4SChristoph Hellwig } 1252c59d87c4SChristoph Hellwig 1253c59d87c4SChristoph Hellwig return 0; 1254c59d87c4SChristoph Hellwig 1255c59d87c4SChristoph Hellwig out_unlock: 1256c59d87c4SChristoph Hellwig xfs_iunlock(ip, lockmode); 1257c59d87c4SChristoph Hellwig return -error; 1258c59d87c4SChristoph Hellwig } 1259c59d87c4SChristoph Hellwig 1260c59d87c4SChristoph Hellwig int 1261c59d87c4SChristoph Hellwig xfs_get_blocks( 1262c59d87c4SChristoph Hellwig struct inode *inode, 1263c59d87c4SChristoph Hellwig sector_t iblock, 1264c59d87c4SChristoph Hellwig struct buffer_head *bh_result, 1265c59d87c4SChristoph Hellwig int create) 1266c59d87c4SChristoph Hellwig { 1267c59d87c4SChristoph Hellwig return __xfs_get_blocks(inode, iblock, bh_result, create, 0); 1268c59d87c4SChristoph Hellwig } 1269c59d87c4SChristoph Hellwig 1270c59d87c4SChristoph Hellwig STATIC int 1271c59d87c4SChristoph Hellwig xfs_get_blocks_direct( 1272c59d87c4SChristoph Hellwig struct inode *inode, 1273c59d87c4SChristoph Hellwig sector_t iblock, 1274c59d87c4SChristoph Hellwig struct buffer_head *bh_result, 1275c59d87c4SChristoph Hellwig int create) 1276c59d87c4SChristoph Hellwig { 1277c59d87c4SChristoph Hellwig return __xfs_get_blocks(inode, iblock, bh_result, create, 1); 1278c59d87c4SChristoph Hellwig } 1279c59d87c4SChristoph Hellwig 1280c59d87c4SChristoph Hellwig /* 1281c59d87c4SChristoph Hellwig * Complete a direct I/O write request. 1282c59d87c4SChristoph Hellwig * 1283c59d87c4SChristoph Hellwig * If the private argument is non-NULL __xfs_get_blocks signals us that we 1284c59d87c4SChristoph Hellwig * need to issue a transaction to convert the range from unwritten to written 1285c59d87c4SChristoph Hellwig * extents. In case this is regular synchronous I/O we just call xfs_end_io 1286c59d87c4SChristoph Hellwig * to do this and we are done. But in case this was a successful AIO 1287c59d87c4SChristoph Hellwig * request this handler is called from interrupt context, from which we 1288c59d87c4SChristoph Hellwig * can't start transactions. In that case offload the I/O completion to 1289c59d87c4SChristoph Hellwig * the workqueues we also use for buffered I/O completion. 1290c59d87c4SChristoph Hellwig */ 1291c59d87c4SChristoph Hellwig STATIC void 1292c59d87c4SChristoph Hellwig xfs_end_io_direct_write( 1293c59d87c4SChristoph Hellwig struct kiocb *iocb, 1294c59d87c4SChristoph Hellwig loff_t offset, 1295c59d87c4SChristoph Hellwig ssize_t size, 1296c59d87c4SChristoph Hellwig void *private, 1297c59d87c4SChristoph Hellwig int ret, 1298c59d87c4SChristoph Hellwig bool is_async) 1299c59d87c4SChristoph Hellwig { 1300c59d87c4SChristoph Hellwig struct xfs_ioend *ioend = iocb->private; 1301c59d87c4SChristoph Hellwig 1302c59d87c4SChristoph Hellwig /* 13032813d682SChristoph Hellwig * While the generic direct I/O code updates the inode size, it does 13042813d682SChristoph Hellwig * so only after the end_io handler is called, which means our 13052813d682SChristoph Hellwig * end_io handler thinks the on-disk size is outside the in-core 13062813d682SChristoph Hellwig * size. To prevent this just update it a little bit earlier here. 13072813d682SChristoph Hellwig */ 13082813d682SChristoph Hellwig if (offset + size > i_size_read(ioend->io_inode)) 13092813d682SChristoph Hellwig i_size_write(ioend->io_inode, offset + size); 13102813d682SChristoph Hellwig 13112813d682SChristoph Hellwig /* 1312c59d87c4SChristoph Hellwig * blockdev_direct_IO can return an error even after the I/O 1313c59d87c4SChristoph Hellwig * completion handler was called. Thus we need to protect 1314c59d87c4SChristoph Hellwig * against double-freeing. 1315c59d87c4SChristoph Hellwig */ 1316c59d87c4SChristoph Hellwig iocb->private = NULL; 1317c59d87c4SChristoph Hellwig 1318c59d87c4SChristoph Hellwig ioend->io_offset = offset; 1319c59d87c4SChristoph Hellwig ioend->io_size = size; 1320c859cdd1SChristoph Hellwig ioend->io_iocb = iocb; 1321c859cdd1SChristoph Hellwig ioend->io_result = ret; 1322c59d87c4SChristoph Hellwig if (private && size > 0) 1323c59d87c4SChristoph Hellwig ioend->io_type = IO_UNWRITTEN; 1324c59d87c4SChristoph Hellwig 1325c59d87c4SChristoph Hellwig if (is_async) { 1326c859cdd1SChristoph Hellwig ioend->io_isasync = 1; 1327c59d87c4SChristoph Hellwig xfs_finish_ioend(ioend); 1328c59d87c4SChristoph Hellwig } else { 1329c59d87c4SChristoph Hellwig xfs_finish_ioend_sync(ioend); 1330c59d87c4SChristoph Hellwig } 1331c59d87c4SChristoph Hellwig } 1332c59d87c4SChristoph Hellwig 1333c59d87c4SChristoph Hellwig STATIC ssize_t 1334c59d87c4SChristoph Hellwig xfs_vm_direct_IO( 1335c59d87c4SChristoph Hellwig int rw, 1336c59d87c4SChristoph Hellwig struct kiocb *iocb, 1337c59d87c4SChristoph Hellwig const struct iovec *iov, 1338c59d87c4SChristoph Hellwig loff_t offset, 1339c59d87c4SChristoph Hellwig unsigned long nr_segs) 1340c59d87c4SChristoph Hellwig { 1341c59d87c4SChristoph Hellwig struct inode *inode = iocb->ki_filp->f_mapping->host; 1342c59d87c4SChristoph Hellwig struct block_device *bdev = xfs_find_bdev_for_inode(inode); 1343*281627dfSChristoph Hellwig struct xfs_ioend *ioend = NULL; 1344c59d87c4SChristoph Hellwig ssize_t ret; 1345c59d87c4SChristoph Hellwig 1346c59d87c4SChristoph Hellwig if (rw & WRITE) { 1347*281627dfSChristoph Hellwig size_t size = iov_length(iov, nr_segs); 1348*281627dfSChristoph Hellwig 1349*281627dfSChristoph Hellwig /* 1350*281627dfSChristoph Hellwig * We need to preallocate a transaction for a size update 1351*281627dfSChristoph Hellwig * here. In the case that this write both updates the size 1352*281627dfSChristoph Hellwig * and converts at least on unwritten extent we will cancel 1353*281627dfSChristoph Hellwig * the still clean transaction after the I/O has finished. 1354*281627dfSChristoph Hellwig */ 1355*281627dfSChristoph Hellwig iocb->private = ioend = xfs_alloc_ioend(inode, IO_DIRECT); 1356*281627dfSChristoph Hellwig if (offset + size > XFS_I(inode)->i_d.di_size) { 1357*281627dfSChristoph Hellwig ret = xfs_setfilesize_trans_alloc(ioend); 1358*281627dfSChristoph Hellwig if (ret) 1359*281627dfSChristoph Hellwig goto out_destroy_ioend; 1360*281627dfSChristoph Hellwig ioend->io_isdirect = 1; 1361*281627dfSChristoph Hellwig } 1362c59d87c4SChristoph Hellwig 1363c59d87c4SChristoph Hellwig ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov, 1364c59d87c4SChristoph Hellwig offset, nr_segs, 1365c59d87c4SChristoph Hellwig xfs_get_blocks_direct, 1366c59d87c4SChristoph Hellwig xfs_end_io_direct_write, NULL, 0); 1367c59d87c4SChristoph Hellwig if (ret != -EIOCBQUEUED && iocb->private) 1368*281627dfSChristoph Hellwig goto out_trans_cancel; 1369c59d87c4SChristoph Hellwig } else { 1370c59d87c4SChristoph Hellwig ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov, 1371c59d87c4SChristoph Hellwig offset, nr_segs, 1372c59d87c4SChristoph Hellwig xfs_get_blocks_direct, 1373c59d87c4SChristoph Hellwig NULL, NULL, 0); 1374c59d87c4SChristoph Hellwig } 1375c59d87c4SChristoph Hellwig 1376c59d87c4SChristoph Hellwig return ret; 1377*281627dfSChristoph Hellwig 1378*281627dfSChristoph Hellwig out_trans_cancel: 1379*281627dfSChristoph Hellwig if (ioend->io_append_trans) { 1380*281627dfSChristoph Hellwig current_set_flags_nested(&ioend->io_append_trans->t_pflags, 1381*281627dfSChristoph Hellwig PF_FSTRANS); 1382*281627dfSChristoph Hellwig xfs_trans_cancel(ioend->io_append_trans, 0); 1383*281627dfSChristoph Hellwig } 1384*281627dfSChristoph Hellwig out_destroy_ioend: 1385*281627dfSChristoph Hellwig xfs_destroy_ioend(ioend); 1386*281627dfSChristoph Hellwig return ret; 1387c59d87c4SChristoph Hellwig } 1388c59d87c4SChristoph Hellwig 1389c59d87c4SChristoph Hellwig STATIC void 1390c59d87c4SChristoph Hellwig xfs_vm_write_failed( 1391c59d87c4SChristoph Hellwig struct address_space *mapping, 1392c59d87c4SChristoph Hellwig loff_t to) 1393c59d87c4SChristoph Hellwig { 1394c59d87c4SChristoph Hellwig struct inode *inode = mapping->host; 1395c59d87c4SChristoph Hellwig 1396c59d87c4SChristoph Hellwig if (to > inode->i_size) { 1397c59d87c4SChristoph Hellwig /* 13982813d682SChristoph Hellwig * Punch out the delalloc blocks we have already allocated. 13992813d682SChristoph Hellwig * 14002813d682SChristoph Hellwig * Don't bother with xfs_setattr given that nothing can have 14012813d682SChristoph Hellwig * made it to disk yet as the page is still locked at this 14022813d682SChristoph Hellwig * point. 1403c59d87c4SChristoph Hellwig */ 1404c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 1405c59d87c4SChristoph Hellwig xfs_fileoff_t start_fsb; 1406c59d87c4SChristoph Hellwig xfs_fileoff_t end_fsb; 1407c59d87c4SChristoph Hellwig int error; 1408c59d87c4SChristoph Hellwig 1409c59d87c4SChristoph Hellwig truncate_pagecache(inode, to, inode->i_size); 1410c59d87c4SChristoph Hellwig 1411c59d87c4SChristoph Hellwig /* 1412c59d87c4SChristoph Hellwig * Check if there are any blocks that are outside of i_size 1413c59d87c4SChristoph Hellwig * that need to be trimmed back. 1414c59d87c4SChristoph Hellwig */ 1415c59d87c4SChristoph Hellwig start_fsb = XFS_B_TO_FSB(ip->i_mount, inode->i_size) + 1; 1416c59d87c4SChristoph Hellwig end_fsb = XFS_B_TO_FSB(ip->i_mount, to); 1417c59d87c4SChristoph Hellwig if (end_fsb <= start_fsb) 1418c59d87c4SChristoph Hellwig return; 1419c59d87c4SChristoph Hellwig 1420c59d87c4SChristoph Hellwig xfs_ilock(ip, XFS_ILOCK_EXCL); 1421c59d87c4SChristoph Hellwig error = xfs_bmap_punch_delalloc_range(ip, start_fsb, 1422c59d87c4SChristoph Hellwig end_fsb - start_fsb); 1423c59d87c4SChristoph Hellwig if (error) { 1424c59d87c4SChristoph Hellwig /* something screwed, just bail */ 1425c59d87c4SChristoph Hellwig if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { 1426c59d87c4SChristoph Hellwig xfs_alert(ip->i_mount, 1427c59d87c4SChristoph Hellwig "xfs_vm_write_failed: unable to clean up ino %lld", 1428c59d87c4SChristoph Hellwig ip->i_ino); 1429c59d87c4SChristoph Hellwig } 1430c59d87c4SChristoph Hellwig } 1431c59d87c4SChristoph Hellwig xfs_iunlock(ip, XFS_ILOCK_EXCL); 1432c59d87c4SChristoph Hellwig } 1433c59d87c4SChristoph Hellwig } 1434c59d87c4SChristoph Hellwig 1435c59d87c4SChristoph Hellwig STATIC int 1436c59d87c4SChristoph Hellwig xfs_vm_write_begin( 1437c59d87c4SChristoph Hellwig struct file *file, 1438c59d87c4SChristoph Hellwig struct address_space *mapping, 1439c59d87c4SChristoph Hellwig loff_t pos, 1440c59d87c4SChristoph Hellwig unsigned len, 1441c59d87c4SChristoph Hellwig unsigned flags, 1442c59d87c4SChristoph Hellwig struct page **pagep, 1443c59d87c4SChristoph Hellwig void **fsdata) 1444c59d87c4SChristoph Hellwig { 1445c59d87c4SChristoph Hellwig int ret; 1446c59d87c4SChristoph Hellwig 1447c59d87c4SChristoph Hellwig ret = block_write_begin(mapping, pos, len, flags | AOP_FLAG_NOFS, 1448c59d87c4SChristoph Hellwig pagep, xfs_get_blocks); 1449c59d87c4SChristoph Hellwig if (unlikely(ret)) 1450c59d87c4SChristoph Hellwig xfs_vm_write_failed(mapping, pos + len); 1451c59d87c4SChristoph Hellwig return ret; 1452c59d87c4SChristoph Hellwig } 1453c59d87c4SChristoph Hellwig 1454c59d87c4SChristoph Hellwig STATIC int 1455c59d87c4SChristoph Hellwig xfs_vm_write_end( 1456c59d87c4SChristoph Hellwig struct file *file, 1457c59d87c4SChristoph Hellwig struct address_space *mapping, 1458c59d87c4SChristoph Hellwig loff_t pos, 1459c59d87c4SChristoph Hellwig unsigned len, 1460c59d87c4SChristoph Hellwig unsigned copied, 1461c59d87c4SChristoph Hellwig struct page *page, 1462c59d87c4SChristoph Hellwig void *fsdata) 1463c59d87c4SChristoph Hellwig { 1464c59d87c4SChristoph Hellwig int ret; 1465c59d87c4SChristoph Hellwig 1466c59d87c4SChristoph Hellwig ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); 1467c59d87c4SChristoph Hellwig if (unlikely(ret < len)) 1468c59d87c4SChristoph Hellwig xfs_vm_write_failed(mapping, pos + len); 1469c59d87c4SChristoph Hellwig return ret; 1470c59d87c4SChristoph Hellwig } 1471c59d87c4SChristoph Hellwig 1472c59d87c4SChristoph Hellwig STATIC sector_t 1473c59d87c4SChristoph Hellwig xfs_vm_bmap( 1474c59d87c4SChristoph Hellwig struct address_space *mapping, 1475c59d87c4SChristoph Hellwig sector_t block) 1476c59d87c4SChristoph Hellwig { 1477c59d87c4SChristoph Hellwig struct inode *inode = (struct inode *)mapping->host; 1478c59d87c4SChristoph Hellwig struct xfs_inode *ip = XFS_I(inode); 1479c59d87c4SChristoph Hellwig 1480c59d87c4SChristoph Hellwig trace_xfs_vm_bmap(XFS_I(inode)); 1481c59d87c4SChristoph Hellwig xfs_ilock(ip, XFS_IOLOCK_SHARED); 1482c59d87c4SChristoph Hellwig xfs_flush_pages(ip, (xfs_off_t)0, -1, 0, FI_REMAPF); 1483c59d87c4SChristoph Hellwig xfs_iunlock(ip, XFS_IOLOCK_SHARED); 1484c59d87c4SChristoph Hellwig return generic_block_bmap(mapping, block, xfs_get_blocks); 1485c59d87c4SChristoph Hellwig } 1486c59d87c4SChristoph Hellwig 1487c59d87c4SChristoph Hellwig STATIC int 1488c59d87c4SChristoph Hellwig xfs_vm_readpage( 1489c59d87c4SChristoph Hellwig struct file *unused, 1490c59d87c4SChristoph Hellwig struct page *page) 1491c59d87c4SChristoph Hellwig { 1492c59d87c4SChristoph Hellwig return mpage_readpage(page, xfs_get_blocks); 1493c59d87c4SChristoph Hellwig } 1494c59d87c4SChristoph Hellwig 1495c59d87c4SChristoph Hellwig STATIC int 1496c59d87c4SChristoph Hellwig xfs_vm_readpages( 1497c59d87c4SChristoph Hellwig struct file *unused, 1498c59d87c4SChristoph Hellwig struct address_space *mapping, 1499c59d87c4SChristoph Hellwig struct list_head *pages, 1500c59d87c4SChristoph Hellwig unsigned nr_pages) 1501c59d87c4SChristoph Hellwig { 1502c59d87c4SChristoph Hellwig return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); 1503c59d87c4SChristoph Hellwig } 1504c59d87c4SChristoph Hellwig 1505c59d87c4SChristoph Hellwig const struct address_space_operations xfs_address_space_operations = { 1506c59d87c4SChristoph Hellwig .readpage = xfs_vm_readpage, 1507c59d87c4SChristoph Hellwig .readpages = xfs_vm_readpages, 1508c59d87c4SChristoph Hellwig .writepage = xfs_vm_writepage, 1509c59d87c4SChristoph Hellwig .writepages = xfs_vm_writepages, 1510c59d87c4SChristoph Hellwig .releasepage = xfs_vm_releasepage, 1511c59d87c4SChristoph Hellwig .invalidatepage = xfs_vm_invalidatepage, 1512c59d87c4SChristoph Hellwig .write_begin = xfs_vm_write_begin, 1513c59d87c4SChristoph Hellwig .write_end = xfs_vm_write_end, 1514c59d87c4SChristoph Hellwig .bmap = xfs_vm_bmap, 1515c59d87c4SChristoph Hellwig .direct_IO = xfs_vm_direct_IO, 1516c59d87c4SChristoph Hellwig .migratepage = buffer_migrate_page, 1517c59d87c4SChristoph Hellwig .is_partially_uptodate = block_is_partially_uptodate, 1518c59d87c4SChristoph Hellwig .error_remove_page = generic_error_remove_page, 1519c59d87c4SChristoph Hellwig }; 1520