From: Lino Sanfilippo <LinoSanfilippo@gmx.de>
To: eparis@redhat.com
Cc: linux-fsdevel@vger.kernel.org, viro@ZenIV.linux.org.uk
Subject: [PATCH 0/9] fsnotify: change locking order
Date: Tue, 14 Jun 2011 17:29:44 +0200 [thread overview]
Message-ID: <1308065393-29463-1-git-send-email-LinoSanfilippo@gmx.de> (raw)
Hi Eric,
After the patch series "decouple mark lock and marks fsobject lock"
I sent on Feb. 21 this is another attempt to change the locking order
used in fsnotify from
mark->lock
group->mark_lock
inode/mnt->lock
to
group->mark_lock
mark->lock
inode/mnt->lock
The former series still contained some flaws:
1. inodes/mounts that have marks and are not pinned could dissappear while
another thread still wants to access a marks inode/mount (see https://lkml.org/lkml/2011/3/1/373)
2. in the new introduced function remove_mark_locked() a group could be freed
while the groups mark mutex is held
Both issues should be fixed with this series.
The reason for changing the locking order is, as you may remember, that there are
still some races when adding/removing marks to a group
(see also https://lkml.org/lkml/2010/11/30/189).
So what this series does is change the locking order (PATCH 4) to
group->mark_mutex
mark->lock
inode/mnt->lock
Beside this the group mark_lock is turned into a mutex (PATCH 6), which allows us to
call functions that may sleep while this lock is held.
At some places there is only a mark and no group available
(i.e. clear_marks_by_[inode|mount]()), so we first have to get the group from the mark
to use the group->mark_mutex (PATCH 7).
Since we cant get a group from a mark and use it without the danger that the group is
unregistered and freed, reference counting for groups is introduced and used
(PATCHES 1 to 3) for each mark that is added to the group.
With this freeing a group does not longer depend on the number of marks, but is
simply destroyed when the reference counter hits 0.
Since a group ref is now taken for each mark that is added to the group we first
have to explicitly call fsnotify_destroy_group() to remove all marks from the group
and release all group references held by those marks. This will also release the
- possibly final - ref of the group held by the caller (PATCH 1).
Furthermore we now can take the mark lock with the group mutex held so we dont need an
extra "clear list" any more if we clear all marks by group (PATCH 9).
For [add|remove]_mark() locked versions are introduced (PATCH 8) that can be
used if a caller already has the mark lock held. Thus we now have the possibility
to use the groups mark mutex to also synchronize addition/removal of a mark or to
replace the dnotify mutex.
This is not part of these patches. It would be the next step if these patches are
accepted to be merged.
This is against 2.6.39
next reply other threads:[~2011-06-14 15:32 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-14 15:29 Lino Sanfilippo [this message]
2011-06-14 15:29 ` [PATCH 1/9] inotify, fanotify: replace fsnotify_put_group() with fsnotify_destroy_group() Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 2/9] fsnotify: introduce fsnotify_get_group() Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 3/9] fsnotify: use reference counting for groups Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 4/9] fsnotify: take groups mark_lock before mark lock Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 5/9] fanotify: add an extra flag to mark_remove_from_mask that indicates wheather a mark should be destroyed Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 6/9] fsnotify: use a mutex instead of a spinlock to protect a groups mark list Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 7/9] fsnotify: pass group to fsnotify_destroy_mark() Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 8/9] fsnotify: introduce locked versions of fsnotify_add_mark() and fsnotify_remove_mark() Lino Sanfilippo
2011-06-14 15:29 ` [PATCH 9/9] fsnotify: dont put marks on temporary list when clearing marks by group Lino Sanfilippo
2011-08-01 20:38 ` [PATCH 0/9] fsnotify: change locking order Eric Paris
2011-08-11 23:13 ` Lino Sanfilippo
2012-03-20 18:49 ` Luis Henriques
2012-03-20 18:58 ` Eric Paris
2012-03-20 19:05 ` Luis Henriques
2012-03-22 22:14 ` Lino Sanfilippo
2012-03-26 11:27 ` Luis Henriques
2012-03-26 15:12 ` Eric Paris
2012-03-26 15:27 ` Luis Henriques
2012-03-26 22:51 ` Lino Sanfilippo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1308065393-29463-1-git-send-email-LinoSanfilippo@gmx.de \
--to=linosanfilippo@gmx.de \
--cc=eparis@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@ZenIV.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.