|
@@ -1354,10 +1354,10 @@ out:
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_NFS_V4
|
|
|
-static int nfs_open_revalidate(struct dentry *, struct nameidata *);
|
|
|
+static int nfs4_lookup_revalidate(struct dentry *, struct nameidata *);
|
|
|
|
|
|
const struct dentry_operations nfs4_dentry_operations = {
|
|
|
- .d_revalidate = nfs_open_revalidate,
|
|
|
+ .d_revalidate = nfs4_lookup_revalidate,
|
|
|
.d_delete = nfs_dentry_delete,
|
|
|
.d_iput = nfs_dentry_iput,
|
|
|
.d_automount = nfs_d_automount,
|
|
@@ -1519,13 +1519,11 @@ no_open:
|
|
|
return nfs_lookup(dir, dentry, nd);
|
|
|
}
|
|
|
|
|
|
-static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
|
|
|
+static int nfs4_lookup_revalidate(struct dentry *dentry, struct nameidata *nd)
|
|
|
{
|
|
|
struct dentry *parent = NULL;
|
|
|
struct inode *inode;
|
|
|
struct inode *dir;
|
|
|
- struct nfs_open_context *ctx;
|
|
|
- struct iattr attr;
|
|
|
int openflags, ret = 0;
|
|
|
|
|
|
if (nd->flags & LOOKUP_RCU)
|
|
@@ -1554,57 +1552,13 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
|
|
|
/* We cannot do exclusive creation on a positive dentry */
|
|
|
if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
|
|
|
goto no_open_dput;
|
|
|
- /* We can't create new files here */
|
|
|
- openflags &= ~(O_CREAT|O_EXCL);
|
|
|
-
|
|
|
- ctx = create_nfs_open_context(dentry, openflags);
|
|
|
- ret = PTR_ERR(ctx);
|
|
|
- if (IS_ERR(ctx))
|
|
|
- goto out;
|
|
|
|
|
|
- attr.ia_valid = ATTR_OPEN;
|
|
|
- if (openflags & O_TRUNC) {
|
|
|
- attr.ia_valid |= ATTR_SIZE;
|
|
|
- attr.ia_size = 0;
|
|
|
- nfs_wb_all(inode);
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Note: we're not holding inode->i_mutex and so may be racing with
|
|
|
- * operations that change the directory. We therefore save the
|
|
|
- * change attribute *before* we do the RPC call.
|
|
|
- */
|
|
|
- inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, &attr);
|
|
|
- if (IS_ERR(inode)) {
|
|
|
- ret = PTR_ERR(inode);
|
|
|
- switch (ret) {
|
|
|
- case -EPERM:
|
|
|
- case -EACCES:
|
|
|
- case -EDQUOT:
|
|
|
- case -ENOSPC:
|
|
|
- case -EROFS:
|
|
|
- goto out_put_ctx;
|
|
|
- default:
|
|
|
- goto out_drop;
|
|
|
- }
|
|
|
- }
|
|
|
- iput(inode);
|
|
|
- if (inode != dentry->d_inode)
|
|
|
- goto out_drop;
|
|
|
+ /* Let f_op->open() actually open (and revalidate) the file */
|
|
|
+ ret = 1;
|
|
|
|
|
|
- nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
|
|
- ret = nfs_intent_set_file(nd, ctx);
|
|
|
- if (ret >= 0)
|
|
|
- ret = 1;
|
|
|
out:
|
|
|
dput(parent);
|
|
|
return ret;
|
|
|
-out_drop:
|
|
|
- d_drop(dentry);
|
|
|
- ret = 0;
|
|
|
-out_put_ctx:
|
|
|
- put_nfs_open_context(ctx);
|
|
|
- goto out;
|
|
|
|
|
|
no_open_dput:
|
|
|
dput(parent);
|