Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=34f308960818e514fadd9365cb5b14cca319320b
Commit:     34f308960818e514fadd9365cb5b14cca319320b
Parent:     6e84c7b66a0aa0be16a7728d1e687c57978dac2c
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Thu Jun 7 18:28:02 2007 -0400
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 23:40:32 2007 -0400

    SUNRPC: Enable non-exclusive create in rpc_mkpipe()
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 net/sunrpc/rpc_pipe.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 2320f1e..ebcb805 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -621,7 +621,7 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)
 }
 
 static struct dentry *
-rpc_lookup_create(struct dentry *parent, const char *name, int len)
+rpc_lookup_create(struct dentry *parent, const char *name, int len, int 
exclusive)
 {
        struct inode *dir = parent->d_inode;
        struct dentry *dentry;
@@ -630,7 +630,7 @@ rpc_lookup_create(struct dentry *parent, const char *name, 
int len)
        dentry = lookup_one_len(name, parent, len);
        if (IS_ERR(dentry))
                goto out_err;
-       if (dentry->d_inode) {
+       if (dentry->d_inode && exclusive) {
                dput(dentry);
                dentry = ERR_PTR(-EEXIST);
                goto out_err;
@@ -649,7 +649,7 @@ rpc_lookup_negative(char *path, struct nameidata *nd)
 
        if ((error = rpc_lookup_parent(path, nd)) != 0)
                return ERR_PTR(error);
-       dentry = rpc_lookup_create(nd->dentry, nd->last.name, nd->last.len);
+       dentry = rpc_lookup_create(nd->dentry, nd->last.name, nd->last.len, 1);
        if (IS_ERR(dentry))
                rpc_release_path(nd);
        return dentry;
@@ -716,10 +716,20 @@ rpc_mkpipe(struct dentry *parent, const char *name, void 
*private, struct rpc_pi
        struct inode *dir, *inode;
        struct rpc_inode *rpci;
 
-       dentry = rpc_lookup_create(parent, name, strlen(name));
+       dentry = rpc_lookup_create(parent, name, strlen(name), 0);
        if (IS_ERR(dentry))
                return dentry;
        dir = parent->d_inode;
+       if (dentry->d_inode) {
+               rpci = RPC_I(dentry->d_inode);
+               if (rpci->private != private ||
+                               rpci->ops != ops ||
+                               rpci->flags != flags) {
+                       dput (dentry);
+                       dentry = ERR_PTR(-EBUSY);
+               }
+               goto out;
+       }
        inode = rpc_get_inode(dir->i_sb, S_IFIFO | S_IRUSR | S_IWUSR);
        if (!inode)
                goto err_dput;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to