612
613static void nfs_file_clear_open_context(struct file *filp)
614{
615 struct inode *inode = filp->f_path.dentry->d_inode;
616 struct nfs_open_context *ctx = nfs_file_open_context(filp);
617
618 if (ctx) {
619 filp->private_data = NULL;
620 spin_lock(&inode->i_lock);
621 list_move_tail(&ctx->list, &NFS_I(inode)->open_files);
622 spin_unlock(&inode->i_lock);
623 put_nfs_open_context_sync(ctx);
624 }
625}
626
627
628
629
630int nfs_open(struct inode *inode, struct file *filp)
631{
632 struct nfs_open_context *ctx;
633 struct rpc_cred *cred;
634
635 cred = rpc_lookup_cred();
636 if (IS_ERR(cred))
637 return PTR_ERR(cred);
638 ctx = alloc_nfs_open_context(filp->f_path.mnt, filp->f_path.dentry, cred);
639 put_rpccred(cred);
640 if (ctx == NULL)
641 return -ENOMEM;
642 ctx->mode = filp->f_mode;
643 nfs_file_set_open_context(filp, ctx);
644 put_nfs_open_context(ctx);
645 return 0;
646}
647
648int nfs_release(struct inode *inode, struct file *filp)
649{
650 nfs_file_clear_open_context(filp);
651 return 0;
652}