From: Jan Blunck <j.blunck@tu-harburg.de>
To: Alex Tomas <alex@clusterfs.com>
Cc: Alexander Viro <viro@parcelfarce.linux.theplanet.co.uk>,
Linux-Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>
Subject: Re: [RFC] pdirops: vfs patch
Date: Mon, 21 Feb 2005 00:35:52 +0100 [thread overview]
Message-ID: <42191ED8.8030303@tu-harburg.de> (raw)
In-Reply-To: <m3zmy02zq5.fsf@bzzz.home.net>
Alex Tomas wrote:
> +static inline struct semaphore * lock_sem(struct inode *dir, struct qstr *name)
> +{
> + if (IS_PDIROPS(dir)) {
> + struct super_block *sb;
> + /* name->hash expected to be already calculated */
> + sb = dir->i_sb;
> + BUG_ON(sb->s_pdirops_sems == NULL);
> + return sb->s_pdirops_sems + name->hash % sb->s_pdirops_size;
> + }
> + return &dir->i_sem;
> +}
> +
> +static inline void lock_dir(struct inode *dir, struct qstr *name)
> +{
> + down(lock_sem(dir, name));
> +}
> +
> @@ -1182,12 +1204,26 @@
> /*
> * p1 and p2 should be directories on the same fs.
> */
> -struct dentry *lock_rename(struct dentry *p1, struct dentry *p2)
> +struct dentry *lock_rename(struct dentry *p1, struct qstr *n1,
> + struct dentry *p2, struct qstr *n2)
> {
> struct dentry *p;
>
> if (p1 == p2) {
> - down(&p1->d_inode->i_sem);
> + if (IS_PDIROPS(p1->d_inode)) {
> + unsigned int h1, h2;
> + h1 = n1->hash % p1->d_inode->i_sb->s_pdirops_size;
> + h2 = n2->hash % p2->d_inode->i_sb->s_pdirops_size;
> + if (h1 < h2) {
> + lock_dir(p1->d_inode, n1);
> + lock_dir(p2->d_inode, n2);
> + } else if (h1 > h2) {
> + lock_dir(p2->d_inode, n2);
> + lock_dir(p1->d_inode, n1);
> + } else
> + lock_dir(p1->d_inode, n1);
> + } else
> + down(&p1->d_inode->i_sem);
> return NULL;
> }
>
> @@ -1195,31 +1231,35 @@
>
> for (p = p1; p->d_parent != p; p = p->d_parent) {
> if (p->d_parent == p2) {
> - down(&p2->d_inode->i_sem);
> - down(&p1->d_inode->i_sem);
> + lock_dir(p2->d_inode, n2);
> + lock_dir(p1->d_inode, n1);
> return p;
> }
> }
>
> for (p = p2; p->d_parent != p; p = p->d_parent) {
> if (p->d_parent == p1) {
> - down(&p1->d_inode->i_sem);
> - down(&p2->d_inode->i_sem);
> + lock_dir(p1->d_inode, n1);
> + lock_dir(p2->d_inode, n2);
> return p;
> }
> }
>
> - down(&p1->d_inode->i_sem);
> - down(&p2->d_inode->i_sem);
> + lock_dir(p1->d_inode, n1);
> + lock_dir(p2->d_inode, n2);
> return NULL;
> }
With luck you have s_pdirops_size (or 1024) different renames altering
concurrently one directory inode. Therefore you need a lock protecting
your filesystem data. This is basically the job done by i_sem. So in my
opinion you only move "The Problem" from the VFS to the lowlevel
filesystems. But then there is no need for i_sem or your s_pdirops_sems
anymore.
Regards,
Jan
next prev parent reply other threads:[~2005-02-20 23:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-02-19 17:57 [RFC] parallel directory operations Alex Tomas
2005-02-19 18:04 ` [RFC] pdirops: vfs patch Alex Tomas
2005-02-20 23:35 ` Jan Blunck [this message]
2005-02-20 23:43 ` Alex Tomas
2005-02-19 18:05 ` [RFC] pdirops: tmpfs patch Alex Tomas
-- strict thread matches above, loose matches on Subject: below --
2005-02-22 11:54 [RFC] pdirops: vfs patch Jan Blunck
2005-02-22 12:04 ` Alex Tomas
2005-02-22 13:00 ` Jan Blunck
2005-02-22 13:23 ` Alex Tomas
2005-02-22 13:41 ` Jan Blunck
2005-02-23 13:55 ` Alex Tomas
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=42191ED8.8030303@tu-harburg.de \
--to=j.blunck@tu-harburg.de \
--cc=alex@clusterfs.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@parcelfarce.linux.theplanet.co.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.