[PATCH] alpha -- quota locking -- rfh

From: Craig Christophel (merlin@transgeek.com)
Date: Mon Feb 25 2002 - 20:19:43 EST


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_lock

lock_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


- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Feb 28 2002 - 21:00:21 EST