From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>,
linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Tyler Hicks <tyhicks@canonical.com>,
Dustin Kirkland <dustin.kirkland@gazzang.com>
Subject: Re: [RFC PATCH 12/13] locks: break delegations on link
Date: Thu, 6 Sep 2012 09:33:00 -0400 [thread overview]
Message-ID: <20120906133300.GA13054@fieldses.org> (raw)
In-Reply-To: <20120906070122.58c21013@corrin.poochiereds.net>
On Thu, Sep 06, 2012 at 07:01:22AM -0400, Jeff Layton wrote:
> On Wed, 5 Sep 2012 17:02:06 -0400
> "J. Bruce Fields" <bfields@fieldses.org> wrote:
>
> > Oops, I meant to cc this to Jeff:
> >
> > On Wed, Sep 05, 2012 at 04:55:22PM -0400, J. Bruce Fields wrote:
> > > @@ -3556,6 +3560,7 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
> > > if (error)
> > > return error;
> > >
> > > +retry_deleg:
> > > new_dentry = user_path_create(newdfd, newname, &new_path, 0);
> > > error = PTR_ERR(new_dentry);
> > > if (IS_ERR(new_dentry))
> > > @@ -3570,9 +3575,14 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
> > > error = security_path_link(old_path.dentry, &new_path, new_dentry);
> > > if (error)
> > > goto out_dput;
> > > - error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry);
> > > + error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode);
> > > out_dput:
> > > done_path_create(&new_path, new_dentry);
> > > + if (delegated_inode) {
> > > + error = break_deleg_wait(&delegated_inode);
> > > + if (!error)
> > > + goto retry_deleg;
> > > + }
> > > out:
> > > path_put(&old_path);
> > >
> >
> > I think this will get me into trouble with the audit code, right?
> >
> > (On a quick skim I think I'm retrying from a point after the getname()
> > in rename and unlink, so I think those are OK, but I may be missing
> > something....)
> >
> > --b.
> >
>
> tl;dr: this patch is OK, but the unlink and rename patches will be
> problematic.
>
> Longer explanation:
>
> The big problem is multiple calls into audit_inode_child(), which will
> give you duplicate audit records when you retry the call. That function
> mostly gets called from the fsnotify_* calls, but is also called from
> may_delete().
>
> In the create case (like this one), you're safe since we only call
> fsnotify_* after the create succeeds. In the may_delete() case, we have
> to call that function before the actual operation. A quick look at your
> patches looks like you'll end up with multiple calls into may_delete on
> a retry. That'll give you multiple audit records for each.
>
> The good news is that if and when my audit_names overhaul patches go
> in, that problem should go away. At that point audit_inode_child() will
> know how to update existing records instead of creating new ones in
> this case. I'm hoping those will go in for 3.7, so you may just want to
> try to ensure that these patches go in after those.
OK, thanks for the explanation, I'll keep an eye on the audit_names
overhaul.
--b.
>
> > > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> > > index c8f5e74..2a77b28 100644
> > > --- a/fs/nfsd/vfs.c
> > > +++ b/fs/nfsd/vfs.c
> > > @@ -1717,7 +1717,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
> > > err = nfserrno(host_err);
> > > goto out_dput;
> > > }
> > > - host_err = vfs_link(dold, dirp, dnew);
> > > + host_err = vfs_link(dold, dirp, dnew, NULL);
> > > if (!host_err) {
> > > err = nfserrno(commit_metadata(ffhp));
> > > if (!err)
> > > diff --git a/include/linux/fs.h b/include/linux/fs.h
> > > index ad9df65e..52b8c67 100644
> > > --- a/include/linux/fs.h
> > > +++ b/include/linux/fs.h
> > > @@ -1721,7 +1721,7 @@ extern int vfs_create(struct inode *, struct dentry *, umode_t, bool);
> > > extern int vfs_mkdir(struct inode *, struct dentry *, umode_t);
> > > extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
> > > extern int vfs_symlink(struct inode *, struct dentry *, const char *);
> > > -extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
> > > +extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **);
> > > extern int vfs_rmdir(struct inode *, struct dentry *);
> > > extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
> > > extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **);
> > > --
> > > 1.7.9.5
> > >
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> > > the body of a message to majordomo@vger.kernel.org
> > > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
> --
> Jeff Layton <jlayton@redhat.com>
WARNING: multiple messages have this Message-ID (diff)
From: "J. Bruce Fields" <bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
To: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Al Viro <viro-RmSDqhL/yNMiFSDQTTA3OLVCufUGDwFn@public.gmane.org>,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Tyler Hicks <tyhicks-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>,
Dustin Kirkland
<dustin.kirkland-Bv2LyzZ6GzxBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [RFC PATCH 12/13] locks: break delegations on link
Date: Thu, 6 Sep 2012 09:33:00 -0400 [thread overview]
Message-ID: <20120906133300.GA13054@fieldses.org> (raw)
In-Reply-To: <20120906070122.58c21013-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
On Thu, Sep 06, 2012 at 07:01:22AM -0400, Jeff Layton wrote:
> On Wed, 5 Sep 2012 17:02:06 -0400
> "J. Bruce Fields" <bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org> wrote:
>
> > Oops, I meant to cc this to Jeff:
> >
> > On Wed, Sep 05, 2012 at 04:55:22PM -0400, J. Bruce Fields wrote:
> > > @@ -3556,6 +3560,7 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
> > > if (error)
> > > return error;
> > >
> > > +retry_deleg:
> > > new_dentry = user_path_create(newdfd, newname, &new_path, 0);
> > > error = PTR_ERR(new_dentry);
> > > if (IS_ERR(new_dentry))
> > > @@ -3570,9 +3575,14 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
> > > error = security_path_link(old_path.dentry, &new_path, new_dentry);
> > > if (error)
> > > goto out_dput;
> > > - error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry);
> > > + error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode);
> > > out_dput:
> > > done_path_create(&new_path, new_dentry);
> > > + if (delegated_inode) {
> > > + error = break_deleg_wait(&delegated_inode);
> > > + if (!error)
> > > + goto retry_deleg;
> > > + }
> > > out:
> > > path_put(&old_path);
> > >
> >
> > I think this will get me into trouble with the audit code, right?
> >
> > (On a quick skim I think I'm retrying from a point after the getname()
> > in rename and unlink, so I think those are OK, but I may be missing
> > something....)
> >
> > --b.
> >
>
> tl;dr: this patch is OK, but the unlink and rename patches will be
> problematic.
>
> Longer explanation:
>
> The big problem is multiple calls into audit_inode_child(), which will
> give you duplicate audit records when you retry the call. That function
> mostly gets called from the fsnotify_* calls, but is also called from
> may_delete().
>
> In the create case (like this one), you're safe since we only call
> fsnotify_* after the create succeeds. In the may_delete() case, we have
> to call that function before the actual operation. A quick look at your
> patches looks like you'll end up with multiple calls into may_delete on
> a retry. That'll give you multiple audit records for each.
>
> The good news is that if and when my audit_names overhaul patches go
> in, that problem should go away. At that point audit_inode_child() will
> know how to update existing records instead of creating new ones in
> this case. I'm hoping those will go in for 3.7, so you may just want to
> try to ensure that these patches go in after those.
OK, thanks for the explanation, I'll keep an eye on the audit_names
overhaul.
--b.
>
> > > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> > > index c8f5e74..2a77b28 100644
> > > --- a/fs/nfsd/vfs.c
> > > +++ b/fs/nfsd/vfs.c
> > > @@ -1717,7 +1717,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
> > > err = nfserrno(host_err);
> > > goto out_dput;
> > > }
> > > - host_err = vfs_link(dold, dirp, dnew);
> > > + host_err = vfs_link(dold, dirp, dnew, NULL);
> > > if (!host_err) {
> > > err = nfserrno(commit_metadata(ffhp));
> > > if (!err)
> > > diff --git a/include/linux/fs.h b/include/linux/fs.h
> > > index ad9df65e..52b8c67 100644
> > > --- a/include/linux/fs.h
> > > +++ b/include/linux/fs.h
> > > @@ -1721,7 +1721,7 @@ extern int vfs_create(struct inode *, struct dentry *, umode_t, bool);
> > > extern int vfs_mkdir(struct inode *, struct dentry *, umode_t);
> > > extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
> > > extern int vfs_symlink(struct inode *, struct dentry *, const char *);
> > > -extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
> > > +extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **);
> > > extern int vfs_rmdir(struct inode *, struct dentry *);
> > > extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
> > > extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **);
> > > --
> > > 1.7.9.5
> > >
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> > > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> > > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
> --
> Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-09-06 13:33 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-05 20:55 [RFC PATCH 00/13] Implement NFSv4 delegations, take 4 J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 01/13] gfs2: Get rid of I_MUTEX_QUOTA usage J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-05 20:59 ` J. Bruce Fields
2012-09-05 20:59 ` J. Bruce Fields
2012-09-06 14:27 ` Steven Whitehouse
2012-09-06 14:27 ` Steven Whitehouse
2012-09-06 17:08 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 02/13] vfs: pull ext4's double-i_mutex-locking into common code J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-06 2:53 ` Guo Chao
2012-09-06 13:49 ` J. Bruce Fields
2012-09-06 13:49 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 03/13] vfs: don't use PARENT/CHILD lock classes for non-directories J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 04/13] vfs: rename I_MUTEX_QUOTA now that it's not used for quotas J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 05/13] vfs: take i_mutex on renamed file J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-06 3:05 ` Guo Chao
2012-09-06 3:05 ` Guo Chao
2012-09-06 17:51 ` J. Bruce Fields
2012-09-06 17:51 ` J. Bruce Fields
2012-09-07 2:27 ` Guo Chao
2012-09-07 2:27 ` Guo Chao
2012-09-07 21:39 ` J. Bruce Fields
2012-09-07 21:39 ` J. Bruce Fields
2012-09-10 2:40 ` Guo Chao
2012-09-10 2:40 ` Guo Chao
2012-09-10 5:10 ` Ram Pai
2012-09-10 5:10 ` Ram Pai
2012-09-10 6:37 ` Guo Chao
2012-09-10 6:37 ` Guo Chao
2012-09-10 7:27 ` Ram Pai
2013-02-14 2:01 ` Al Viro
2012-09-10 14:35 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 06/13] locks: introduce new FL_DELEG lock flag J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 07/13] locks: implement delegations J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 08/13] namei: minor vfs_unlink cleanup J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 09/13] locks: break delegations on unlink J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 10/13] locks: helper functions for delegation breaking J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 11/13] locks: break delegations on rename J. Bruce Fields
2012-09-05 20:55 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 12/13] locks: break delegations on link J. Bruce Fields
2012-09-05 21:02 ` J. Bruce Fields
2012-09-06 11:01 ` Jeff Layton
2012-09-06 13:33 ` J. Bruce Fields [this message]
2012-09-06 13:33 ` J. Bruce Fields
2012-09-05 20:55 ` [RFC PATCH 13/13] locks: break delegations on any attribute modification J. Bruce Fields
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=20120906133300.GA13054@fieldses.org \
--to=bfields@fieldses.org \
--cc=dustin.kirkland@gazzang.com \
--cc=jlayton@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=tyhicks@canonical.com \
--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.