Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
Pull XFS update (part 2) from Ben Myers: "Fixes for tracing of xfs_name strings, flag handling in open_by_handle, a log space hang with freeze/unfreeze, fstrim offset calculations, a section mismatch with xfs_qm_exit, an oops in xlog_recover_process_iunlinks, and a deadlock in xfs_rtfree_extent. There are also additional trace points for attributes, and the addition of a workqueue for allocation to work around kernel stack size limitations." * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: add lots of attribute trace points xfs: Fix oops on IO error during xlog_recover_process_iunlinks() xfs: fix fstrim offset calculations xfs: Account log unmount transaction correctly xfs: don't cache inodes read through bulkstat xfs: trace xfs_name strings correctly xfs: introduce an allocation workqueue xfs: Fix open flag handling in open_by_handle code xfs: fix deadlock in xfs_rtfree_extent fs: xfs: fix section mismatch in linux-next
This commit is contained in:
@@ -950,6 +950,22 @@ xfs_fs_evict_inode(
|
||||
xfs_inactive(ip);
|
||||
}
|
||||
|
||||
/*
|
||||
* We do an unlocked check for XFS_IDONTCACHE here because we are already
|
||||
* serialised against cache hits here via the inode->i_lock and igrab() in
|
||||
* xfs_iget_cache_hit(). Hence a lookup that might clear this flag will not be
|
||||
* racing with us, and it avoids needing to grab a spinlock here for every inode
|
||||
* we drop the final reference on.
|
||||
*/
|
||||
STATIC int
|
||||
xfs_fs_drop_inode(
|
||||
struct inode *inode)
|
||||
{
|
||||
struct xfs_inode *ip = XFS_I(inode);
|
||||
|
||||
return generic_drop_inode(inode) || (ip->i_flags & XFS_IDONTCACHE);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_free_fsname(
|
||||
struct xfs_mount *mp)
|
||||
@@ -1433,6 +1449,7 @@ static const struct super_operations xfs_super_operations = {
|
||||
.destroy_inode = xfs_fs_destroy_inode,
|
||||
.dirty_inode = xfs_fs_dirty_inode,
|
||||
.evict_inode = xfs_fs_evict_inode,
|
||||
.drop_inode = xfs_fs_drop_inode,
|
||||
.put_super = xfs_fs_put_super,
|
||||
.sync_fs = xfs_fs_sync_fs,
|
||||
.freeze_fs = xfs_fs_freeze,
|
||||
@@ -1606,12 +1623,28 @@ xfs_init_workqueues(void)
|
||||
xfs_syncd_wq = alloc_workqueue("xfssyncd", WQ_NON_REENTRANT, 0);
|
||||
if (!xfs_syncd_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* The allocation workqueue can be used in memory reclaim situations
|
||||
* (writepage path), and parallelism is only limited by the number of
|
||||
* AGs in all the filesystems mounted. Hence use the default large
|
||||
* max_active value for this workqueue.
|
||||
*/
|
||||
xfs_alloc_wq = alloc_workqueue("xfsalloc", WQ_MEM_RECLAIM, 0);
|
||||
if (!xfs_alloc_wq)
|
||||
goto out_destroy_syncd;
|
||||
|
||||
return 0;
|
||||
|
||||
out_destroy_syncd:
|
||||
destroy_workqueue(xfs_syncd_wq);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_destroy_workqueues(void)
|
||||
{
|
||||
destroy_workqueue(xfs_alloc_wq);
|
||||
destroy_workqueue(xfs_syncd_wq);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user