• Christoph Hellwig's avatar
    xfs: reset the i_iolock lock class in the reclaim path · 033da48f
    Christoph Hellwig authored
    The iolock is used for protecting reads, writes and block truncates
    against each other.  We have two classes of callers, the first one is
    induced by a file operation and requires a reference to the inode be
    held and not dropped after the operation is done:
    
     - xfs_vm_vmap, xfs_vn_fallocate, xfs_read, xfs_write, xfs_splice_read,
       xfs_splice_write and xfs_setattr are all implementations of VFS
       methods that require a live inode
     - xfs_getbmap and xfs_swap_extents are ioctl subcommand for which the
       same is true
     - xfs_truncate_file is only called on quota inodes just returned from
       xfs_iget
     - xfs_sync_inode_data does the lock just after an igrab()
     - xfs_filestream_associate and xfs_filestream_new_ag take the iolock
       on the parent inode of an inode which by VFS rules must be referenced
    
    And we have various calls to truncate blocks past EOF or the whole
    file when dropping the last reference to an inode.  Unfortunately
    lockdep complains when we do memory allocations that can recurse into
    the filesystem in the first class because the second class happens to
    take the same lock.  To avoid this re-init the iolock in the beginning
    of xfs_fs_clear_inode to get a new lock class.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
    Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
    033da48f
xfs_super.c 49.6 KB