mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'nfs-for-4.15-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
Pull NFS client updates from Anna Schumaker:
"Stable bugfixes:
- Revalidate "." and ".." correctly on open
- Avoid RCU usage in tracepoints
- Fix ugly referral attributes
- Fix a typo in nomigration mount option
- Revert "NFS: Move the flock open mode check into nfs_flock()"
Features:
- Implement a stronger send queue accounting system for NFS over RDMA
- Switch some atomics to the new refcount_t type
Other bugfixes and cleanups:
- Clean up access mode bits
- Remove special-case revalidations in nfs_opendir()
- Improve invalidating NFS over RDMA memory for async operations that
time out
- Handle NFS over RDMA replies with a worqueue
- Handle NFS over RDMA sends with a workqueue
- Fix up replaying interrupted requests
- Remove dead NFS over RDMA definitions
- Update NFS over RDMA copyright information
- Be more consistent with bool initialization and comparisons
- Mark expected switch fall throughs
- Various sunrpc tracepoint cleanups
- Fix various OPEN races
- Fix a typo in nfs_rename()
- Use common error handling code in nfs_lock_and_join_request()
- Check that some structures are properly cleaned up during
net_exit()
- Remove net pointer from dprintk()s"
* tag 'nfs-for-4.15-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (62 commits)
NFS: Revert "NFS: Move the flock open mode check into nfs_flock()"
NFS: Fix typo in nomigration mount option
nfs: Fix ugly referral attributes
NFS: super: mark expected switch fall-throughs
sunrpc: remove net pointer from messages
nfs: remove net pointer from messages
sunrpc: exit_net cleanup check added
nfs client: exit_net cleanup check added
nfs/write: Use common error handling code in nfs_lock_and_join_requests()
NFSv4: Replace closed stateids with the "invalid special stateid"
NFSv4: nfs_set_open_stateid must not trigger state recovery for closed state
NFSv4: Check the open stateid when searching for expired state
NFSv4: Clean up nfs4_delegreturn_done
NFSv4: cleanup nfs4_close_done
NFSv4: Retry NFS4ERR_OLD_STATEID errors in layoutreturn
pNFS: Retry NFS4ERR_OLD_STATEID errors in layoutreturn-on-close
NFSv4: Don't try to CLOSE if the stateid 'other' field has changed
NFSv4: Retry CLOSE and DELEGRETURN on NFS4ERR_OLD_STATEID.
NFS: Fix a typo in nfs_rename()
NFSv4: Fix open create exclusive when the server reboots
...
This commit is contained in:
@@ -67,7 +67,7 @@ out:
|
||||
*/
|
||||
void nfs_cache_defer_req_put(struct nfs_cache_defer_req *dreq)
|
||||
{
|
||||
if (atomic_dec_and_test(&dreq->count))
|
||||
if (refcount_dec_and_test(&dreq->count))
|
||||
kfree(dreq);
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ static struct cache_deferred_req *nfs_dns_cache_defer(struct cache_req *req)
|
||||
|
||||
dreq = container_of(req, struct nfs_cache_defer_req, req);
|
||||
dreq->deferred_req.revisit = nfs_dns_cache_revisit;
|
||||
atomic_inc(&dreq->count);
|
||||
refcount_inc(&dreq->count);
|
||||
|
||||
return &dreq->deferred_req;
|
||||
}
|
||||
@@ -99,7 +99,7 @@ struct nfs_cache_defer_req *nfs_cache_defer_req_alloc(void)
|
||||
dreq = kzalloc(sizeof(*dreq), GFP_KERNEL);
|
||||
if (dreq) {
|
||||
init_completion(&dreq->completion);
|
||||
atomic_set(&dreq->count, 1);
|
||||
refcount_set(&dreq->count, 1);
|
||||
dreq->req.defer = nfs_dns_cache_defer;
|
||||
}
|
||||
return dreq;
|
||||
|
||||
@@ -16,7 +16,7 @@ struct nfs_cache_defer_req {
|
||||
struct cache_req req;
|
||||
struct cache_deferred_req deferred_req;
|
||||
struct completion completion;
|
||||
atomic_t count;
|
||||
refcount_t count;
|
||||
};
|
||||
|
||||
extern int nfs_cache_upcall(struct cache_detail *cd, char *entry_name);
|
||||
|
||||
@@ -49,15 +49,15 @@ static int nfs4_callback_up_net(struct svc_serv *serv, struct net *net)
|
||||
if (ret <= 0)
|
||||
goto out_err;
|
||||
nn->nfs_callback_tcpport = ret;
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %p)\n",
|
||||
nn->nfs_callback_tcpport, PF_INET, net);
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %x)\n",
|
||||
nn->nfs_callback_tcpport, PF_INET, net->ns.inum);
|
||||
|
||||
ret = svc_create_xprt(serv, "tcp", net, PF_INET6,
|
||||
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS);
|
||||
if (ret > 0) {
|
||||
nn->nfs_callback_tcpport6 = ret;
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %p)\n",
|
||||
nn->nfs_callback_tcpport6, PF_INET6, net);
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %x\n",
|
||||
nn->nfs_callback_tcpport6, PF_INET6, net->ns.inum);
|
||||
} else if (ret != -EAFNOSUPPORT)
|
||||
goto out_err;
|
||||
return 0;
|
||||
@@ -185,7 +185,7 @@ static void nfs_callback_down_net(u32 minorversion, struct svc_serv *serv, struc
|
||||
if (--nn->cb_users[minorversion])
|
||||
return;
|
||||
|
||||
dprintk("NFS: destroy per-net callback data; net=%p\n", net);
|
||||
dprintk("NFS: destroy per-net callback data; net=%x\n", net->ns.inum);
|
||||
svc_shutdown_net(serv, net);
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
|
||||
if (nn->cb_users[minorversion]++)
|
||||
return 0;
|
||||
|
||||
dprintk("NFS: create per-net callback data; net=%p\n", net);
|
||||
dprintk("NFS: create per-net callback data; net=%x\n", net->ns.inum);
|
||||
|
||||
ret = svc_bind(serv, net);
|
||||
if (ret < 0) {
|
||||
@@ -223,7 +223,7 @@ err_socks:
|
||||
err_bind:
|
||||
nn->cb_users[minorversion]--;
|
||||
dprintk("NFS: Couldn't create callback socket: err = %d; "
|
||||
"net = %p\n", ret, net);
|
||||
"net = %x\n", ret, net->ns.inum);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -440,7 +440,7 @@ static bool referring_call_exists(struct nfs_client *clp,
|
||||
uint32_t nrclists,
|
||||
struct referring_call_list *rclists)
|
||||
{
|
||||
bool status = 0;
|
||||
bool status = false;
|
||||
int i, j;
|
||||
struct nfs4_session *session;
|
||||
struct nfs4_slot_table *tbl;
|
||||
|
||||
@@ -163,7 +163,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
|
||||
|
||||
clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;
|
||||
|
||||
atomic_set(&clp->cl_count, 1);
|
||||
refcount_set(&clp->cl_count, 1);
|
||||
clp->cl_cons_state = NFS_CS_INITING;
|
||||
|
||||
memcpy(&clp->cl_addr, cl_init->addr, cl_init->addrlen);
|
||||
@@ -269,7 +269,7 @@ void nfs_put_client(struct nfs_client *clp)
|
||||
|
||||
nn = net_generic(clp->cl_net, nfs_net_id);
|
||||
|
||||
if (atomic_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) {
|
||||
if (refcount_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) {
|
||||
list_del(&clp->cl_share_link);
|
||||
nfs_cb_idr_remove_locked(clp);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
@@ -314,7 +314,7 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
|
||||
sap))
|
||||
continue;
|
||||
|
||||
atomic_inc(&clp->cl_count);
|
||||
refcount_inc(&clp->cl_count);
|
||||
return clp;
|
||||
}
|
||||
return NULL;
|
||||
@@ -1006,7 +1006,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
/* Copy data from the source */
|
||||
server->nfs_client = source->nfs_client;
|
||||
server->destroy = source->destroy;
|
||||
atomic_inc(&server->nfs_client->cl_count);
|
||||
refcount_inc(&server->nfs_client->cl_count);
|
||||
nfs_server_copy_userdata(server, source);
|
||||
|
||||
server->fsid = fattr->fsid;
|
||||
@@ -1166,7 +1166,7 @@ static int nfs_server_list_show(struct seq_file *m, void *v)
|
||||
clp->rpc_ops->version,
|
||||
rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
|
||||
rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT),
|
||||
atomic_read(&clp->cl_count),
|
||||
refcount_read(&clp->cl_count),
|
||||
clp->cl_hostname);
|
||||
rcu_read_unlock();
|
||||
|
||||
|
||||
@@ -1040,6 +1040,33 @@ int nfs_delegations_present(struct nfs_client *clp)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs4_refresh_delegation_stateid - Update delegation stateid seqid
|
||||
* @dst: stateid to refresh
|
||||
* @inode: inode to check
|
||||
*
|
||||
* Returns "true" and updates "dst->seqid" * if inode had a delegation
|
||||
* that matches our delegation stateid. Otherwise "false" is returned.
|
||||
*/
|
||||
bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode)
|
||||
{
|
||||
struct nfs_delegation *delegation;
|
||||
bool ret = false;
|
||||
if (!inode)
|
||||
goto out;
|
||||
|
||||
rcu_read_lock();
|
||||
delegation = rcu_dereference(NFS_I(inode)->delegation);
|
||||
if (delegation != NULL &&
|
||||
nfs4_stateid_match_other(dst, &delegation->stateid)) {
|
||||
dst->seqid = delegation->stateid.seqid;
|
||||
return ret;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs4_copy_delegation_stateid - Copy inode's state ID information
|
||||
* @inode: inode to check
|
||||
|
||||
@@ -62,6 +62,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
|
||||
int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid, fmode_t type);
|
||||
int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid);
|
||||
bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, struct rpc_cred **cred);
|
||||
bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode);
|
||||
|
||||
void nfs_mark_delegation_referenced(struct nfs_delegation *delegation);
|
||||
int nfs4_have_delegation(struct inode *inode, fmode_t flags);
|
||||
|
||||
50
fs/nfs/dir.c
50
fs/nfs/dir.c
@@ -118,13 +118,6 @@ nfs_opendir(struct inode *inode, struct file *filp)
|
||||
goto out;
|
||||
}
|
||||
filp->private_data = ctx;
|
||||
if (filp->f_path.dentry == filp->f_path.mnt->mnt_root) {
|
||||
/* This is a mountpoint, so d_revalidate will never
|
||||
* have been called, so we need to refresh the
|
||||
* inode (for close-open consistency) ourselves.
|
||||
*/
|
||||
__nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
}
|
||||
out:
|
||||
put_rpccred(cred);
|
||||
return res;
|
||||
@@ -253,7 +246,7 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri
|
||||
desc->cache_entry_index = index;
|
||||
return 0;
|
||||
out_eof:
|
||||
desc->eof = 1;
|
||||
desc->eof = true;
|
||||
return -EBADCOOKIE;
|
||||
}
|
||||
|
||||
@@ -307,7 +300,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des
|
||||
if (array->eof_index >= 0) {
|
||||
status = -EBADCOOKIE;
|
||||
if (*desc->dir_cookie == array->last_cookie)
|
||||
desc->eof = 1;
|
||||
desc->eof = true;
|
||||
}
|
||||
out:
|
||||
return status;
|
||||
@@ -761,7 +754,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
|
||||
ent = &array->array[i];
|
||||
if (!dir_emit(desc->ctx, ent->string.name, ent->string.len,
|
||||
nfs_compat_user_ino64(ent->ino), ent->d_type)) {
|
||||
desc->eof = 1;
|
||||
desc->eof = true;
|
||||
break;
|
||||
}
|
||||
desc->ctx->pos++;
|
||||
@@ -773,7 +766,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
|
||||
ctx->duped = 1;
|
||||
}
|
||||
if (array->eof_index >= 0)
|
||||
desc->eof = 1;
|
||||
desc->eof = true;
|
||||
|
||||
kunmap(desc->page);
|
||||
cache_page_release(desc);
|
||||
@@ -873,7 +866,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
if (res == -EBADCOOKIE) {
|
||||
res = 0;
|
||||
/* This means either end of directory */
|
||||
if (*desc->dir_cookie && desc->eof == 0) {
|
||||
if (*desc->dir_cookie && !desc->eof) {
|
||||
/* Or that the server has 'lost' a cookie */
|
||||
res = uncached_readdir(desc);
|
||||
if (res == 0)
|
||||
@@ -1241,8 +1234,7 @@ static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (nfs_mapping_need_revalidate_inode(inode))
|
||||
error = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
error = nfs_lookup_verify_inode(inode, flags);
|
||||
dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n",
|
||||
__func__, inode->i_ino, error ? "invalid" : "valid");
|
||||
return !error;
|
||||
@@ -1393,6 +1385,7 @@ static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
|
||||
|
||||
const struct dentry_operations nfs4_dentry_operations = {
|
||||
.d_revalidate = nfs4_lookup_revalidate,
|
||||
.d_weak_revalidate = nfs_weak_revalidate,
|
||||
.d_delete = nfs_dentry_delete,
|
||||
.d_iput = nfs_dentry_iput,
|
||||
.d_automount = nfs_d_automount,
|
||||
@@ -2064,7 +2057,7 @@ out:
|
||||
* should mark the directories for revalidation.
|
||||
*/
|
||||
d_move(old_dentry, new_dentry);
|
||||
nfs_set_verifier(new_dentry,
|
||||
nfs_set_verifier(old_dentry,
|
||||
nfs_save_change_attribute(new_dir));
|
||||
} else if (error == -ENOENT)
|
||||
nfs_dentry_handle_enoent(old_dentry);
|
||||
@@ -2369,15 +2362,15 @@ void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_access_add_cache);
|
||||
|
||||
#define NFS_MAY_READ (NFS4_ACCESS_READ)
|
||||
#define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \
|
||||
NFS4_ACCESS_EXTEND | \
|
||||
NFS4_ACCESS_DELETE)
|
||||
#define NFS_FILE_MAY_WRITE (NFS4_ACCESS_MODIFY | \
|
||||
NFS4_ACCESS_EXTEND)
|
||||
#define NFS_MAY_READ (NFS_ACCESS_READ)
|
||||
#define NFS_MAY_WRITE (NFS_ACCESS_MODIFY | \
|
||||
NFS_ACCESS_EXTEND | \
|
||||
NFS_ACCESS_DELETE)
|
||||
#define NFS_FILE_MAY_WRITE (NFS_ACCESS_MODIFY | \
|
||||
NFS_ACCESS_EXTEND)
|
||||
#define NFS_DIR_MAY_WRITE NFS_MAY_WRITE
|
||||
#define NFS_MAY_LOOKUP (NFS4_ACCESS_LOOKUP)
|
||||
#define NFS_MAY_EXECUTE (NFS4_ACCESS_EXECUTE)
|
||||
#define NFS_MAY_LOOKUP (NFS_ACCESS_LOOKUP)
|
||||
#define NFS_MAY_EXECUTE (NFS_ACCESS_EXECUTE)
|
||||
static int
|
||||
nfs_access_calc_mask(u32 access_result, umode_t umode)
|
||||
{
|
||||
@@ -2425,9 +2418,14 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
|
||||
if (!may_block)
|
||||
goto out;
|
||||
|
||||
/* Be clever: ask server to check for all possible rights */
|
||||
cache.mask = NFS_MAY_LOOKUP | NFS_MAY_EXECUTE
|
||||
| NFS_MAY_WRITE | NFS_MAY_READ;
|
||||
/*
|
||||
* Determine which access bits we want to ask for...
|
||||
*/
|
||||
cache.mask = NFS_ACCESS_READ | NFS_ACCESS_MODIFY | NFS_ACCESS_EXTEND;
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP;
|
||||
else
|
||||
cache.mask |= NFS_ACCESS_EXECUTE;
|
||||
cache.cred = cred;
|
||||
status = NFS_PROTO(inode)->access(inode, &cache);
|
||||
if (status != 0) {
|
||||
|
||||
@@ -829,23 +829,9 @@ int nfs_flock(struct file *filp, int cmd, struct file_lock *fl)
|
||||
if (NFS_SERVER(inode)->flags & NFS_MOUNT_LOCAL_FLOCK)
|
||||
is_local = 1;
|
||||
|
||||
/*
|
||||
* VFS doesn't require the open mode to match a flock() lock's type.
|
||||
* NFS, however, may simulate flock() locking with posix locking which
|
||||
* requires the open mode to match the lock type.
|
||||
*/
|
||||
switch (fl->fl_type) {
|
||||
case F_UNLCK:
|
||||
/* We're simulating flock() locks using posix locks on the server */
|
||||
if (fl->fl_type == F_UNLCK)
|
||||
return do_unlk(filp, cmd, fl, is_local);
|
||||
case F_RDLCK:
|
||||
if (!(filp->f_mode & FMODE_READ))
|
||||
return -EBADF;
|
||||
break;
|
||||
case F_WRLCK:
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
return do_setlk(filp, cmd, fl, is_local);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_flock);
|
||||
|
||||
@@ -471,10 +471,10 @@ filelayout_read_pagelist(struct nfs_pgio_header *hdr)
|
||||
return PNFS_NOT_ATTEMPTED;
|
||||
|
||||
dprintk("%s USE DS: %s cl_count %d\n", __func__,
|
||||
ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
|
||||
ds->ds_remotestr, refcount_read(&ds->ds_clp->cl_count));
|
||||
|
||||
/* No multipath support. Use first DS */
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
hdr->ds_clp = ds->ds_clp;
|
||||
hdr->ds_commit_idx = idx;
|
||||
fh = nfs4_fl_select_ds_fh(lseg, j);
|
||||
@@ -515,10 +515,10 @@ filelayout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
|
||||
|
||||
dprintk("%s ino %lu sync %d req %zu@%llu DS: %s cl_count %d\n",
|
||||
__func__, hdr->inode->i_ino, sync, (size_t) hdr->args.count,
|
||||
offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count));
|
||||
offset, ds->ds_remotestr, refcount_read(&ds->ds_clp->cl_count));
|
||||
|
||||
hdr->pgio_done_cb = filelayout_write_done_cb;
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
hdr->ds_clp = ds->ds_clp;
|
||||
hdr->ds_commit_idx = idx;
|
||||
fh = nfs4_fl_select_ds_fh(lseg, j);
|
||||
@@ -1064,9 +1064,9 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how)
|
||||
goto out_err;
|
||||
|
||||
dprintk("%s ino %lu, how %d cl_count %d\n", __func__,
|
||||
data->inode->i_ino, how, atomic_read(&ds->ds_clp->cl_count));
|
||||
data->inode->i_ino, how, refcount_read(&ds->ds_clp->cl_count));
|
||||
data->commit_done_cb = filelayout_commit_done_cb;
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
data->ds_clp = ds->ds_clp;
|
||||
fh = select_ds_fh_from_commit(lseg, data->ds_commit_index);
|
||||
if (fh)
|
||||
|
||||
@@ -187,7 +187,7 @@ ff_layout_add_mirror(struct pnfs_layout_hdr *lo,
|
||||
continue;
|
||||
if (!ff_mirror_match_fh(mirror, pos))
|
||||
continue;
|
||||
if (atomic_inc_not_zero(&pos->ref)) {
|
||||
if (refcount_inc_not_zero(&pos->ref)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return pos;
|
||||
}
|
||||
@@ -218,7 +218,7 @@ static struct nfs4_ff_layout_mirror *ff_layout_alloc_mirror(gfp_t gfp_flags)
|
||||
mirror = kzalloc(sizeof(*mirror), gfp_flags);
|
||||
if (mirror != NULL) {
|
||||
spin_lock_init(&mirror->lock);
|
||||
atomic_set(&mirror->ref, 1);
|
||||
refcount_set(&mirror->ref, 1);
|
||||
INIT_LIST_HEAD(&mirror->mirrors);
|
||||
}
|
||||
return mirror;
|
||||
@@ -242,7 +242,7 @@ static void ff_layout_free_mirror(struct nfs4_ff_layout_mirror *mirror)
|
||||
|
||||
static void ff_layout_put_mirror(struct nfs4_ff_layout_mirror *mirror)
|
||||
{
|
||||
if (mirror != NULL && atomic_dec_and_test(&mirror->ref))
|
||||
if (mirror != NULL && refcount_dec_and_test(&mirror->ref))
|
||||
ff_layout_free_mirror(mirror);
|
||||
}
|
||||
|
||||
@@ -1726,10 +1726,10 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
|
||||
vers = nfs4_ff_layout_ds_version(lseg, idx);
|
||||
|
||||
dprintk("%s USE DS: %s cl_count %d vers %d\n", __func__,
|
||||
ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count), vers);
|
||||
ds->ds_remotestr, refcount_read(&ds->ds_clp->cl_count), vers);
|
||||
|
||||
hdr->pgio_done_cb = ff_layout_read_done_cb;
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
hdr->ds_clp = ds->ds_clp;
|
||||
fh = nfs4_ff_layout_select_ds_fh(lseg, idx);
|
||||
if (fh)
|
||||
@@ -1785,11 +1785,11 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
|
||||
|
||||
dprintk("%s ino %lu sync %d req %zu@%llu DS: %s cl_count %d vers %d\n",
|
||||
__func__, hdr->inode->i_ino, sync, (size_t) hdr->args.count,
|
||||
offset, ds->ds_remotestr, atomic_read(&ds->ds_clp->cl_count),
|
||||
offset, ds->ds_remotestr, refcount_read(&ds->ds_clp->cl_count),
|
||||
vers);
|
||||
|
||||
hdr->pgio_done_cb = ff_layout_write_done_cb;
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
hdr->ds_clp = ds->ds_clp;
|
||||
hdr->ds_commit_idx = idx;
|
||||
fh = nfs4_ff_layout_select_ds_fh(lseg, idx);
|
||||
@@ -1863,11 +1863,11 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
|
||||
vers = nfs4_ff_layout_ds_version(lseg, idx);
|
||||
|
||||
dprintk("%s ino %lu, how %d cl_count %d vers %d\n", __func__,
|
||||
data->inode->i_ino, how, atomic_read(&ds->ds_clp->cl_count),
|
||||
data->inode->i_ino, how, refcount_read(&ds->ds_clp->cl_count),
|
||||
vers);
|
||||
data->commit_done_cb = ff_layout_commit_done_cb;
|
||||
data->cred = ds_cred;
|
||||
atomic_inc(&ds->ds_clp->cl_count);
|
||||
refcount_inc(&ds->ds_clp->cl_count);
|
||||
data->ds_clp = ds->ds_clp;
|
||||
fh = select_ds_fh_from_commit(lseg, data->ds_commit_index);
|
||||
if (fh)
|
||||
@@ -2286,7 +2286,7 @@ ff_layout_mirror_prepare_stats(struct pnfs_layout_hdr *lo,
|
||||
if (!test_and_clear_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags))
|
||||
continue;
|
||||
/* mirror refcount put in cleanup_layoutstats */
|
||||
if (!atomic_inc_not_zero(&mirror->ref))
|
||||
if (!refcount_inc_not_zero(&mirror->ref))
|
||||
continue;
|
||||
dev = &mirror->mirror_ds->id_node;
|
||||
memcpy(&devinfo->dev_id, &dev->deviceid, NFS4_DEVICEID4_SIZE);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define FF_FLAGS_NO_IO_THRU_MDS 2
|
||||
#define FF_FLAGS_NO_READ_IO 4
|
||||
|
||||
#include <linux/refcount.h>
|
||||
#include "../pnfs.h"
|
||||
|
||||
/* XXX: Let's filter out insanely large mirror count for now to avoid oom
|
||||
@@ -82,7 +83,7 @@ struct nfs4_ff_layout_mirror {
|
||||
nfs4_stateid stateid;
|
||||
struct rpc_cred __rcu *ro_cred;
|
||||
struct rpc_cred __rcu *rw_cred;
|
||||
atomic_t ref;
|
||||
refcount_t ref;
|
||||
spinlock_t lock;
|
||||
unsigned long flags;
|
||||
struct nfs4_ff_layoutstat read_stat;
|
||||
|
||||
@@ -783,7 +783,7 @@ EXPORT_SYMBOL_GPL(nfs_getattr);
|
||||
|
||||
static void nfs_init_lock_context(struct nfs_lock_context *l_ctx)
|
||||
{
|
||||
atomic_set(&l_ctx->count, 1);
|
||||
refcount_set(&l_ctx->count, 1);
|
||||
l_ctx->lockowner = current->files;
|
||||
INIT_LIST_HEAD(&l_ctx->list);
|
||||
atomic_set(&l_ctx->io_count, 0);
|
||||
@@ -797,7 +797,7 @@ static struct nfs_lock_context *__nfs_find_lock_context(struct nfs_open_context
|
||||
do {
|
||||
if (pos->lockowner != current->files)
|
||||
continue;
|
||||
atomic_inc(&pos->count);
|
||||
refcount_inc(&pos->count);
|
||||
return pos;
|
||||
} while ((pos = list_entry(pos->list.next, typeof(*pos), list)) != head);
|
||||
return NULL;
|
||||
@@ -836,7 +836,7 @@ void nfs_put_lock_context(struct nfs_lock_context *l_ctx)
|
||||
struct nfs_open_context *ctx = l_ctx->open_context;
|
||||
struct inode *inode = d_inode(ctx->dentry);
|
||||
|
||||
if (!atomic_dec_and_lock(&l_ctx->count, &inode->i_lock))
|
||||
if (!refcount_dec_and_lock(&l_ctx->count, &inode->i_lock))
|
||||
return;
|
||||
list_del(&l_ctx->list);
|
||||
spin_unlock(&inode->i_lock);
|
||||
@@ -913,7 +913,7 @@ EXPORT_SYMBOL_GPL(alloc_nfs_open_context);
|
||||
struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx)
|
||||
{
|
||||
if (ctx != NULL)
|
||||
atomic_inc(&ctx->lock_context.count);
|
||||
refcount_inc(&ctx->lock_context.count);
|
||||
return ctx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_nfs_open_context);
|
||||
@@ -924,11 +924,11 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
|
||||
struct super_block *sb = ctx->dentry->d_sb;
|
||||
|
||||
if (!list_empty(&ctx->list)) {
|
||||
if (!atomic_dec_and_lock(&ctx->lock_context.count, &inode->i_lock))
|
||||
if (!refcount_dec_and_lock(&ctx->lock_context.count, &inode->i_lock))
|
||||
return;
|
||||
list_del(&ctx->list);
|
||||
spin_unlock(&inode->i_lock);
|
||||
} else if (!atomic_dec_and_test(&ctx->lock_context.count))
|
||||
} else if (!refcount_dec_and_test(&ctx->lock_context.count))
|
||||
return;
|
||||
if (inode != NULL)
|
||||
NFS_PROTO(inode)->close_context(ctx, is_sync);
|
||||
@@ -2084,8 +2084,12 @@ static int nfs_net_init(struct net *net)
|
||||
|
||||
static void nfs_net_exit(struct net *net)
|
||||
{
|
||||
struct nfs_net *nn = net_generic(net, nfs_net_id);
|
||||
|
||||
nfs_fs_proc_net_exit(net);
|
||||
nfs_cleanup_cb_ident_idr(net);
|
||||
WARN_ON_ONCE(!list_empty(&nn->nfs_client_list));
|
||||
WARN_ON_ONCE(!list_empty(&nn->nfs_volume_list));
|
||||
}
|
||||
|
||||
static struct pernet_operations nfs_net_ops = {
|
||||
|
||||
@@ -188,6 +188,7 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
|
||||
{
|
||||
struct nfs3_accessargs arg = {
|
||||
.fh = NFS_FH(inode),
|
||||
.access = entry->mask,
|
||||
};
|
||||
struct nfs3_accessres res;
|
||||
struct rpc_message msg = {
|
||||
@@ -196,25 +197,9 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
|
||||
.rpc_resp = &res,
|
||||
.rpc_cred = entry->cred,
|
||||
};
|
||||
int mode = entry->mask;
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("NFS call access\n");
|
||||
|
||||
if (mode & MAY_READ)
|
||||
arg.access |= NFS3_ACCESS_READ;
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
if (mode & MAY_WRITE)
|
||||
arg.access |= NFS3_ACCESS_MODIFY | NFS3_ACCESS_EXTEND | NFS3_ACCESS_DELETE;
|
||||
if (mode & MAY_EXEC)
|
||||
arg.access |= NFS3_ACCESS_LOOKUP;
|
||||
} else {
|
||||
if (mode & MAY_WRITE)
|
||||
arg.access |= NFS3_ACCESS_MODIFY | NFS3_ACCESS_EXTEND;
|
||||
if (mode & MAY_EXEC)
|
||||
arg.access |= NFS3_ACCESS_EXECUTE;
|
||||
}
|
||||
|
||||
res.fattr = nfs_alloc_fattr();
|
||||
if (res.fattr == NULL)
|
||||
goto out;
|
||||
|
||||
@@ -145,7 +145,7 @@ struct nfs4_lock_state {
|
||||
unsigned long ls_flags;
|
||||
struct nfs_seqid_counter ls_seqid;
|
||||
nfs4_stateid ls_stateid;
|
||||
atomic_t ls_count;
|
||||
refcount_t ls_count;
|
||||
fl_owner_t ls_owner;
|
||||
};
|
||||
|
||||
@@ -162,6 +162,7 @@ enum {
|
||||
NFS_STATE_POSIX_LOCKS, /* Posix locks are supported */
|
||||
NFS_STATE_RECOVERY_FAILED, /* OPEN stateid state recovery failed */
|
||||
NFS_STATE_MAY_NOTIFY_LOCK, /* server may CB_NOTIFY_LOCK */
|
||||
NFS_STATE_CHANGE_WAIT, /* A state changing operation is outstanding */
|
||||
};
|
||||
|
||||
struct nfs4_state {
|
||||
@@ -185,6 +186,8 @@ struct nfs4_state {
|
||||
unsigned int n_rdwr; /* Number of read/write references */
|
||||
fmode_t state; /* State on the server (R,W, or RW) */
|
||||
atomic_t count;
|
||||
|
||||
wait_queue_head_t waitq;
|
||||
};
|
||||
|
||||
|
||||
@@ -458,6 +461,10 @@ extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
|
||||
extern int nfs4_select_rw_stateid(struct nfs4_state *, fmode_t,
|
||||
const struct nfs_lock_context *, nfs4_stateid *,
|
||||
struct rpc_cred **);
|
||||
extern bool nfs4_refresh_open_stateid(nfs4_stateid *dst,
|
||||
struct nfs4_state *state);
|
||||
extern bool nfs4_copy_open_stateid(nfs4_stateid *dst,
|
||||
struct nfs4_state *state);
|
||||
|
||||
extern struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask);
|
||||
extern int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task);
|
||||
@@ -465,7 +472,7 @@ extern void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid);
|
||||
extern void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid);
|
||||
extern void nfs_release_seqid(struct nfs_seqid *seqid);
|
||||
extern void nfs_free_seqid(struct nfs_seqid *seqid);
|
||||
extern int nfs4_setup_sequence(const struct nfs_client *client,
|
||||
extern int nfs4_setup_sequence(struct nfs_client *client,
|
||||
struct nfs4_sequence_args *args,
|
||||
struct nfs4_sequence_res *res,
|
||||
struct rpc_task *task);
|
||||
@@ -475,6 +482,7 @@ extern int nfs4_sequence_done(struct rpc_task *task,
|
||||
extern void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp);
|
||||
|
||||
extern const nfs4_stateid zero_stateid;
|
||||
extern const nfs4_stateid invalid_stateid;
|
||||
|
||||
/* nfs4super.c */
|
||||
struct nfs_mount_info;
|
||||
|
||||
@@ -483,7 +483,7 @@ static int nfs4_match_client(struct nfs_client *pos, struct nfs_client *new,
|
||||
* ID and serverowner fields. Wait for CREATE_SESSION
|
||||
* to finish. */
|
||||
if (pos->cl_cons_state > NFS_CS_READY) {
|
||||
atomic_inc(&pos->cl_count);
|
||||
refcount_inc(&pos->cl_count);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
|
||||
nfs_put_client(*prev);
|
||||
@@ -559,7 +559,7 @@ int nfs40_walk_client_list(struct nfs_client *new,
|
||||
* way that a SETCLIENTID_CONFIRM to pos can succeed is
|
||||
* if new and pos point to the same server:
|
||||
*/
|
||||
atomic_inc(&pos->cl_count);
|
||||
refcount_inc(&pos->cl_count);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
|
||||
nfs_put_client(prev);
|
||||
@@ -715,7 +715,7 @@ int nfs41_walk_client_list(struct nfs_client *new,
|
||||
continue;
|
||||
|
||||
found:
|
||||
atomic_inc(&pos->cl_count);
|
||||
refcount_inc(&pos->cl_count);
|
||||
*result = pos;
|
||||
status = 0;
|
||||
break;
|
||||
@@ -749,7 +749,7 @@ nfs4_find_client_ident(struct net *net, int cb_ident)
|
||||
spin_lock(&nn->nfs_client_lock);
|
||||
clp = idr_find(&nn->cb_ident_idr, cb_ident);
|
||||
if (clp)
|
||||
atomic_inc(&clp->cl_count);
|
||||
refcount_inc(&clp->cl_count);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
return clp;
|
||||
}
|
||||
@@ -793,7 +793,7 @@ nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
|
||||
|
||||
spin_lock(&nn->nfs_client_lock);
|
||||
list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {
|
||||
if (nfs4_cb_match_client(addr, clp, minorversion) == false)
|
||||
if (!nfs4_cb_match_client(addr, clp, minorversion))
|
||||
continue;
|
||||
|
||||
if (!nfs4_has_session(clp))
|
||||
@@ -804,7 +804,7 @@ nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
|
||||
sid->data, NFS4_MAX_SESSIONID_LEN) != 0)
|
||||
continue;
|
||||
|
||||
atomic_inc(&clp->cl_count);
|
||||
refcount_inc(&clp->cl_count);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
return clp;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -69,6 +69,14 @@ const nfs4_stateid zero_stateid = {
|
||||
{ .data = { 0 } },
|
||||
.type = NFS4_SPECIAL_STATEID_TYPE,
|
||||
};
|
||||
const nfs4_stateid invalid_stateid = {
|
||||
{
|
||||
.seqid = cpu_to_be32(0xffffffffU),
|
||||
.other = { 0 },
|
||||
},
|
||||
.type = NFS4_INVALID_STATEID_TYPE,
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(nfs_clid_init_mutex);
|
||||
|
||||
int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
|
||||
@@ -645,6 +653,7 @@ nfs4_alloc_open_state(void)
|
||||
INIT_LIST_HEAD(&state->lock_states);
|
||||
spin_lock_init(&state->state_lock);
|
||||
seqlock_init(&state->seqlock);
|
||||
init_waitqueue_head(&state->waitq);
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -825,7 +834,7 @@ __nfs4_find_lock_state(struct nfs4_state *state,
|
||||
ret = pos;
|
||||
}
|
||||
if (ret)
|
||||
atomic_inc(&ret->ls_count);
|
||||
refcount_inc(&ret->ls_count);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -843,7 +852,7 @@ static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, f
|
||||
if (lsp == NULL)
|
||||
return NULL;
|
||||
nfs4_init_seqid_counter(&lsp->ls_seqid);
|
||||
atomic_set(&lsp->ls_count, 1);
|
||||
refcount_set(&lsp->ls_count, 1);
|
||||
lsp->ls_state = state;
|
||||
lsp->ls_owner = fl_owner;
|
||||
lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS);
|
||||
@@ -907,7 +916,7 @@ void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
|
||||
if (lsp == NULL)
|
||||
return;
|
||||
state = lsp->ls_state;
|
||||
if (!atomic_dec_and_lock(&lsp->ls_count, &state->state_lock))
|
||||
if (!refcount_dec_and_lock(&lsp->ls_count, &state->state_lock))
|
||||
return;
|
||||
list_del(&lsp->ls_locks);
|
||||
if (list_empty(&state->lock_states))
|
||||
@@ -927,7 +936,7 @@ static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
|
||||
struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner;
|
||||
|
||||
dst->fl_u.nfs4_fl.owner = lsp;
|
||||
atomic_inc(&lsp->ls_count);
|
||||
refcount_inc(&lsp->ls_count);
|
||||
}
|
||||
|
||||
static void nfs4_fl_release_lock(struct file_lock *fl)
|
||||
@@ -985,18 +994,39 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
|
||||
bool nfs4_refresh_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
|
||||
{
|
||||
bool ret;
|
||||
int seq;
|
||||
|
||||
do {
|
||||
ret = false;
|
||||
seq = read_seqbegin(&state->seqlock);
|
||||
if (nfs4_state_match_open_stateid_other(state, dst)) {
|
||||
dst->seqid = state->open_stateid.seqid;
|
||||
ret = true;
|
||||
}
|
||||
} while (read_seqretry(&state->seqlock, seq));
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
|
||||
{
|
||||
bool ret;
|
||||
const nfs4_stateid *src;
|
||||
int seq;
|
||||
|
||||
do {
|
||||
ret = false;
|
||||
src = &zero_stateid;
|
||||
seq = read_seqbegin(&state->seqlock);
|
||||
if (test_bit(NFS_OPEN_STATE, &state->flags))
|
||||
if (test_bit(NFS_OPEN_STATE, &state->flags)) {
|
||||
src = &state->open_stateid;
|
||||
ret = true;
|
||||
}
|
||||
nfs4_stateid_copy(dst, src);
|
||||
} while (read_seqretry(&state->seqlock, seq));
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1177,7 +1207,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp)
|
||||
if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
|
||||
return;
|
||||
__module_get(THIS_MODULE);
|
||||
atomic_inc(&clp->cl_count);
|
||||
refcount_inc(&clp->cl_count);
|
||||
|
||||
/* The rcu_read_lock() is not strictly necessary, as the state
|
||||
* manager is the only thread that ever changes the rpc_xprt
|
||||
@@ -1269,7 +1299,7 @@ int nfs4_wait_clnt_recover(struct nfs_client *clp)
|
||||
|
||||
might_sleep();
|
||||
|
||||
atomic_inc(&clp->cl_count);
|
||||
refcount_inc(&clp->cl_count);
|
||||
res = wait_on_bit_action(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
|
||||
nfs_wait_bit_killable, TASK_KILLABLE);
|
||||
if (res)
|
||||
@@ -1409,6 +1439,11 @@ void nfs_inode_find_state_and_recover(struct inode *inode,
|
||||
found = true;
|
||||
continue;
|
||||
}
|
||||
if (nfs4_stateid_match_other(&state->open_stateid, stateid) &&
|
||||
nfs4_state_mark_reclaim_nograce(clp, state)) {
|
||||
found = true;
|
||||
continue;
|
||||
}
|
||||
if (nfs_state_lock_state_matches_stateid(state, stateid) &&
|
||||
nfs4_state_mark_reclaim_nograce(clp, state))
|
||||
found = true;
|
||||
@@ -2510,7 +2545,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
||||
break;
|
||||
if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
|
||||
break;
|
||||
} while (atomic_read(&clp->cl_count) > 1);
|
||||
} while (refcount_read(&clp->cl_count) > 1);
|
||||
return;
|
||||
out_error:
|
||||
if (strlen(section))
|
||||
|
||||
@@ -202,17 +202,13 @@ DECLARE_EVENT_CLASS(nfs4_clientid_event,
|
||||
TP_ARGS(clp, error),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string(dstaddr,
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR))
|
||||
__string(dstaddr, clp->cl_hostname)
|
||||
__field(int, error)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->error = error;
|
||||
__assign_str(dstaddr,
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR));
|
||||
__assign_str(dstaddr, clp->cl_hostname);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
@@ -1066,6 +1062,8 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_event,
|
||||
|
||||
DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_setattr);
|
||||
DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_delegreturn);
|
||||
DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_open_stateid_update);
|
||||
DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_open_stateid_update_wait);
|
||||
|
||||
DECLARE_EVENT_CLASS(nfs4_getattr_event,
|
||||
TP_PROTO(
|
||||
@@ -1133,9 +1131,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(u64, fileid)
|
||||
__string(dstaddr, clp ?
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR) : "unknown")
|
||||
__string(dstaddr, clp ? clp->cl_hostname : "unknown")
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
@@ -1148,9 +1144,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
|
||||
__entry->fileid = 0;
|
||||
__entry->dev = 0;
|
||||
}
|
||||
__assign_str(dstaddr, clp ?
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR) : "unknown")
|
||||
__assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
@@ -1192,9 +1186,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(u64, fileid)
|
||||
__string(dstaddr, clp ?
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR) : "unknown")
|
||||
__string(dstaddr, clp ? clp->cl_hostname : "unknown")
|
||||
__field(int, stateid_seq)
|
||||
__field(u32, stateid_hash)
|
||||
),
|
||||
@@ -1209,9 +1201,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
|
||||
__entry->fileid = 0;
|
||||
__entry->dev = 0;
|
||||
}
|
||||
__assign_str(dstaddr, clp ?
|
||||
rpc_peeraddr2str(clp->cl_rpcclient,
|
||||
RPC_DISPLAY_ADDR) : "unknown")
|
||||
__assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
|
||||
__entry->stateid_seq =
|
||||
be32_to_cpu(stateid->seqid);
|
||||
__entry->stateid_hash =
|
||||
|
||||
@@ -4385,6 +4385,14 @@ static int decode_delegation_stateid(struct xdr_stream *xdr, nfs4_stateid *state
|
||||
return decode_stateid(xdr, stateid);
|
||||
}
|
||||
|
||||
static int decode_invalid_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
|
||||
{
|
||||
nfs4_stateid dummy;
|
||||
|
||||
nfs4_stateid_copy(stateid, &invalid_stateid);
|
||||
return decode_stateid(xdr, &dummy);
|
||||
}
|
||||
|
||||
static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
|
||||
{
|
||||
int status;
|
||||
@@ -4393,7 +4401,7 @@ static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
|
||||
if (status != -EIO)
|
||||
nfs_increment_open_seqid(status, res->seqid);
|
||||
if (!status)
|
||||
status = decode_open_stateid(xdr, &res->stateid);
|
||||
status = decode_invalid_stateid(xdr, &res->stateid);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -6108,6 +6116,8 @@ static int decode_layoutreturn(struct xdr_stream *xdr,
|
||||
res->lrs_present = be32_to_cpup(p);
|
||||
if (res->lrs_present)
|
||||
status = decode_layout_stateid(xdr, &res->stateid);
|
||||
else
|
||||
nfs4_stateid_copy(&res->stateid, &invalid_stateid);
|
||||
return status;
|
||||
out_overflow:
|
||||
print_overflow_msg(__func__, xdr);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user