nfs4proc.c (f15e1e8bc6427e4a0d38290937ccbfec1d1a2c44) nfs4proc.c (b68572e07c58324cb8c274f1d84a20cad479c2d3)
1/*
2 * fs/nfs/nfs4proc.c
3 *
4 * Client-side procedure declarations for NFSv4.
5 *
6 * Copyright (c) 2002 The Regents of the University of Michigan.
7 * All rights reserved.
8 *

--- 1758 unchanged lines hidden (view full) ---

1767 rcu_read_unlock();
1768 break;
1769 }
1770 /* Save the delegation */
1771 nfs4_stateid_copy(&stateid, &delegation->stateid);
1772 rcu_read_unlock();
1773 nfs_release_seqid(opendata->o_arg.seqid);
1774 if (!opendata->is_recover) {
1/*
2 * fs/nfs/nfs4proc.c
3 *
4 * Client-side procedure declarations for NFSv4.
5 *
6 * Copyright (c) 2002 The Regents of the University of Michigan.
7 * All rights reserved.
8 *

--- 1758 unchanged lines hidden (view full) ---

1767 rcu_read_unlock();
1768 break;
1769 }
1770 /* Save the delegation */
1771 nfs4_stateid_copy(&stateid, &delegation->stateid);
1772 rcu_read_unlock();
1773 nfs_release_seqid(opendata->o_arg.seqid);
1774 if (!opendata->is_recover) {
1775 ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
1775 ret = nfs_may_open(state->inode, state->owner->so_cred->cr_cred, open_mode);
1776 if (ret != 0)
1777 goto out;
1778 }
1779 ret = -EAGAIN;
1780
1781 /* Try to update the stateid using the delegation */
1782 if (update_open_stateid(state, NULL, &stateid, fmode))
1783 goto out_return_state;

--- 722 unchanged lines hidden (view full) ---

2506 /* ONLY check for exec rights */
2507 if (S_ISDIR(state->inode->i_mode))
2508 mask = NFS4_ACCESS_LOOKUP;
2509 else
2510 mask = NFS4_ACCESS_EXECUTE;
2511 } else if ((fmode & FMODE_READ) && !opendata->file_created)
2512 mask = NFS4_ACCESS_READ;
2513
1776 if (ret != 0)
1777 goto out;
1778 }
1779 ret = -EAGAIN;
1780
1781 /* Try to update the stateid using the delegation */
1782 if (update_open_stateid(state, NULL, &stateid, fmode))
1783 goto out_return_state;

--- 722 unchanged lines hidden (view full) ---

2506 /* ONLY check for exec rights */
2507 if (S_ISDIR(state->inode->i_mode))
2508 mask = NFS4_ACCESS_LOOKUP;
2509 else
2510 mask = NFS4_ACCESS_EXECUTE;
2511 } else if ((fmode & FMODE_READ) && !opendata->file_created)
2512 mask = NFS4_ACCESS_READ;
2513
2514 cache.cred = cred;
2514 cache.cred = cred->cr_cred;
2515 nfs_access_set_mask(&cache, opendata->o_res.access_result);
2516 nfs_access_add_cache(state->inode, &cache);
2517
2518 flags = NFS4_ACCESS_READ | NFS4_ACCESS_EXECUTE | NFS4_ACCESS_LOOKUP;
2519 if ((mask & ~cache.mask & flags) == 0)
2520 return 0;
2521
2522 return -EACCES;

--- 1660 unchanged lines hidden (view full) ---

4183 struct nfs_server *server = NFS_SERVER(inode);
4184 struct nfs4_accessargs args = {
4185 .fh = NFS_FH(inode),
4186 .access = entry->mask,
4187 };
4188 struct nfs4_accessres res = {
4189 .server = server,
4190 };
2515 nfs_access_set_mask(&cache, opendata->o_res.access_result);
2516 nfs_access_add_cache(state->inode, &cache);
2517
2518 flags = NFS4_ACCESS_READ | NFS4_ACCESS_EXECUTE | NFS4_ACCESS_LOOKUP;
2519 if ((mask & ~cache.mask & flags) == 0)
2520 return 0;
2521
2522 return -EACCES;

--- 1660 unchanged lines hidden (view full) ---

4183 struct nfs_server *server = NFS_SERVER(inode);
4184 struct nfs4_accessargs args = {
4185 .fh = NFS_FH(inode),
4186 .access = entry->mask,
4187 };
4188 struct nfs4_accessres res = {
4189 .server = server,
4190 };
4191 struct auth_cred acred = {
4192 .cred = entry->cred,
4193 };
4191 struct rpc_message msg = {
4192 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
4193 .rpc_argp = &args,
4194 .rpc_resp = &res,
4194 struct rpc_message msg = {
4195 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
4196 .rpc_argp = &args,
4197 .rpc_resp = &res,
4195 .rpc_cred = entry->cred,
4198 .rpc_cred = rpc_lookup_generic_cred(&acred, 0, GFP_NOFS),
4196 };
4197 int status = 0;
4198
4199 };
4200 int status = 0;
4201
4202 if (!msg.rpc_cred)
4203 return -ENOMEM;
4199 if (!nfs4_have_delegation(inode, FMODE_READ)) {
4200 res.fattr = nfs_alloc_fattr();
4204 if (!nfs4_have_delegation(inode, FMODE_READ)) {
4205 res.fattr = nfs_alloc_fattr();
4201 if (res.fattr == NULL)
4206 if (res.fattr == NULL) {
4207 put_rpccred(msg.rpc_cred);
4202 return -ENOMEM;
4208 return -ENOMEM;
4209 }
4203 args.bitmask = server->cache_consistency_bitmask;
4204 }
4205
4206 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4207 if (!status) {
4208 nfs_access_set_mask(entry, res.access);
4209 if (res.fattr)
4210 nfs_refresh_inode(inode, res.fattr);
4211 }
4212 nfs_free_fattr(res.fattr);
4210 args.bitmask = server->cache_consistency_bitmask;
4211 }
4212
4213 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4214 if (!status) {
4215 nfs_access_set_mask(entry, res.access);
4216 if (res.fattr)
4217 nfs_refresh_inode(inode, res.fattr);
4218 }
4219 nfs_free_fattr(res.fattr);
4220 put_rpccred(msg.rpc_cred);
4213 return status;
4214}
4215
4216static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
4217{
4218 struct nfs4_exception exception = { };
4219 int err;
4220 do {

--- 5620 unchanged lines hidden ---
4221 return status;
4222}
4223
4224static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
4225{
4226 struct nfs4_exception exception = { };
4227 int err;
4228 do {

--- 5620 unchanged lines hidden ---