diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-08-28 07:50:40 -0700 |
---|---|---|
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) | |
download | linux-5a14696c1795d3843673b5cf1982d0e5357a5bbf.tar.gz linux-5a14696c1795d3843673b5cf1982d0e5357a5bbf.tar.bz2 linux-5a14696c1795d3843673b5cf1982d0e5357a5bbf.zip |
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 else { error = security_inode_unlink(dir, dentry); if (!error) { - error = break_deleg(target, O_WRONLY|O_NONBLOCK); - if (error) { - if (error == -EWOULDBLOCK && delegated_inode) { - *delegated_inode = target; - ihold(target); - } + error = try_break_deleg(target, delegated_inode); + if (error) goto out; - } error = dir->i_op->unlink(dir, dentry); if (!error) dont_mount(dentry); @@ -3727,9 +3722,7 @@ exit2: iput(inode); /* truncate the inode here */ inode = NULL; if (delegated_inode) { - error = break_deleg(delegated_inode, O_WRONLY); - iput(delegated_inode); - delegated_inode = NULL; + error = break_deleg_wait(&delegated_inode); if (!error) goto retry_deleg; } |