Merge branch 'master' into pm-sleep
* master: (848 commits) SELinux: Fix RCU deref check warning in sel_netport_insert() binary_sysctl(): fix memory leak mm/vmalloc.c: remove static declaration of va from __get_vm_area_node ipmi_watchdog: restore settings when BMC reset oom: fix integer overflow of points in oom_badness memcg: keep root group unchanged if creation fails nilfs2: potential integer overflow in nilfs_ioctl_clean_segments() nilfs2: unbreak compat ioctl cpusets: stall when updating mems_allowed for mempolicy or disjoint nodemask evm: prevent racing during tfm allocation evm: key must be set once during initialization mmc: vub300: fix type of firmware_rom_wait_states module parameter Revert "mmc: enable runtime PM by default" mmc: sdhci: remove "state" argument from sdhci_suspend_host x86, dumpstack: Fix code bytes breakage due to missing KERN_CONT IB/qib: Correct sense on freectxts increment and decrement RDMA/cma: Verify private data length cgroups: fix a css_set not found bug in cgroup_attach_proc oprofile: Fix uninitialized memory access when writing to writing to oprofilefs Revert "xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel" ... Conflicts: kernel/cgroup_freezer.c
This commit is contained in:
@@ -39,6 +39,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
#include <linux/sunrpc/gss_api.h>
|
||||
@@ -895,6 +897,8 @@ out:
|
||||
|
||||
static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode)
|
||||
{
|
||||
if (delegation == NULL)
|
||||
return 0;
|
||||
if ((delegation->type & fmode) != fmode)
|
||||
return 0;
|
||||
if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
|
||||
@@ -1037,8 +1041,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
|
||||
}
|
||||
rcu_read_lock();
|
||||
delegation = rcu_dereference(nfsi->delegation);
|
||||
if (delegation == NULL ||
|
||||
!can_open_delegated(delegation, fmode)) {
|
||||
if (!can_open_delegated(delegation, fmode)) {
|
||||
rcu_read_unlock();
|
||||
break;
|
||||
}
|
||||
@@ -1092,7 +1095,12 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data
|
||||
if (delegation)
|
||||
delegation_flags = delegation->flags;
|
||||
rcu_read_unlock();
|
||||
if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
|
||||
if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) {
|
||||
pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
|
||||
"returning a delegation for "
|
||||
"OPEN(CLAIM_DELEGATE_CUR)\n",
|
||||
NFS_CLIENT(inode)->cl_server);
|
||||
} else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
|
||||
nfs_inode_set_delegation(state->inode,
|
||||
data->owner->so_cred,
|
||||
&data->o_res);
|
||||
@@ -1424,11 +1432,9 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
||||
goto out_no_action;
|
||||
rcu_read_lock();
|
||||
delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
|
||||
if (delegation != NULL &&
|
||||
test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) {
|
||||
rcu_read_unlock();
|
||||
goto out_no_action;
|
||||
}
|
||||
if (data->o_arg.claim != NFS4_OPEN_CLAIM_DELEGATE_CUR &&
|
||||
can_open_delegated(delegation, data->o_arg.fmode))
|
||||
goto unlock_no_action;
|
||||
rcu_read_unlock();
|
||||
}
|
||||
/* Update sequence id. */
|
||||
@@ -1445,6 +1451,8 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
||||
return;
|
||||
rpc_call_start(task);
|
||||
return;
|
||||
unlock_no_action:
|
||||
rcu_read_unlock();
|
||||
out_no_action:
|
||||
task->tk_action = NULL;
|
||||
|
||||
|
Reference in New Issue
Block a user