2002-02-26 01:19:34

by Craig Christophel

[permalink] [raw]
Subject: [PATCH] alpha -- quota locking -- rfh

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


Attachments:
quotalock.diff (16.51 kB)

2002-02-26 01:36:43

by Alexander Viro

[permalink] [raw]
Subject: Re: [PATCH] alpha -- quota locking -- rfh



On Mon, 25 Feb 2002, Craig Christophel wrote:

> 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.

Sigh... I guess I'm to blame here - I should've warned you when you had sent
the first mail. My apologies. Situation with quota:

* variant in the tree is obsolete and needs resync with Jan (quota
maintainer)
* threading old (== in-tree) quota is counterproductive - it will need
to be done from scratch after merge _and_ it will only make merge harder.
* said merge ( basically, split of delta into edible pieces and
feeding them to Linus) won't be trivial - patch is large.
* if you are willing to do that - great, coordinate this stuff with
Jan and go ahead. I'd be glad to help if there are any troubles.