diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-08-28 10:50:40 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-11-09 00:16:42 -0500 |
commit | 5a14696c1795d3843673b5cf1982d0e5357a5bbf (patch) | |
tree | 8d0ec4f82f90fc5f3e50cfc8cdd78ee7a4fb2263 /fs/namei.c | |
parent | b21996e36c8e3b92a84e972378bde80b43acd890 (diff) |
locks: helper functions for delegation breaking
We'll need the same logic for rename and link.
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/fs/namei.c b/fs/namei.c index 67ce331a3ed8..cfaeaae0f2db 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -3650,14 +3650,9 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegate | |||
3650 | else { | 3650 | else { |
3651 | error = security_inode_unlink(dir, dentry); | 3651 | error = security_inode_unlink(dir, dentry); |
3652 | if (!error) { | 3652 | if (!error) { |
3653 | error = break_deleg(target, O_WRONLY|O_NONBLOCK); | 3653 | error = try_break_deleg(target, delegated_inode); |
3654 | if (error) { | 3654 | if (error) |
3655 | if (error == -EWOULDBLOCK && delegated_inode) { | ||
3656 | *delegated_inode = target; | ||
3657 | ihold(target); | ||
3658 | } | ||
3659 | goto out; | 3655 | goto out; |
3660 | } | ||
3661 | error = dir->i_op->unlink(dir, dentry); | 3656 | error = dir->i_op->unlink(dir, dentry); |
3662 | if (!error) | 3657 | if (!error) |
3663 | dont_mount(dentry); | 3658 | dont_mount(dentry); |
@@ -3727,9 +3722,7 @@ exit2: | |||
3727 | iput(inode); /* truncate the inode here */ | 3722 | iput(inode); /* truncate the inode here */ |
3728 | inode = NULL; | 3723 | inode = NULL; |
3729 | if (delegated_inode) { | 3724 | if (delegated_inode) { |
3730 | error = break_deleg(delegated_inode, O_WRONLY); | 3725 | error = break_deleg_wait(&delegated_inode); |
3731 | iput(delegated_inode); | ||
3732 | delegated_inode = NULL; | ||
3733 | if (!error) | 3726 | if (!error) |
3734 | goto retry_deleg; | 3727 | goto retry_deleg; |
3735 | } | 3728 | } |