public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Kirill Korotaev <dev@sw.ru>
To: Andrew Morton <akpm@osdl.org>
Cc: torvalds@osdl.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Fix of dcache race leading to busy inodes on umount
Date: Thu, 12 May 2005 14:25:55 +0400	[thread overview]
Message-ID: <42832F33.1020709@sw.ru> (raw)
In-Reply-To: <20050511193352.2c9a9201.akpm@osdl.org>

> Kirill Korotaev <dev@sw.ru> wrote:
> 
>>This patch fixes dcache race between shrink_dcache_XXX functions
>>and dput().
>>
>>Example race scenario:
>>
>>	CPU 0				CPU 1
>>umount /dev/sda1
>>generic_shutdown_super          shrink_dcache_memory()
>>shrink_dcache_parent            dput dentry
>>select_parent                   prune_one_dentry()
>>                                 <<<< child is dead, locks are released,
>>                                   but parent is still referenced!!! >>>>
>>
>>skip dentry->parent,
>>since it's d_count > 0
>>
>>message: BUSY inodes after umount...
>>                                 <<< parent is left on dentry_unused
>>				   list, referencing freed super block
>>
>>We faced these messages about busy inodes constantly after some stress 
>>testing with mount/umount operations parrallel with some other activity.
>>This patch helped the problem.
>>
>>The patch was heavilly tested on 2.6.8 during 2 months,
>>this forward-ported version boots and works ok as well.
>>
> 
> 
> You've provided no description of how the patch solves the problem.
below

>>/* dcache_lock protects shrinker's list */
>>static void shrink_dcache_racecheck(struct dentry *parent, int *racecheck)
>>{
>>	struct super_block *sb;
>>	struct dcache_shrinker *ds;
>>
>>	sb = parent->d_sb;
>>	list_for_each_entry(ds, &sb->s_dshrinkers, list) {
>>		/* is one of dcache shrinkers working on the dentry? */
>>		if (ds->dentry == parent) {
>>			*racecheck = 1;
>>			break;
>>		}
>>	}
>>}
>>
>>
> 
> 
> This all looks awfully hacky.  Why is it done this way, and is there no
> cleaner solution?

Additional patch info:

This patch solves the race mentioned above via introducing per super 
block list of dentries which are being held indirectly by it's child 
which is going away. This usually happens when a child is dput()'ed last 
time and is holding it's parent reference though it is not in any lists 
already and can't be found anywhere. To make sure that 
shrink_dcache_parent() can't shrink dcache tree because of a real 
reference and not such indirect one we check a race condition by looking 
through dcache_shrinker list. If the current dentry is found on 
dcache_shrinker list than it is being referenced indirectly as described 
above and should be waited for, otherwise we really can't shrink the tree.

Why is it so hacky? We tried to develop a solution which minimally 
influences perfomance, not slowdowning a fast path and not introducing 
lock contention via widening existing locks. I'll be happy if someone 
fixes it more efficiently.

Kirill


      reply	other threads:[~2005-05-12 10:26 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-11 15:52 [PATCH] Fix of dcache race leading to busy inodes on umount Kirill Korotaev
2005-05-12  2:29 ` Andrew Morton
2005-05-12  8:31   ` Kirill Korotaev
2005-05-12  2:33 ` Andrew Morton
2005-05-12 10:25   ` Kirill Korotaev [this message]

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=42832F33.1020709@sw.ru \
    --to=dev@sw.ru \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox