Loading fs/xfs/linux-2.6/xfs_aops.c +21 −17 Original line number Diff line number Diff line Loading @@ -152,23 +152,6 @@ xfs_find_bdev_for_inode( return mp->m_ddev_targp->bt_bdev; } /* * Schedule IO completion handling on a xfsdatad if this was * the final hold on this ioend. If we are asked to wait, * flush the workqueue. */ STATIC void xfs_finish_ioend( xfs_ioend_t *ioend, int wait) { if (atomic_dec_and_test(&ioend->io_remaining)) { queue_work(xfsdatad_workqueue, &ioend->io_work); if (wait) flush_workqueue(xfsdatad_workqueue); } } /* * We're now finished for good with this ioend structure. * Update the page state via the associated buffer_heads, Loading Loading @@ -309,6 +292,27 @@ xfs_end_bio_read( xfs_destroy_ioend(ioend); } /* * Schedule IO completion handling on a xfsdatad if this was * the final hold on this ioend. If we are asked to wait, * flush the workqueue. */ STATIC void xfs_finish_ioend( xfs_ioend_t *ioend, int wait) { if (atomic_dec_and_test(&ioend->io_remaining)) { struct workqueue_struct *wq = xfsdatad_workqueue; if (ioend->io_work.func == xfs_end_bio_unwritten) wq = xfsconvertd_workqueue; queue_work(wq, &ioend->io_work); if (wait) flush_workqueue(wq); } } /* * Allocate and initialise an IO completion structure. * We need to track unwritten extent write completion here initially. Loading fs/xfs/linux-2.6/xfs_aops.h +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define __XFS_AOPS_H__ extern struct workqueue_struct *xfsdatad_workqueue; extern struct workqueue_struct *xfsconvertd_workqueue; extern mempool_t *xfs_ioend_pool; /* Loading fs/xfs/linux-2.6/xfs_buf.c +9 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ static struct shrinker xfs_buf_shake = { static struct workqueue_struct *xfslogd_workqueue; struct workqueue_struct *xfsdatad_workqueue; struct workqueue_struct *xfsconvertd_workqueue; #ifdef XFS_BUF_TRACE void Loading Loading @@ -1775,6 +1776,7 @@ xfs_flush_buftarg( xfs_buf_t *bp, *n; int pincount = 0; xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); Loading Loading @@ -1831,9 +1833,15 @@ xfs_buf_init(void) if (!xfsdatad_workqueue) goto out_destroy_xfslogd_workqueue; xfsconvertd_workqueue = create_workqueue("xfsconvertd"); if (!xfsconvertd_workqueue) goto out_destroy_xfsdatad_workqueue; register_shrinker(&xfs_buf_shake); return 0; out_destroy_xfsdatad_workqueue: destroy_workqueue(xfsdatad_workqueue); out_destroy_xfslogd_workqueue: destroy_workqueue(xfslogd_workqueue); out_free_buf_zone: Loading @@ -1849,6 +1857,7 @@ void xfs_buf_terminate(void) { unregister_shrinker(&xfs_buf_shake); destroy_workqueue(xfsconvertd_workqueue); destroy_workqueue(xfsdatad_workqueue); destroy_workqueue(xfslogd_workqueue); kmem_zone_destroy(xfs_buf_zone); Loading fs/xfs/linux-2.6/xfs_fs_subr.c +7 −7 Original line number Diff line number Diff line Loading @@ -74,14 +74,14 @@ xfs_flush_pages( if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { xfs_iflags_clear(ip, XFS_ITRUNCATED); ret = filemap_fdatawrite(mapping); ret = -filemap_fdatawrite(mapping); } if (flags & XFS_B_ASYNC) return -ret; ret2 = filemap_fdatawait(mapping); return ret; ret2 = xfs_wait_on_pages(ip, first, last); if (!ret) ret = ret2; } return -ret; return ret; } int Loading fs/xfs/linux-2.6/xfs_lrw.c +17 −1 Original line number Diff line number Diff line Loading @@ -751,10 +751,26 @@ start: goto relock; } } else { int enospc = 0; ssize_t ret2 = 0; write_retry: xfs_rw_enter_trace(XFS_WRITE_ENTER, xip, (void *)iovp, segs, *offset, ioflags); ret = generic_file_buffered_write(iocb, iovp, segs, ret2 = generic_file_buffered_write(iocb, iovp, segs, pos, offset, count, ret); /* * if we just got an ENOSPC, flush the inode now we * aren't holding any page locks and retry *once* */ if (ret2 == -ENOSPC && !enospc) { error = xfs_flush_pages(xip, 0, -1, 0, FI_NONE); if (error) goto out_unlock_internal; enospc = 1; goto write_retry; } ret = ret2; } current->backing_dev_info = NULL; Loading Loading
fs/xfs/linux-2.6/xfs_aops.c +21 −17 Original line number Diff line number Diff line Loading @@ -152,23 +152,6 @@ xfs_find_bdev_for_inode( return mp->m_ddev_targp->bt_bdev; } /* * Schedule IO completion handling on a xfsdatad if this was * the final hold on this ioend. If we are asked to wait, * flush the workqueue. */ STATIC void xfs_finish_ioend( xfs_ioend_t *ioend, int wait) { if (atomic_dec_and_test(&ioend->io_remaining)) { queue_work(xfsdatad_workqueue, &ioend->io_work); if (wait) flush_workqueue(xfsdatad_workqueue); } } /* * We're now finished for good with this ioend structure. * Update the page state via the associated buffer_heads, Loading Loading @@ -309,6 +292,27 @@ xfs_end_bio_read( xfs_destroy_ioend(ioend); } /* * Schedule IO completion handling on a xfsdatad if this was * the final hold on this ioend. If we are asked to wait, * flush the workqueue. */ STATIC void xfs_finish_ioend( xfs_ioend_t *ioend, int wait) { if (atomic_dec_and_test(&ioend->io_remaining)) { struct workqueue_struct *wq = xfsdatad_workqueue; if (ioend->io_work.func == xfs_end_bio_unwritten) wq = xfsconvertd_workqueue; queue_work(wq, &ioend->io_work); if (wait) flush_workqueue(wq); } } /* * Allocate and initialise an IO completion structure. * We need to track unwritten extent write completion here initially. Loading
fs/xfs/linux-2.6/xfs_aops.h +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define __XFS_AOPS_H__ extern struct workqueue_struct *xfsdatad_workqueue; extern struct workqueue_struct *xfsconvertd_workqueue; extern mempool_t *xfs_ioend_pool; /* Loading
fs/xfs/linux-2.6/xfs_buf.c +9 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ static struct shrinker xfs_buf_shake = { static struct workqueue_struct *xfslogd_workqueue; struct workqueue_struct *xfsdatad_workqueue; struct workqueue_struct *xfsconvertd_workqueue; #ifdef XFS_BUF_TRACE void Loading Loading @@ -1775,6 +1776,7 @@ xfs_flush_buftarg( xfs_buf_t *bp, *n; int pincount = 0; xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); Loading Loading @@ -1831,9 +1833,15 @@ xfs_buf_init(void) if (!xfsdatad_workqueue) goto out_destroy_xfslogd_workqueue; xfsconvertd_workqueue = create_workqueue("xfsconvertd"); if (!xfsconvertd_workqueue) goto out_destroy_xfsdatad_workqueue; register_shrinker(&xfs_buf_shake); return 0; out_destroy_xfsdatad_workqueue: destroy_workqueue(xfsdatad_workqueue); out_destroy_xfslogd_workqueue: destroy_workqueue(xfslogd_workqueue); out_free_buf_zone: Loading @@ -1849,6 +1857,7 @@ void xfs_buf_terminate(void) { unregister_shrinker(&xfs_buf_shake); destroy_workqueue(xfsconvertd_workqueue); destroy_workqueue(xfsdatad_workqueue); destroy_workqueue(xfslogd_workqueue); kmem_zone_destroy(xfs_buf_zone); Loading
fs/xfs/linux-2.6/xfs_fs_subr.c +7 −7 Original line number Diff line number Diff line Loading @@ -74,14 +74,14 @@ xfs_flush_pages( if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { xfs_iflags_clear(ip, XFS_ITRUNCATED); ret = filemap_fdatawrite(mapping); ret = -filemap_fdatawrite(mapping); } if (flags & XFS_B_ASYNC) return -ret; ret2 = filemap_fdatawait(mapping); return ret; ret2 = xfs_wait_on_pages(ip, first, last); if (!ret) ret = ret2; } return -ret; return ret; } int Loading
fs/xfs/linux-2.6/xfs_lrw.c +17 −1 Original line number Diff line number Diff line Loading @@ -751,10 +751,26 @@ start: goto relock; } } else { int enospc = 0; ssize_t ret2 = 0; write_retry: xfs_rw_enter_trace(XFS_WRITE_ENTER, xip, (void *)iovp, segs, *offset, ioflags); ret = generic_file_buffered_write(iocb, iovp, segs, ret2 = generic_file_buffered_write(iocb, iovp, segs, pos, offset, count, ret); /* * if we just got an ENOSPC, flush the inode now we * aren't holding any page locks and retry *once* */ if (ret2 == -ENOSPC && !enospc) { error = xfs_flush_pages(xip, 0, -1, 0, FI_NONE); if (error) goto out_unlock_internal; enospc = 1; goto write_retry; } ret = ret2; } current->backing_dev_info = NULL; Loading