Ok,
I have changed the quota locking schematics. dquot_lock is now used to
protect all of the non-blocking operations. lock_kernel is reduced to
inode->i_blocks coverage. Be warned this patch is very alpha, but any extra
eyes on the source are very welcome.
here is the overview / development notes.
They spell out the path taken to protect the dquot sections.
shrink_dqcache_memory:
locks dquot_lock
calls prune_dqcache
unlocks dquot_lock
prune_dqcache:
unlocks dquot_lock
calls kmem_cache_free
locks dquot_lock
DQ_INIT:
takes dquot_lock
calls dquot_initialize
unlocks dquot_lock
DQ_DROP:
locks dquot_lock
calls dquot_drop
unlocks dquot_lock
DQUOT_PREALLOC_BLOCK_NODIRTY:
locks dquot_lock
calls dquot_alloc_block
unlocks dquot_lock
DQUOT_PREALLOC_BLOCK:
calls DQUOT_PREALLOC_BLOCK_NODIRTY
calls mark_inode_dirty
DQUOT_ALLOC_BLOCK_NODIRTY:
locks dquot_lock
calls dquot_alloc_block
unlocks dquot_lock
DQUOT_ALLOC_BLOCK:
calls DQUOT_ALLOC_BLOCK_NODIRTY
calls mark_inode_dirty
DQUOT_ALLOC_INODE:
locks dquot_lock
unlocks dquot_lock
calls DQUOT_INIT
locks dquot_lock
calls dquot_alloc_inode
unlocks dquot_lock
DQUOT_FREE_BLOCK_NODIRTY:
locks dquot_lock
calls dquot_free_block
unlocks dquot_lock
DQUOT_FREE_BLOCK:
calls DQUOT_FREE_BLOCK_NODIRY
calls mark_inode_dirty
DQUOT_FREE_INODE:
locks dquot_lock
calls dquot_free_inode
unlocks dquot_lock
DQUOT_TRANSFER:
locks dquot_lock
unlocks dquot_lock
calls DQUOT_INIT
locks dquot_lock
calls dquot_transfer
unlocks dquot_lock
sys_quotactl:
locks dquot_lock
calls quota_on
calls quota_off
calls get_quota
calls sync_dquots
calls get_stats
calls quota_root_squash
unlocks dquot_lock
quota_on:
unlocks dquot_lock
downs dqoff_sem
locks dquot_lock
calls dquot_drop
calls dqget
calls dqput
calls add_dquot_ref
unlocks dquot_lock
ups dqoff_sem
locks dquot_lock
quota_off:
unlocks dquot_lock
downs dqoff_sem
locks dquot_lock
calls remove_dquot_ref
calls invalidate_dquots
unlocks dquot_lock
ups dqoff_sem
locks dquot_lock
get_quota:
calls dqget
calls dqput
unlocks dquot_lock
calls copy_to_user
locks dquot_lock
synv_dquots:
unlocks dquot_lock
calls wait_on_dquot
locks dquot_lock
calls write_dquot
calls dqput
get_stats:
unlocks dquot_lock
calls copy_to_user
locks dquot_lock
quota_root_squash:
unlocks dquot_lock
calls copy_from_user
locks dquot_lock
invalidate_dquots:
unlocks dquot_lock
calls __wait_dquot_unused
locks dquot_lock
unlocks dquot_lock
calls kmem_cache_free
locks dquot_lock
add_dquot_ref:
unlocks dquot_lock
locks the file_list
unlocks the file_list
locks dquot_lock
calls dquot_initialize
calls dqput
unlocks dquot_lock
locks dquot_lock
dquot_drop:
calls dqput
remove_dquot_ref:
locks dquot_lock
calls remove_inode_dquot_ref
unlocks dquot_lock
calls put_dquot_list
remove_inode_dquot_ref:
calls dqput
put_dquot_list:
locks dquot_lock
calls dqput
unlocks dquot_lock
dquot_transfer:
calls dqget
calls dqduplicate
calls dquot_decr_inodes
calls dquot_incr_inodes
calls flush_warnings
calls dqput
dquot_free_inode:
calls dqduplicate
calls dquot_decr_inodes
calls dqput
dquot_free_block:
calls dqduplicate
calls dquot_decr_blocks
calls dqput
dquot_alloc_inode:
calls check_idq
calls dquot_incr_inodes
calls flush_warnings
calls dqput
dquot_alloc_block:
calls dqduplicate
calls check_bdq
calls dquot_incr_blocks
calls flush_warnings
flush_warnings:
calls print_warning
print_warning:
calls need_print_warning
unlocks dquot_lock
calls tty_write_message
locks dquot_lock
need_print_warning:
dquot_incr_blocks:
dquot_incr_inodes:
check_bdq:
dqduplicate:
dquot_drop:
calls dqput
dquot_initialize:
calls dqget
dqget:
unlocks dquot_lock
calls schedule
locks dquot_lock
calls read_dquot
---- unlocks dquot_lock calls wait_on_dquot calls dqput read_dquot: unlocks dquot_lock calls lock_dquot locks dqio_sem unlocks dqio_sem locks dquot_lock unlocks dquot_locklock_dquot: dqput: calls write_dquot unlocks dquot_lock calls wake_up on dq_wait_free locks dquot_lock write_dquot: unlocks dquot_lock downs dqio_sem locks dquot_lock unlocks dquot_lock ups dqio_sem locks dquot_lock
This archive was generated by hypermail 2b29 : Thu Feb 28 2002 - 21:00:21 EST