Merge tag 'nfs-for-5.16-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"Highlights include:
Features:
- NFSv4.1 can always retrieve and cache the ACCESS mode on OPEN
- Optimisations for READDIR and the 'ls -l' style workload
- Further replacements of dprintk() with tracepoints and other
tracing improvements
- Ensure we re-probe NFSv4 server capabilities when the user does a
"mount -o remount"
Bugfixes:
- Fix an Oops in pnfs_mark_request_commit()
- Fix up deadlocks in the commit code
- Fix regressions in NFSv2/v3 attribute revalidation due to the
change_attr_type optimisations
- Fix some dentry verifier races
- Fix some missing dentry verifier settings
- Fix a performance regression in nfs_set_open_stateid_locked()
- SUNRPC was sending multiple SYN calls when re-establishing a TCP
connection.
- Fix multiple NFSv4 issues due to missing sanity checking of server
return values
- Fix a potential Oops when FREE_STATEID races with an unmount
Cleanups:
- Clean up the labelled NFS code
- Remove unused header <linux/pnfs_osd_xdr.h>"
* tag 'nfs-for-5.16-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (84 commits)
NFSv4: Sanity check the parameters in nfs41_update_target_slotid()
NFS: Remove the nfs4_label argument from decode_getattr_*() functions
NFS: Remove the nfs4_label argument from nfs_setsecurity
NFS: Remove the nfs4_label argument from nfs_fhget()
NFS: Remove the nfs4_label argument from nfs_add_or_obtain()
NFS: Remove the nfs4_label argument from nfs_instantiate()
NFS: Remove the nfs4_label from the nfs_setattrres
NFS: Remove the nfs4_label from the nfs4_getattr_res
NFS: Remove the f_label from the nfs4_opendata and nfs_openres
NFS: Remove the nfs4_label from the nfs4_lookupp_res struct
NFS: Remove the label from the nfs4_lookup_res struct
NFS: Remove the nfs4_label from the nfs4_link_res struct
NFS: Remove the nfs4_label from the nfs4_create_res struct
NFS: Remove the nfs4_label from the nfs_entry struct
NFS: Create a new nfs_alloc_fattr_with_label() function
NFS: Always initialise fattr->label in nfs_fattr_alloc()
NFSv4.2: alloc_file_pseudo() takes an open flag, not an f_mode
NFS: Don't allocate nfs_fattr on the stack in __nfs42_ssc_open()
NFSv4: Remove unnecessary 'minor version' check
NFSv4: Fix potential Oops in decode_op_map()
...
This commit is contained in:
@@ -739,6 +739,9 @@ out:
|
||||
kfree(copy);
|
||||
spin_unlock(&cps->clp->cl_lock);
|
||||
|
||||
trace_nfs4_cb_offload(&args->coa_fh, &args->coa_stateid,
|
||||
args->wr_count, args->error,
|
||||
args->wr_writeverf.committed);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_NFS_V4_2 */
|
||||
|
||||
@@ -828,7 +828,7 @@ static void nfs_server_set_fsinfo(struct nfs_server *server,
|
||||
/*
|
||||
* Probe filesystem information, including the FSID on v2/v3
|
||||
*/
|
||||
int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs_fattr *fattr)
|
||||
static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs_fsinfo fsinfo;
|
||||
struct nfs_client *clp = server->nfs_client;
|
||||
@@ -862,7 +862,30 @@ int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_probe_fsinfo);
|
||||
|
||||
/*
|
||||
* Grab the destination's particulars, including lease expiry time.
|
||||
*
|
||||
* Returns zero if probe succeeded and retrieved FSID matches the FSID
|
||||
* we have cached.
|
||||
*/
|
||||
int nfs_probe_server(struct nfs_server *server, struct nfs_fh *mntfh)
|
||||
{
|
||||
struct nfs_fattr *fattr;
|
||||
int error;
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
if (fattr == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Sanity: the probe won't work if the destination server
|
||||
* does not recognize the migrated FH. */
|
||||
error = nfs_probe_fsinfo(server, mntfh, fattr);
|
||||
|
||||
nfs_free_fattr(fattr);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_probe_server);
|
||||
|
||||
/*
|
||||
* Copy useful information when duplicating a server record
|
||||
@@ -1025,7 +1048,7 @@ struct nfs_server *nfs_create_server(struct fs_context *fc)
|
||||
|
||||
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
||||
error = ctx->nfs_mod->rpc_ops->getattr(server, ctx->mntfh,
|
||||
fattr, NULL, NULL);
|
||||
fattr, NULL);
|
||||
if (error < 0) {
|
||||
dprintk("nfs_create_server: getattr error = %d\n", -error);
|
||||
goto error;
|
||||
@@ -1058,7 +1081,6 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
rpc_authflavor_t flavor)
|
||||
{
|
||||
struct nfs_server *server;
|
||||
struct nfs_fattr *fattr_fsinfo;
|
||||
int error;
|
||||
|
||||
server = nfs_alloc_server();
|
||||
@@ -1067,11 +1089,6 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
|
||||
server->cred = get_cred(source->cred);
|
||||
|
||||
error = -ENOMEM;
|
||||
fattr_fsinfo = nfs_alloc_fattr();
|
||||
if (fattr_fsinfo == NULL)
|
||||
goto out_free_server;
|
||||
|
||||
/* Copy data from the source */
|
||||
server->nfs_client = source->nfs_client;
|
||||
server->destroy = source->destroy;
|
||||
@@ -1087,7 +1104,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
goto out_free_server;
|
||||
|
||||
/* probe the filesystem info for this server filesystem */
|
||||
error = nfs_probe_fsinfo(server, fh, fattr_fsinfo);
|
||||
error = nfs_probe_server(server, fh);
|
||||
if (error < 0)
|
||||
goto out_free_server;
|
||||
|
||||
@@ -1101,11 +1118,9 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
|
||||
nfs_server_insert_lists(server);
|
||||
server->mount_time = jiffies;
|
||||
|
||||
nfs_free_fattr(fattr_fsinfo);
|
||||
return server;
|
||||
|
||||
out_free_server:
|
||||
nfs_free_fattr(fattr_fsinfo);
|
||||
nfs_free_server(server);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
@@ -755,11 +755,13 @@ int nfs4_inode_return_delegation(struct inode *inode)
|
||||
struct nfs_delegation *delegation;
|
||||
|
||||
delegation = nfs_start_delegation_return(nfsi);
|
||||
/* Synchronous recall of any application leases */
|
||||
break_lease(inode, O_WRONLY | O_RDWR);
|
||||
nfs_wb_all(inode);
|
||||
if (delegation != NULL)
|
||||
if (delegation != NULL) {
|
||||
/* Synchronous recall of any application leases */
|
||||
break_lease(inode, O_WRONLY | O_RDWR);
|
||||
if (S_ISREG(inode->i_mode))
|
||||
nfs_wb_all(inode);
|
||||
return nfs_end_delegation_return(inode, delegation, 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
119
fs/nfs/dir.c
119
fs/nfs/dir.c
@@ -78,6 +78,7 @@ static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir
|
||||
ctx->attr_gencount = nfsi->attr_gencount;
|
||||
ctx->dir_cookie = 0;
|
||||
ctx->dup_cookie = 0;
|
||||
ctx->page_index = 0;
|
||||
spin_lock(&dir->i_lock);
|
||||
if (list_empty(&nfsi->open_files) &&
|
||||
(nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
|
||||
@@ -85,6 +86,7 @@ static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir
|
||||
NFS_INO_INVALID_DATA |
|
||||
NFS_INO_REVAL_FORCED);
|
||||
list_add(&ctx->list, &nfsi->open_files);
|
||||
clear_bit(NFS_INO_FORCE_READDIR, &nfsi->flags);
|
||||
spin_unlock(&dir->i_lock);
|
||||
return ctx;
|
||||
}
|
||||
@@ -411,7 +413,8 @@ out_eof:
|
||||
static bool
|
||||
nfs_readdir_inode_mapping_valid(struct nfs_inode *nfsi)
|
||||
{
|
||||
if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
|
||||
if (nfsi->cache_validity & (NFS_INO_INVALID_CHANGE |
|
||||
NFS_INO_INVALID_DATA))
|
||||
return false;
|
||||
smp_rmb();
|
||||
return !test_bit(NFS_INO_INVALIDATING, &nfsi->flags);
|
||||
@@ -626,8 +629,7 @@ void nfs_force_use_readdirplus(struct inode *dir)
|
||||
if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
|
||||
!list_empty(&nfsi->open_files)) {
|
||||
set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
|
||||
invalidate_mapping_pages(dir->i_mapping,
|
||||
nfsi->page_index + 1, -1);
|
||||
set_bit(NFS_INO_FORCE_READDIR, &nfsi->flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -680,7 +682,7 @@ again:
|
||||
nfs_set_verifier(dentry, dir_verifier);
|
||||
status = nfs_refresh_inode(d_inode(dentry), entry->fattr);
|
||||
if (!status)
|
||||
nfs_setsecurity(d_inode(dentry), entry->fattr, entry->label);
|
||||
nfs_setsecurity(d_inode(dentry), entry->fattr);
|
||||
goto out;
|
||||
} else {
|
||||
d_invalidate(dentry);
|
||||
@@ -694,7 +696,7 @@ again:
|
||||
goto out;
|
||||
}
|
||||
|
||||
inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr, entry->label);
|
||||
inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);
|
||||
alias = d_splice_alias(inode, dentry);
|
||||
d_lookup_done(dentry);
|
||||
if (alias) {
|
||||
@@ -730,8 +732,8 @@ static int nfs_readdir_page_filler(struct nfs_readdir_descriptor *desc,
|
||||
xdr_set_scratch_page(&stream, scratch);
|
||||
|
||||
do {
|
||||
if (entry->label)
|
||||
entry->label->len = NFS4_MAXLABELLEN;
|
||||
if (entry->fattr->label)
|
||||
entry->fattr->label->len = NFS4_MAXLABELLEN;
|
||||
|
||||
status = xdr_decode(desc, entry, &stream);
|
||||
if (status != 0)
|
||||
@@ -836,21 +838,15 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
|
||||
return -ENOMEM;
|
||||
entry->cookie = nfs_readdir_page_last_cookie(page);
|
||||
entry->fh = nfs_alloc_fhandle();
|
||||
entry->fattr = nfs_alloc_fattr();
|
||||
entry->fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
|
||||
entry->server = NFS_SERVER(inode);
|
||||
if (entry->fh == NULL || entry->fattr == NULL)
|
||||
goto out;
|
||||
|
||||
entry->label = nfs4_label_alloc(NFS_SERVER(inode), GFP_NOWAIT);
|
||||
if (IS_ERR(entry->label)) {
|
||||
status = PTR_ERR(entry->label);
|
||||
goto out;
|
||||
}
|
||||
|
||||
array_size = (dtsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
pages = nfs_readdir_alloc_pages(array_size);
|
||||
if (!pages)
|
||||
goto out_release_label;
|
||||
goto out;
|
||||
|
||||
do {
|
||||
unsigned int pglen;
|
||||
@@ -873,8 +869,6 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
|
||||
} while (!status && nfs_readdir_page_needs_filling(page));
|
||||
|
||||
nfs_readdir_free_pages(pages, array_size);
|
||||
out_release_label:
|
||||
nfs4_label_free(entry->label);
|
||||
out:
|
||||
nfs_free_fattr(entry->fattr);
|
||||
nfs_free_fhandle(entry->fh);
|
||||
@@ -937,10 +931,8 @@ static int find_and_lock_cache_page(struct nfs_readdir_descriptor *desc)
|
||||
sizeof(nfsi->cookieverf));
|
||||
}
|
||||
res = nfs_readdir_search_array(desc);
|
||||
if (res == 0) {
|
||||
nfsi->page_index = desc->page_index;
|
||||
if (res == 0)
|
||||
return 0;
|
||||
}
|
||||
nfs_readdir_page_unlock_and_put_cached(desc);
|
||||
return res;
|
||||
}
|
||||
@@ -1079,6 +1071,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
struct nfs_open_dir_context *dir_ctx = file->private_data;
|
||||
struct nfs_readdir_descriptor *desc;
|
||||
pgoff_t page_index;
|
||||
int res;
|
||||
|
||||
dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n",
|
||||
@@ -1109,10 +1102,15 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
desc->dir_cookie = dir_ctx->dir_cookie;
|
||||
desc->dup_cookie = dir_ctx->dup_cookie;
|
||||
desc->duped = dir_ctx->duped;
|
||||
page_index = dir_ctx->page_index;
|
||||
desc->attr_gencount = dir_ctx->attr_gencount;
|
||||
memcpy(desc->verf, dir_ctx->verf, sizeof(desc->verf));
|
||||
spin_unlock(&file->f_lock);
|
||||
|
||||
if (test_and_clear_bit(NFS_INO_FORCE_READDIR, &nfsi->flags) &&
|
||||
list_is_singular(&nfsi->open_files))
|
||||
invalidate_mapping_pages(inode->i_mapping, page_index + 1, -1);
|
||||
|
||||
do {
|
||||
res = readdir_search_pagecache(desc);
|
||||
|
||||
@@ -1149,6 +1147,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
dir_ctx->dup_cookie = desc->dup_cookie;
|
||||
dir_ctx->duped = desc->duped;
|
||||
dir_ctx->attr_gencount = desc->attr_gencount;
|
||||
dir_ctx->page_index = desc->page_index;
|
||||
memcpy(dir_ctx->verf, desc->verf, sizeof(dir_ctx->verf));
|
||||
spin_unlock(&file->f_lock);
|
||||
|
||||
@@ -1269,13 +1268,12 @@ static bool nfs_verifier_is_delegated(struct dentry *dentry)
|
||||
static void nfs_set_verifier_locked(struct dentry *dentry, unsigned long verf)
|
||||
{
|
||||
struct inode *inode = d_inode(dentry);
|
||||
struct inode *dir = d_inode(dentry->d_parent);
|
||||
|
||||
if (!nfs_verifier_is_delegated(dentry) &&
|
||||
!nfs_verify_change_attribute(d_inode(dentry->d_parent), verf))
|
||||
goto out;
|
||||
if (!nfs_verify_change_attribute(dir, verf))
|
||||
return;
|
||||
if (inode && NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
|
||||
nfs_set_verifier_delegated(&verf);
|
||||
out:
|
||||
dentry->d_time = verf;
|
||||
}
|
||||
|
||||
@@ -1413,7 +1411,7 @@ out_force:
|
||||
static void nfs_mark_dir_for_revalidate(struct inode *inode)
|
||||
{
|
||||
spin_lock(&inode->i_lock);
|
||||
nfs_set_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE);
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE);
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
@@ -1495,19 +1493,17 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
|
||||
{
|
||||
struct nfs_fh *fhandle;
|
||||
struct nfs_fattr *fattr;
|
||||
struct nfs4_label *label;
|
||||
unsigned long dir_verifier;
|
||||
int ret;
|
||||
|
||||
ret = -ENOMEM;
|
||||
fhandle = nfs_alloc_fhandle();
|
||||
fattr = nfs_alloc_fattr();
|
||||
label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
|
||||
if (fhandle == NULL || fattr == NULL || IS_ERR(label))
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
|
||||
if (fhandle == NULL || fattr == NULL)
|
||||
goto out;
|
||||
|
||||
dir_verifier = nfs_save_change_attribute(dir);
|
||||
ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
|
||||
ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
|
||||
if (ret < 0) {
|
||||
switch (ret) {
|
||||
case -ESTALE:
|
||||
@@ -1526,7 +1522,7 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
|
||||
if (nfs_refresh_inode(inode, fattr) < 0)
|
||||
goto out;
|
||||
|
||||
nfs_setsecurity(inode, fattr, label);
|
||||
nfs_setsecurity(inode, fattr);
|
||||
nfs_set_verifier(dentry, dir_verifier);
|
||||
|
||||
/* set a readdirplus hint that we had a cache miss */
|
||||
@@ -1535,7 +1531,6 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
|
||||
out:
|
||||
nfs_free_fattr(fattr);
|
||||
nfs_free_fhandle(fhandle);
|
||||
nfs4_label_free(label);
|
||||
|
||||
/*
|
||||
* If the lookup failed despite the dentry change attribute being
|
||||
@@ -1721,10 +1716,6 @@ static void nfs_drop_nlink(struct inode *inode)
|
||||
*/
|
||||
static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
|
||||
{
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
/* drop any readdir cache as it could easily be old */
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
||||
|
||||
if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
|
||||
nfs_complete_unlink(dentry, inode);
|
||||
nfs_drop_nlink(inode);
|
||||
@@ -1759,7 +1750,6 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
|
||||
struct inode *inode = NULL;
|
||||
struct nfs_fh *fhandle = NULL;
|
||||
struct nfs_fattr *fattr = NULL;
|
||||
struct nfs4_label *label = NULL;
|
||||
unsigned long dir_verifier;
|
||||
int error;
|
||||
|
||||
@@ -1778,27 +1768,23 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
|
||||
|
||||
res = ERR_PTR(-ENOMEM);
|
||||
fhandle = nfs_alloc_fhandle();
|
||||
fattr = nfs_alloc_fattr();
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SERVER(dir));
|
||||
if (fhandle == NULL || fattr == NULL)
|
||||
goto out;
|
||||
|
||||
label = nfs4_label_alloc(NFS_SERVER(dir), GFP_NOWAIT);
|
||||
if (IS_ERR(label))
|
||||
goto out;
|
||||
|
||||
dir_verifier = nfs_save_change_attribute(dir);
|
||||
trace_nfs_lookup_enter(dir, dentry, flags);
|
||||
error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
|
||||
error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
|
||||
if (error == -ENOENT)
|
||||
goto no_entry;
|
||||
if (error < 0) {
|
||||
res = ERR_PTR(error);
|
||||
goto out_label;
|
||||
goto out;
|
||||
}
|
||||
inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
|
||||
inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
|
||||
res = ERR_CAST(inode);
|
||||
if (IS_ERR(res))
|
||||
goto out_label;
|
||||
goto out;
|
||||
|
||||
/* Notify readdir to use READDIRPLUS */
|
||||
nfs_force_use_readdirplus(dir);
|
||||
@@ -1807,14 +1793,12 @@ no_entry:
|
||||
res = d_splice_alias(inode, dentry);
|
||||
if (res != NULL) {
|
||||
if (IS_ERR(res))
|
||||
goto out_label;
|
||||
goto out;
|
||||
dentry = res;
|
||||
}
|
||||
nfs_set_verifier(dentry, dir_verifier);
|
||||
out_label:
|
||||
trace_nfs_lookup_exit(dir, dentry, flags, error);
|
||||
nfs4_label_free(label);
|
||||
out:
|
||||
trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
|
||||
nfs_free_fattr(fattr);
|
||||
nfs_free_fhandle(fhandle);
|
||||
return res;
|
||||
@@ -2051,8 +2035,7 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
|
||||
struct dentry *
|
||||
nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct dentry *parent = dget_parent(dentry);
|
||||
struct inode *dir = d_inode(parent);
|
||||
@@ -2063,7 +2046,7 @@ nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
d_drop(dentry);
|
||||
|
||||
if (fhandle->size == 0) {
|
||||
error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, NULL);
|
||||
error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
|
||||
if (error)
|
||||
goto out_error;
|
||||
}
|
||||
@@ -2071,11 +2054,11 @@ nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
||||
struct nfs_server *server = NFS_SB(dentry->d_sb);
|
||||
error = server->nfs_client->rpc_ops->getattr(server, fhandle,
|
||||
fattr, NULL, NULL);
|
||||
fattr, NULL);
|
||||
if (error < 0)
|
||||
goto out_error;
|
||||
}
|
||||
inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
|
||||
inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
|
||||
d = d_splice_alias(inode, dentry);
|
||||
out:
|
||||
dput(parent);
|
||||
@@ -2090,12 +2073,11 @@ EXPORT_SYMBOL_GPL(nfs_add_or_obtain);
|
||||
* Code common to create, mkdir, and mknod.
|
||||
*/
|
||||
int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct dentry *d;
|
||||
|
||||
d = nfs_add_or_obtain(dentry, fhandle, fattr, label);
|
||||
d = nfs_add_or_obtain(dentry, fhandle, fattr);
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
|
||||
@@ -2197,6 +2179,18 @@ static void nfs_dentry_handle_enoent(struct dentry *dentry)
|
||||
d_delete(dentry);
|
||||
}
|
||||
|
||||
static void nfs_dentry_remove_handle_error(struct inode *dir,
|
||||
struct dentry *dentry, int error)
|
||||
{
|
||||
switch (error) {
|
||||
case -ENOENT:
|
||||
d_delete(dentry);
|
||||
fallthrough;
|
||||
case 0:
|
||||
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
||||
}
|
||||
}
|
||||
|
||||
int nfs_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
int error;
|
||||
@@ -2219,6 +2213,7 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
|
||||
} else
|
||||
error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
|
||||
nfs_dentry_remove_handle_error(dir, dentry, error);
|
||||
trace_nfs_rmdir_exit(dir, dentry, error);
|
||||
|
||||
return error;
|
||||
@@ -2288,9 +2283,8 @@ int nfs_unlink(struct inode *dir, struct dentry *dentry)
|
||||
}
|
||||
spin_unlock(&dentry->d_lock);
|
||||
error = nfs_safe_remove(dentry);
|
||||
if (!error || error == -ENOENT) {
|
||||
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
||||
} else if (need_rehash)
|
||||
nfs_dentry_remove_handle_error(dir, dentry, error);
|
||||
if (need_rehash)
|
||||
d_rehash(dentry);
|
||||
out:
|
||||
trace_nfs_unlink_exit(dir, dentry, error);
|
||||
@@ -2352,6 +2346,8 @@ int nfs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
return error;
|
||||
}
|
||||
|
||||
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
||||
|
||||
/*
|
||||
* No big deal if we can't add this page to the page cache here.
|
||||
* READLINK will get the missing page from the server if needed.
|
||||
@@ -2385,6 +2381,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
|
||||
d_drop(dentry);
|
||||
error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
|
||||
if (error == 0) {
|
||||
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
||||
ihold(inode);
|
||||
d_add(dentry, inode);
|
||||
}
|
||||
|
||||
@@ -620,7 +620,7 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
|
||||
nfs_unlock_and_release_request(req);
|
||||
}
|
||||
|
||||
if (atomic_dec_and_test(&cinfo.mds->rpcs_out))
|
||||
if (nfs_commit_end(cinfo.mds))
|
||||
nfs_direct_write_complete(dreq);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,6 @@ static struct dentry *
|
||||
nfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
||||
int fh_len, int fh_type)
|
||||
{
|
||||
struct nfs4_label *label = NULL;
|
||||
struct nfs_fattr *fattr = NULL;
|
||||
struct nfs_fh *server_fh = nfs_exp_embedfh(fid->raw);
|
||||
size_t fh_size = offsetof(struct nfs_fh, data) + server_fh->size;
|
||||
@@ -79,7 +78,7 @@ nfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
||||
if (fh_len < len || fh_type != len)
|
||||
return NULL;
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SB(sb));
|
||||
if (fattr == NULL) {
|
||||
dentry = ERR_PTR(-ENOMEM);
|
||||
goto out;
|
||||
@@ -95,28 +94,19 @@ nfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
||||
if (inode)
|
||||
goto out_found;
|
||||
|
||||
label = nfs4_label_alloc(NFS_SB(sb), GFP_KERNEL);
|
||||
if (IS_ERR(label)) {
|
||||
dentry = ERR_CAST(label);
|
||||
goto out_free_fattr;
|
||||
}
|
||||
|
||||
rpc_ops = NFS_SB(sb)->nfs_client->rpc_ops;
|
||||
ret = rpc_ops->getattr(NFS_SB(sb), server_fh, fattr, label, NULL);
|
||||
ret = rpc_ops->getattr(NFS_SB(sb), server_fh, fattr, NULL);
|
||||
if (ret) {
|
||||
dprintk("%s: getattr failed %d\n", __func__, ret);
|
||||
trace_nfs_fh_to_dentry(sb, server_fh, fattr->fileid, ret);
|
||||
dentry = ERR_PTR(ret);
|
||||
goto out_free_label;
|
||||
goto out_free_fattr;
|
||||
}
|
||||
|
||||
inode = nfs_fhget(sb, server_fh, fattr, label);
|
||||
inode = nfs_fhget(sb, server_fh, fattr);
|
||||
|
||||
out_found:
|
||||
dentry = d_obtain_alias(inode);
|
||||
|
||||
out_free_label:
|
||||
nfs4_label_free(label);
|
||||
out_free_fattr:
|
||||
nfs_free_fattr(fattr);
|
||||
out:
|
||||
@@ -131,7 +121,6 @@ nfs_get_parent(struct dentry *dentry)
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct nfs_server *server = NFS_SB(sb);
|
||||
struct nfs_fattr *fattr = NULL;
|
||||
struct nfs4_label *label = NULL;
|
||||
struct dentry *parent;
|
||||
struct nfs_rpc_ops const *ops = server->nfs_client->rpc_ops;
|
||||
struct nfs_fh fh;
|
||||
@@ -139,31 +128,20 @@ nfs_get_parent(struct dentry *dentry)
|
||||
if (!ops->lookupp)
|
||||
return ERR_PTR(-EACCES);
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
if (fattr == NULL) {
|
||||
parent = ERR_PTR(-ENOMEM);
|
||||
fattr = nfs_alloc_fattr_with_label(server);
|
||||
if (fattr == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ret = ops->lookupp(inode, &fh, fattr);
|
||||
if (ret) {
|
||||
parent = ERR_PTR(ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
label = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(label)) {
|
||||
parent = ERR_CAST(label);
|
||||
goto out_free_fattr;
|
||||
}
|
||||
|
||||
ret = ops->lookupp(inode, &fh, fattr, label);
|
||||
if (ret) {
|
||||
parent = ERR_PTR(ret);
|
||||
goto out_free_label;
|
||||
}
|
||||
|
||||
pinode = nfs_fhget(sb, &fh, fattr, label);
|
||||
pinode = nfs_fhget(sb, &fh, fattr);
|
||||
parent = d_obtain_alias(pinode);
|
||||
out_free_label:
|
||||
nfs4_label_free(label);
|
||||
out_free_fattr:
|
||||
nfs_free_fattr(fattr);
|
||||
out:
|
||||
nfs_free_fattr(fattr);
|
||||
return parent;
|
||||
}
|
||||
|
||||
|
||||
@@ -293,8 +293,6 @@ static void filelayout_read_call_done(struct rpc_task *task, void *data)
|
||||
{
|
||||
struct nfs_pgio_header *hdr = data;
|
||||
|
||||
dprintk("--> %s task->tk_status %d\n", __func__, task->tk_status);
|
||||
|
||||
if (test_bit(NFS_IOHDR_REDO, &hdr->flags) &&
|
||||
task->tk_status == 0) {
|
||||
nfs41_sequence_done(task, &hdr->res.seq_res);
|
||||
|
||||
@@ -1414,8 +1414,6 @@ static void ff_layout_read_call_done(struct rpc_task *task, void *data)
|
||||
{
|
||||
struct nfs_pgio_header *hdr = data;
|
||||
|
||||
dprintk("--> %s task->tk_status %d\n", __func__, task->tk_status);
|
||||
|
||||
if (test_bit(NFS_IOHDR_REDO, &hdr->flags) &&
|
||||
task->tk_status == 0) {
|
||||
nfs4_sequence_done(task, &hdr->res.seq_res);
|
||||
|
||||
@@ -378,10 +378,10 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,
|
||||
goto noconnect;
|
||||
|
||||
ds = mirror->mirror_ds->ds;
|
||||
if (READ_ONCE(ds->ds_clp))
|
||||
goto out;
|
||||
/* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */
|
||||
smp_rmb();
|
||||
if (ds->ds_clp)
|
||||
goto out;
|
||||
|
||||
/* FIXME: For now we assume the server sent only one version of NFS
|
||||
* to use for the DS.
|
||||
|
||||
@@ -80,31 +80,28 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
|
||||
goto out;
|
||||
|
||||
/* get the actual root for this mount */
|
||||
fsinfo.fattr = nfs_alloc_fattr();
|
||||
fsinfo.fattr = nfs_alloc_fattr_with_label(server);
|
||||
if (fsinfo.fattr == NULL)
|
||||
goto out_name;
|
||||
|
||||
fsinfo.fattr->label = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(fsinfo.fattr->label))
|
||||
goto out_fattr;
|
||||
error = server->nfs_client->rpc_ops->getroot(server, ctx->mntfh, &fsinfo);
|
||||
if (error < 0) {
|
||||
dprintk("nfs_get_root: getattr error = %d\n", -error);
|
||||
nfs_errorf(fc, "NFS: Couldn't getattr on root");
|
||||
goto out_label;
|
||||
goto out_fattr;
|
||||
}
|
||||
|
||||
inode = nfs_fhget(s, ctx->mntfh, fsinfo.fattr, NULL);
|
||||
inode = nfs_fhget(s, ctx->mntfh, fsinfo.fattr);
|
||||
if (IS_ERR(inode)) {
|
||||
dprintk("nfs_get_root: get root inode failed\n");
|
||||
error = PTR_ERR(inode);
|
||||
nfs_errorf(fc, "NFS: Couldn't get root inode");
|
||||
goto out_label;
|
||||
goto out_fattr;
|
||||
}
|
||||
|
||||
error = nfs_superblock_set_dummy_root(s, inode);
|
||||
if (error != 0)
|
||||
goto out_label;
|
||||
goto out_fattr;
|
||||
|
||||
/* root dentries normally start off anonymous and get spliced in later
|
||||
* if the dentry tree reaches them; however if the dentry already
|
||||
@@ -115,7 +112,7 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
|
||||
dprintk("nfs_get_root: get root dentry failed\n");
|
||||
error = PTR_ERR(root);
|
||||
nfs_errorf(fc, "NFS: Couldn't get root dentry");
|
||||
goto out_label;
|
||||
goto out_fattr;
|
||||
}
|
||||
|
||||
security_d_instantiate(root, inode);
|
||||
@@ -151,11 +148,9 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
|
||||
!(kflags_out & SECURITY_LSM_NATIVE_LABELS))
|
||||
server->caps &= ~NFS_CAP_SECURITY_LABEL;
|
||||
|
||||
nfs_setsecurity(inode, fsinfo.fattr, fsinfo.fattr->label);
|
||||
nfs_setsecurity(inode, fsinfo.fattr);
|
||||
error = 0;
|
||||
|
||||
out_label:
|
||||
nfs4_label_free(fsinfo.fattr->label);
|
||||
out_fattr:
|
||||
nfs_free_fattr(fsinfo.fattr);
|
||||
out_name:
|
||||
@@ -165,5 +160,5 @@ out:
|
||||
error_splat_root:
|
||||
dput(fc->root);
|
||||
fc->root = NULL;
|
||||
goto out_label;
|
||||
goto out_fattr;
|
||||
}
|
||||
|
||||
130
fs/nfs/inode.c
130
fs/nfs/inode.c
@@ -210,10 +210,15 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
|
||||
flags &= ~NFS_INO_INVALID_XATTR;
|
||||
if (flags & NFS_INO_INVALID_DATA)
|
||||
nfs_fscache_invalidate(inode);
|
||||
if (inode->i_mapping->nrpages == 0)
|
||||
flags &= ~(NFS_INO_INVALID_DATA|NFS_INO_DATA_INVAL_DEFER);
|
||||
flags &= ~(NFS_INO_REVAL_PAGECACHE | NFS_INO_REVAL_FORCED);
|
||||
|
||||
nfsi->cache_validity |= flags;
|
||||
|
||||
if (inode->i_mapping->nrpages == 0)
|
||||
nfsi->cache_validity &= ~(NFS_INO_INVALID_DATA |
|
||||
NFS_INO_DATA_INVAL_DEFER);
|
||||
else if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
|
||||
nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_set_cache_invalid);
|
||||
|
||||
@@ -350,37 +355,32 @@ static void nfs_clear_label_invalid(struct inode *inode)
|
||||
spin_unlock(&inode->i_lock);
|
||||
}
|
||||
|
||||
void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (label == NULL)
|
||||
if (fattr->label == NULL)
|
||||
return;
|
||||
|
||||
if ((fattr->valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL) && inode->i_security) {
|
||||
error = security_inode_notifysecctx(inode, label->label,
|
||||
label->len);
|
||||
error = security_inode_notifysecctx(inode, fattr->label->label,
|
||||
fattr->label->len);
|
||||
if (error)
|
||||
printk(KERN_ERR "%s() %s %d "
|
||||
"security_inode_notifysecctx() %d\n",
|
||||
__func__,
|
||||
(char *)label->label,
|
||||
label->len, error);
|
||||
(char *)fattr->label->label,
|
||||
fattr->label->len, error);
|
||||
nfs_clear_label_invalid(inode);
|
||||
}
|
||||
}
|
||||
|
||||
struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags)
|
||||
{
|
||||
struct nfs4_label *label = NULL;
|
||||
int minor_version = server->nfs_client->cl_minorversion;
|
||||
|
||||
if (minor_version < 2)
|
||||
return label;
|
||||
struct nfs4_label *label;
|
||||
|
||||
if (!(server->caps & NFS_CAP_SECURITY_LABEL))
|
||||
return label;
|
||||
return NULL;
|
||||
|
||||
label = kzalloc(sizeof(struct nfs4_label), flags);
|
||||
if (label == NULL)
|
||||
@@ -397,8 +397,7 @@ struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs4_label_alloc);
|
||||
#else
|
||||
void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -426,12 +425,28 @@ nfs_ilookup(struct super_block *sb, struct nfs_fattr *fattr, struct nfs_fh *fh)
|
||||
return inode;
|
||||
}
|
||||
|
||||
static void nfs_inode_init_regular(struct nfs_inode *nfsi)
|
||||
{
|
||||
atomic_long_set(&nfsi->nrequests, 0);
|
||||
INIT_LIST_HEAD(&nfsi->commit_info.list);
|
||||
atomic_long_set(&nfsi->commit_info.ncommit, 0);
|
||||
atomic_set(&nfsi->commit_info.rpcs_out, 0);
|
||||
mutex_init(&nfsi->commit_mutex);
|
||||
}
|
||||
|
||||
static void nfs_inode_init_dir(struct nfs_inode *nfsi)
|
||||
{
|
||||
nfsi->cache_change_attribute = 0;
|
||||
memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
|
||||
init_rwsem(&nfsi->rmdir_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is our front-end to iget that looks up inodes by file handle
|
||||
* instead of inode number.
|
||||
*/
|
||||
struct inode *
|
||||
nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, struct nfs4_label *label)
|
||||
nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs_find_desc desc = {
|
||||
.fh = fh,
|
||||
@@ -480,10 +495,12 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
inode->i_fop = NFS_SB(sb)->nfs_client->rpc_ops->file_ops;
|
||||
inode->i_data.a_ops = &nfs_file_aops;
|
||||
nfs_inode_init_regular(nfsi);
|
||||
} else if (S_ISDIR(inode->i_mode)) {
|
||||
inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->dir_inode_ops;
|
||||
inode->i_fop = &nfs_dir_operations;
|
||||
inode->i_data.a_ops = &nfs_dir_aops;
|
||||
nfs_inode_init_dir(nfsi);
|
||||
/* Deal with crossing mountpoints */
|
||||
if (fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT ||
|
||||
fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) {
|
||||
@@ -509,7 +526,6 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
|
||||
inode->i_uid = make_kuid(&init_user_ns, -2);
|
||||
inode->i_gid = make_kgid(&init_user_ns, -2);
|
||||
inode->i_blocks = 0;
|
||||
memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
|
||||
nfsi->write_io = 0;
|
||||
nfsi->read_io = 0;
|
||||
|
||||
@@ -563,7 +579,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
|
||||
fattr->size != 0)
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_BLOCKS);
|
||||
|
||||
nfs_setsecurity(inode, fattr, label);
|
||||
nfs_setsecurity(inode, fattr);
|
||||
|
||||
nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
|
||||
nfsi->attrtimeo_timestamp = now;
|
||||
@@ -632,7 +648,7 @@ nfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
||||
if (S_ISREG(inode->i_mode))
|
||||
nfs_sync_inode(inode);
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
|
||||
if (fattr == NULL) {
|
||||
error = -ENOMEM;
|
||||
goto out;
|
||||
@@ -666,6 +682,7 @@ static int nfs_vmtruncate(struct inode * inode, loff_t offset)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
trace_nfs_size_truncate(inode, offset);
|
||||
i_size_write(inode, offset);
|
||||
/* Optimisation */
|
||||
if (offset == 0)
|
||||
@@ -1024,7 +1041,7 @@ struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry,
|
||||
ctx->cred = get_cred(filp->f_cred);
|
||||
else
|
||||
ctx->cred = get_current_cred();
|
||||
ctx->ll_cred = NULL;
|
||||
rcu_assign_pointer(ctx->ll_cred, NULL);
|
||||
ctx->state = NULL;
|
||||
ctx->mode = f_mode;
|
||||
ctx->flags = 0;
|
||||
@@ -1063,7 +1080,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
|
||||
put_cred(ctx->cred);
|
||||
dput(ctx->dentry);
|
||||
nfs_sb_deactive(sb);
|
||||
put_rpccred(ctx->ll_cred);
|
||||
put_rpccred(rcu_dereference_protected(ctx->ll_cred, 1));
|
||||
kfree(ctx->mdsthreshold);
|
||||
kfree_rcu(ctx, rcu_head);
|
||||
}
|
||||
@@ -1175,7 +1192,6 @@ int
|
||||
__nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
{
|
||||
int status = -ESTALE;
|
||||
struct nfs4_label *label = NULL;
|
||||
struct nfs_fattr *fattr = NULL;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
@@ -1197,20 +1213,13 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
}
|
||||
|
||||
status = -ENOMEM;
|
||||
fattr = nfs_alloc_fattr();
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
|
||||
if (fattr == NULL)
|
||||
goto out;
|
||||
|
||||
nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE);
|
||||
|
||||
label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
|
||||
if (IS_ERR(label)) {
|
||||
status = PTR_ERR(label);
|
||||
goto out;
|
||||
}
|
||||
|
||||
status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), fattr,
|
||||
label, inode);
|
||||
status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), fattr, inode);
|
||||
if (status != 0) {
|
||||
dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Lu) getattr failed, error=%d\n",
|
||||
inode->i_sb->s_id,
|
||||
@@ -1227,7 +1236,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
else
|
||||
nfs_zap_caches(inode);
|
||||
}
|
||||
goto err_out;
|
||||
goto out;
|
||||
}
|
||||
|
||||
status = nfs_refresh_inode(inode, fattr);
|
||||
@@ -1235,20 +1244,18 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
||||
dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Lu) refresh failed, error=%d\n",
|
||||
inode->i_sb->s_id,
|
||||
(unsigned long long)NFS_FILEID(inode), status);
|
||||
goto err_out;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (nfsi->cache_validity & NFS_INO_INVALID_ACL)
|
||||
nfs_zap_acl_cache(inode);
|
||||
|
||||
nfs_setsecurity(inode, fattr, label);
|
||||
nfs_setsecurity(inode, fattr);
|
||||
|
||||
dfprintk(PAGECACHE, "NFS: (%s/%Lu) revalidation complete\n",
|
||||
inode->i_sb->s_id,
|
||||
(unsigned long long)NFS_FILEID(inode));
|
||||
|
||||
err_out:
|
||||
nfs4_label_free(label);
|
||||
out:
|
||||
nfs_free_fattr(fattr);
|
||||
trace_nfs_revalidate_inode_exit(inode, status);
|
||||
@@ -1446,13 +1453,12 @@ static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
&& (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
||||
&& timespec64_equal(&ts, &fattr->pre_mtime)) {
|
||||
inode->i_mtime = fattr->mtime;
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
||||
}
|
||||
if ((fattr->valid & NFS_ATTR_FATTR_PRESIZE)
|
||||
&& (fattr->valid & NFS_ATTR_FATTR_SIZE)
|
||||
&& i_size_read(inode) == nfs_size_to_loff_t(fattr->pre_size)
|
||||
&& !nfs_have_writebacks(inode)) {
|
||||
trace_nfs_size_wcc(inode, fattr->size);
|
||||
i_size_write(inode, nfs_size_to_loff_t(fattr->size));
|
||||
}
|
||||
}
|
||||
@@ -1580,12 +1586,31 @@ struct nfs_fattr *nfs_alloc_fattr(void)
|
||||
struct nfs_fattr *fattr;
|
||||
|
||||
fattr = kmalloc(sizeof(*fattr), GFP_NOFS);
|
||||
if (fattr != NULL)
|
||||
if (fattr != NULL) {
|
||||
nfs_fattr_init(fattr);
|
||||
fattr->label = NULL;
|
||||
}
|
||||
return fattr;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_alloc_fattr);
|
||||
|
||||
struct nfs_fattr *nfs_alloc_fattr_with_label(struct nfs_server *server)
|
||||
{
|
||||
struct nfs_fattr *fattr = nfs_alloc_fattr();
|
||||
|
||||
if (!fattr)
|
||||
return NULL;
|
||||
|
||||
fattr->label = nfs4_label_alloc(server, GFP_NOFS);
|
||||
if (IS_ERR(fattr->label)) {
|
||||
kfree(fattr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fattr;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_alloc_fattr_with_label);
|
||||
|
||||
struct nfs_fh *nfs_alloc_fhandle(void)
|
||||
{
|
||||
struct nfs_fh *fh;
|
||||
@@ -1777,8 +1802,10 @@ static int nfs_inode_finish_partial_attr_update(const struct nfs_fattr *fattr,
|
||||
NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_OTHER |
|
||||
NFS_INO_INVALID_NLINK;
|
||||
unsigned long cache_validity = NFS_I(inode)->cache_validity;
|
||||
enum nfs4_change_attr_type ctype = NFS_SERVER(inode)->change_attr_type;
|
||||
|
||||
if (!(cache_validity & NFS_INO_INVALID_CHANGE) &&
|
||||
if (ctype != NFS4_CHANGE_TYPE_IS_UNDEFINED &&
|
||||
!(cache_validity & NFS_INO_INVALID_CHANGE) &&
|
||||
(cache_validity & check_valid) != 0 &&
|
||||
(fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
|
||||
nfs_inode_attrs_cmp_monotonic(fattr, inode) == 0)
|
||||
@@ -2095,16 +2122,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
/* Do we perhaps have any outstanding writes, or has
|
||||
* the file grown beyond our last write? */
|
||||
if (!nfs_have_writebacks(inode) || new_isize > cur_isize) {
|
||||
trace_nfs_size_update(inode, new_isize);
|
||||
i_size_write(inode, new_isize);
|
||||
if (!have_writers)
|
||||
invalid |= NFS_INO_INVALID_DATA;
|
||||
}
|
||||
dprintk("NFS: isize change on server for file %s/%ld "
|
||||
"(%Ld to %Ld)\n",
|
||||
inode->i_sb->s_id,
|
||||
inode->i_ino,
|
||||
(long long)cur_isize,
|
||||
(long long)new_isize);
|
||||
}
|
||||
if (new_isize == 0 &&
|
||||
!(fattr->valid & (NFS_ATTR_FATTR_SPACE_USED |
|
||||
@@ -2155,11 +2177,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
save_cache_validity & NFS_INO_INVALID_OTHER;
|
||||
|
||||
if (fattr->valid & NFS_ATTR_FATTR_NLINK) {
|
||||
if (inode->i_nlink != fattr->nlink) {
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
invalid |= NFS_INO_INVALID_DATA;
|
||||
if (inode->i_nlink != fattr->nlink)
|
||||
set_nlink(inode, fattr->nlink);
|
||||
}
|
||||
} else if (fattr_supported & NFS_ATTR_FATTR_NLINK)
|
||||
nfsi->cache_validity |=
|
||||
save_cache_validity & NFS_INO_INVALID_NLINK;
|
||||
@@ -2260,14 +2279,7 @@ static void init_once(void *foo)
|
||||
INIT_LIST_HEAD(&nfsi->open_files);
|
||||
INIT_LIST_HEAD(&nfsi->access_cache_entry_lru);
|
||||
INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
|
||||
INIT_LIST_HEAD(&nfsi->commit_info.list);
|
||||
atomic_long_set(&nfsi->nrequests, 0);
|
||||
atomic_long_set(&nfsi->commit_info.ncommit, 0);
|
||||
atomic_set(&nfsi->commit_info.rpcs_out, 0);
|
||||
init_rwsem(&nfsi->rmdir_sem);
|
||||
mutex_init(&nfsi->commit_mutex);
|
||||
nfs4_init_once(nfsi);
|
||||
nfsi->cache_change_attribute = 0;
|
||||
}
|
||||
|
||||
static int __init nfs_init_inodecache(void)
|
||||
|
||||
@@ -193,7 +193,7 @@ extern void nfs_clients_exit(struct net *net);
|
||||
extern struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *);
|
||||
int nfs_create_rpc_client(struct nfs_client *, const struct nfs_client_initdata *, rpc_authflavor_t);
|
||||
struct nfs_client *nfs_get_client(const struct nfs_client_initdata *);
|
||||
int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *, struct nfs_fattr *);
|
||||
int nfs_probe_server(struct nfs_server *, struct nfs_fh *);
|
||||
void nfs_server_insert_lists(struct nfs_server *);
|
||||
void nfs_server_remove_lists(struct nfs_server *);
|
||||
void nfs_init_timeout_values(struct rpc_timeout *to, int proto, int timeo, int retrans);
|
||||
@@ -209,6 +209,7 @@ extern struct nfs_client *
|
||||
nfs4_find_client_sessionid(struct net *, const struct sockaddr *,
|
||||
struct nfs4_sessionid *, u32);
|
||||
extern struct nfs_server *nfs_create_server(struct fs_context *);
|
||||
extern void nfs4_server_set_init_caps(struct nfs_server *);
|
||||
extern struct nfs_server *nfs4_create_server(struct fs_context *);
|
||||
extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);
|
||||
extern int nfs4_update_server(struct nfs_server *server, const char *hostname,
|
||||
@@ -341,14 +342,6 @@ nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
|
||||
|
||||
return dst;
|
||||
}
|
||||
static inline void nfs4_label_free(struct nfs4_label *label)
|
||||
{
|
||||
if (label) {
|
||||
kfree(label->label);
|
||||
kfree(label);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
|
||||
{
|
||||
@@ -357,7 +350,6 @@ static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
|
||||
}
|
||||
#else
|
||||
static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; }
|
||||
static inline void nfs4_label_free(void *label) {}
|
||||
static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -308,8 +308,7 @@ int nfs_submount(struct fs_context *fc, struct nfs_server *server)
|
||||
|
||||
/* Look it up again to get its attributes */
|
||||
err = server->nfs_client->rpc_ops->lookup(d_inode(parent), dentry,
|
||||
ctx->mntfh, ctx->clone_data.fattr,
|
||||
NULL);
|
||||
ctx->mntfh, ctx->clone_data.fattr);
|
||||
dput(parent);
|
||||
if (err != 0)
|
||||
return err;
|
||||
|
||||
@@ -100,8 +100,7 @@ nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
*/
|
||||
static int
|
||||
nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||
struct inode *inode)
|
||||
struct nfs_fattr *fattr, struct inode *inode)
|
||||
{
|
||||
struct rpc_message msg = {
|
||||
.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR],
|
||||
@@ -193,8 +192,7 @@ __nfs3_proc_lookup(struct inode *dir, const char *name, size_t len,
|
||||
|
||||
static int
|
||||
nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
||||
{
|
||||
unsigned short task_flags = 0;
|
||||
|
||||
@@ -209,7 +207,7 @@ nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
|
||||
}
|
||||
|
||||
static int nfs3_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
const char dotdot[] = "..";
|
||||
const size_t len = strlen(dotdot);
|
||||
@@ -323,7 +321,7 @@ nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata
|
||||
if (status != 0)
|
||||
return ERR_PTR(status);
|
||||
|
||||
return nfs_add_or_obtain(dentry, data->res.fh, data->res.fattr, NULL);
|
||||
return nfs_add_or_obtain(dentry, data->res.fh, data->res.fattr);
|
||||
}
|
||||
|
||||
static void nfs3_free_createdata(struct nfs3_createdata *data)
|
||||
|
||||
@@ -2227,7 +2227,7 @@ static int decode_fsinfo3resok(struct xdr_stream *xdr,
|
||||
|
||||
/* ignore properties */
|
||||
result->lease_time = 0;
|
||||
result->change_attr_type = NFS4_CHANGE_TYPE_IS_TIME_METADATA;
|
||||
result->change_attr_type = NFS4_CHANGE_TYPE_IS_UNDEFINED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,10 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
|
||||
status = nfs_post_op_update_inode_force_wcc(inode,
|
||||
res.falloc_fattr);
|
||||
|
||||
if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_ALLOCATE])
|
||||
trace_nfs4_fallocate(inode, &args, status);
|
||||
else
|
||||
trace_nfs4_deallocate(inode, &args, status);
|
||||
kfree(res.falloc_fattr);
|
||||
return status;
|
||||
}
|
||||
@@ -363,6 +367,7 @@ static ssize_t _nfs42_proc_copy(struct file *src,
|
||||
|
||||
status = nfs4_call_sync(dst_server->client, dst_server, &msg,
|
||||
&args->seq_args, &res->seq_res, 0);
|
||||
trace_nfs4_copy(src_inode, dst_inode, args, res, nss, status);
|
||||
if (status == -ENOTSUPP)
|
||||
dst_server->caps &= ~NFS_CAP_COPY;
|
||||
if (status)
|
||||
@@ -504,6 +509,7 @@ static void nfs42_offload_cancel_done(struct rpc_task *task, void *calldata)
|
||||
{
|
||||
struct nfs42_offloadcancel_data *data = calldata;
|
||||
|
||||
trace_nfs4_offload_cancel(&data->args, task->tk_status);
|
||||
nfs41_sequence_done(task, &data->res.osr_seq_res);
|
||||
if (task->tk_status &&
|
||||
nfs4_async_handle_error(task, data->seq_server, NULL,
|
||||
@@ -598,6 +604,7 @@ static int _nfs42_proc_copy_notify(struct file *src, struct file *dst,
|
||||
|
||||
status = nfs4_call_sync(src_server->client, src_server, &msg,
|
||||
&args->cna_seq_args, &res->cnr_seq_res, 0);
|
||||
trace_nfs4_copy_notify(file_inode(src), args, res, status);
|
||||
if (status == -ENOTSUPP)
|
||||
src_server->caps &= ~NFS_CAP_COPY_NOTIFY;
|
||||
|
||||
@@ -678,6 +685,7 @@ static loff_t _nfs42_proc_llseek(struct file *filep,
|
||||
|
||||
status = nfs4_call_sync(server->client, server, &msg,
|
||||
&args.seq_args, &res.seq_res, 0);
|
||||
trace_nfs4_llseek(inode, &args, &res, status);
|
||||
if (status == -ENOTSUPP)
|
||||
server->caps &= ~NFS_CAP_SEEK;
|
||||
if (status)
|
||||
@@ -1071,6 +1079,7 @@ static int _nfs42_proc_clone(struct rpc_message *msg, struct file *src_f,
|
||||
|
||||
status = nfs4_call_sync(server->client, server, msg,
|
||||
&args.seq_args, &res.seq_res, 0);
|
||||
trace_nfs4_clone(src_inode, dst_inode, &args, status);
|
||||
if (status == 0) {
|
||||
nfs42_copy_dest_done(dst_inode, dst_offset, count);
|
||||
status = nfs_post_op_update_inode(dst_inode, res.dst_fattr);
|
||||
|
||||
@@ -234,7 +234,6 @@ struct nfs4_opendata {
|
||||
struct nfs4_string group_name;
|
||||
struct nfs4_label *a_label;
|
||||
struct nfs_fattr f_attr;
|
||||
struct nfs4_label *f_label;
|
||||
struct dentry *dir;
|
||||
struct dentry *dentry;
|
||||
struct nfs4_state_owner *owner;
|
||||
@@ -317,8 +316,7 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid,
|
||||
const struct nfs_lock_context *l_ctx,
|
||||
fmode_t fmode);
|
||||
extern int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||
struct inode *inode);
|
||||
struct nfs_fattr *fattr, struct inode *inode);
|
||||
extern int update_open_stateid(struct nfs4_state *state,
|
||||
const nfs4_stateid *open_stateid,
|
||||
const nfs4_stateid *deleg_stateid,
|
||||
|
||||
@@ -1059,31 +1059,15 @@ static void nfs4_session_limit_xasize(struct nfs_server *server)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
struct nfs_fh *mntfh, bool auth_probe)
|
||||
void nfs4_server_set_init_caps(struct nfs_server *server)
|
||||
{
|
||||
struct nfs_fattr *fattr;
|
||||
int error;
|
||||
|
||||
/* data servers support only a subset of NFSv4.1 */
|
||||
if (is_ds_only_client(server->nfs_client))
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
if (fattr == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* We must ensure the session is initialised first */
|
||||
error = nfs4_init_session(server->nfs_client);
|
||||
if (error < 0)
|
||||
goto out;
|
||||
|
||||
/* Set the basic capabilities */
|
||||
server->caps |= server->nfs_client->cl_mvops->init_caps;
|
||||
if (server->flags & NFS_MOUNT_NORDIRPLUS)
|
||||
server->caps &= ~NFS_CAP_READDIRPLUS;
|
||||
if (server->nfs_client->cl_proto == XPRT_TRANSPORT_RDMA)
|
||||
server->caps &= ~NFS_CAP_READ_PLUS;
|
||||
|
||||
/*
|
||||
* Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower
|
||||
* authentication.
|
||||
@@ -1091,7 +1075,23 @@ static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
if (nfs4_disable_idmapping &&
|
||||
server->client->cl_auth->au_flavor == RPC_AUTH_UNIX)
|
||||
server->caps |= NFS_CAP_UIDGID_NOMAP;
|
||||
}
|
||||
|
||||
static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
struct nfs_fh *mntfh, bool auth_probe)
|
||||
{
|
||||
int error;
|
||||
|
||||
/* data servers support only a subset of NFSv4.1 */
|
||||
if (is_ds_only_client(server->nfs_client))
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
/* We must ensure the session is initialised first */
|
||||
error = nfs4_init_session(server->nfs_client);
|
||||
if (error < 0)
|
||||
goto out;
|
||||
|
||||
nfs4_server_set_init_caps(server);
|
||||
|
||||
/* Probe the root fh to retrieve its FSID and filehandle */
|
||||
error = nfs4_get_rootfh(server, mntfh, auth_probe);
|
||||
@@ -1103,7 +1103,7 @@ static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
(unsigned long long) server->fsid.minor);
|
||||
nfs_display_fhandle(mntfh, "Pseudo-fs root FH");
|
||||
|
||||
error = nfs_probe_fsinfo(server, mntfh, fattr);
|
||||
error = nfs_probe_server(server, mntfh);
|
||||
if (error < 0)
|
||||
goto out;
|
||||
|
||||
@@ -1117,7 +1117,6 @@ static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
server->mount_time = jiffies;
|
||||
server->destroy = nfs4_destroy_server;
|
||||
out:
|
||||
nfs_free_fattr(fattr);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -1288,30 +1287,6 @@ error:
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Grab the destination's particulars, including lease expiry time.
|
||||
*
|
||||
* Returns zero if probe succeeded and retrieved FSID matches the FSID
|
||||
* we have cached.
|
||||
*/
|
||||
static int nfs_probe_destination(struct nfs_server *server)
|
||||
{
|
||||
struct inode *inode = d_inode(server->super->s_root);
|
||||
struct nfs_fattr *fattr;
|
||||
int error;
|
||||
|
||||
fattr = nfs_alloc_fattr();
|
||||
if (fattr == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Sanity: the probe won't work if the destination server
|
||||
* does not recognize the migrated FH. */
|
||||
error = nfs_probe_fsinfo(server, NFS_FH(inode), fattr);
|
||||
|
||||
nfs_free_fattr(fattr);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs4_update_server - Move an nfs_server to a different nfs_client
|
||||
*
|
||||
@@ -1372,5 +1347,5 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,
|
||||
server->nfs_client->cl_hostname = kstrdup(hostname, GFP_KERNEL);
|
||||
nfs_server_insert_lists(server);
|
||||
|
||||
return nfs_probe_destination(server);
|
||||
return nfs_probe_server(server, NFS_FH(d_inode(server->super->s_root)));
|
||||
}
|
||||
|
||||
@@ -317,7 +317,7 @@ static int read_name_gen = 1;
|
||||
static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt,
|
||||
struct nfs_fh *src_fh, nfs4_stateid *stateid)
|
||||
{
|
||||
struct nfs_fattr fattr;
|
||||
struct nfs_fattr *fattr = nfs_alloc_fattr();
|
||||
struct file *filep, *res;
|
||||
struct nfs_server *server;
|
||||
struct inode *r_ino = NULL;
|
||||
@@ -328,9 +328,10 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt,
|
||||
|
||||
server = NFS_SERVER(ss_mnt->mnt_root->d_inode);
|
||||
|
||||
nfs_fattr_init(&fattr);
|
||||
if (!fattr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
status = nfs4_proc_getattr(server, src_fh, &fattr, NULL, NULL);
|
||||
status = nfs4_proc_getattr(server, src_fh, fattr, NULL);
|
||||
if (status < 0) {
|
||||
res = ERR_PTR(status);
|
||||
goto out;
|
||||
@@ -343,20 +344,18 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt,
|
||||
goto out;
|
||||
snprintf(read_name, len, SSC_READ_NAME_BODY, read_name_gen++);
|
||||
|
||||
r_ino = nfs_fhget(ss_mnt->mnt_root->d_inode->i_sb, src_fh, &fattr,
|
||||
NULL);
|
||||
r_ino = nfs_fhget(ss_mnt->mnt_root->d_inode->i_sb, src_fh, fattr);
|
||||
if (IS_ERR(r_ino)) {
|
||||
res = ERR_CAST(r_ino);
|
||||
goto out_free_name;
|
||||
}
|
||||
|
||||
filep = alloc_file_pseudo(r_ino, ss_mnt, read_name, FMODE_READ,
|
||||
filep = alloc_file_pseudo(r_ino, ss_mnt, read_name, O_RDONLY,
|
||||
r_ino->i_fop);
|
||||
if (IS_ERR(filep)) {
|
||||
res = ERR_CAST(filep);
|
||||
goto out_free_name;
|
||||
}
|
||||
filep->f_mode |= FMODE_READ;
|
||||
|
||||
ctx = alloc_nfs_open_context(filep->f_path.dentry, filep->f_mode,
|
||||
filep);
|
||||
@@ -388,6 +387,7 @@ static struct file *__nfs42_ssc_open(struct vfsmount *ss_mnt,
|
||||
out_free_name:
|
||||
kfree(read_name);
|
||||
out:
|
||||
nfs_free_fattr(fattr);
|
||||
return res;
|
||||
out_stateowner:
|
||||
nfs4_put_state_owner(sp);
|
||||
|
||||
@@ -487,7 +487,7 @@ nfs_idmap_new(struct nfs_client *clp)
|
||||
err_destroy_pipe:
|
||||
rpc_destroy_pipe_data(idmap->idmap_pipe);
|
||||
err:
|
||||
get_user_ns(idmap->user_ns);
|
||||
put_user_ns(idmap->user_ns);
|
||||
kfree(idmap);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -93,11 +93,11 @@ struct nfs4_opendata;
|
||||
static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
|
||||
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
||||
static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
|
||||
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode);
|
||||
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct inode *inode);
|
||||
static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
|
||||
struct nfs_fattr *fattr, struct iattr *sattr,
|
||||
struct nfs_open_context *ctx, struct nfs4_label *ilabel,
|
||||
struct nfs4_label *olabel);
|
||||
struct nfs_open_context *ctx, struct nfs4_label *ilabel);
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
|
||||
const struct cred *cred,
|
||||
@@ -1330,7 +1330,6 @@ nfs4_map_atomic_open_claim(struct nfs_server *server,
|
||||
static void nfs4_init_opendata_res(struct nfs4_opendata *p)
|
||||
{
|
||||
p->o_res.f_attr = &p->f_attr;
|
||||
p->o_res.f_label = p->f_label;
|
||||
p->o_res.seqid = p->o_arg.seqid;
|
||||
p->c_res.seqid = p->c_arg.seqid;
|
||||
p->o_res.server = p->o_arg.server;
|
||||
@@ -1356,8 +1355,8 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
||||
if (p == NULL)
|
||||
goto err;
|
||||
|
||||
p->f_label = nfs4_label_alloc(server, gfp_mask);
|
||||
if (IS_ERR(p->f_label))
|
||||
p->f_attr.label = nfs4_label_alloc(server, gfp_mask);
|
||||
if (IS_ERR(p->f_attr.label))
|
||||
goto err_free_p;
|
||||
|
||||
p->a_label = nfs4_label_alloc(server, gfp_mask);
|
||||
@@ -1389,27 +1388,22 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
||||
sizeof(p->o_arg.u.verifier.data));
|
||||
}
|
||||
}
|
||||
/* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS
|
||||
* will return permission denied for all bits until close */
|
||||
if (!(flags & O_EXCL)) {
|
||||
/* ask server to check for all possible rights as results
|
||||
* are cached */
|
||||
switch (p->o_arg.claim) {
|
||||
default:
|
||||
break;
|
||||
case NFS4_OPEN_CLAIM_NULL:
|
||||
case NFS4_OPEN_CLAIM_FH:
|
||||
p->o_arg.access = NFS4_ACCESS_READ |
|
||||
NFS4_ACCESS_MODIFY |
|
||||
NFS4_ACCESS_EXTEND |
|
||||
NFS4_ACCESS_EXECUTE;
|
||||
/* ask server to check for all possible rights as results
|
||||
* are cached */
|
||||
switch (p->o_arg.claim) {
|
||||
default:
|
||||
break;
|
||||
case NFS4_OPEN_CLAIM_NULL:
|
||||
case NFS4_OPEN_CLAIM_FH:
|
||||
p->o_arg.access = NFS4_ACCESS_READ | NFS4_ACCESS_MODIFY |
|
||||
NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE |
|
||||
NFS4_ACCESS_EXECUTE;
|
||||
#ifdef CONFIG_NFS_V4_2
|
||||
if (server->caps & NFS_CAP_XATTR)
|
||||
p->o_arg.access |= NFS4_ACCESS_XAREAD |
|
||||
NFS4_ACCESS_XAWRITE |
|
||||
NFS4_ACCESS_XALIST;
|
||||
if (!(server->caps & NFS_CAP_XATTR))
|
||||
break;
|
||||
p->o_arg.access |= NFS4_ACCESS_XAREAD | NFS4_ACCESS_XAWRITE |
|
||||
NFS4_ACCESS_XALIST;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
p->o_arg.clientid = server->nfs_client->cl_clientid;
|
||||
p->o_arg.id.create_time = ktime_to_ns(sp->so_seqid.create_time);
|
||||
@@ -1440,7 +1434,7 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
||||
err_free_label:
|
||||
nfs4_label_free(p->a_label);
|
||||
err_free_f:
|
||||
nfs4_label_free(p->f_label);
|
||||
nfs4_label_free(p->f_attr.label);
|
||||
err_free_p:
|
||||
kfree(p);
|
||||
err:
|
||||
@@ -1462,7 +1456,7 @@ static void nfs4_opendata_free(struct kref *kref)
|
||||
nfs4_put_state_owner(p->owner);
|
||||
|
||||
nfs4_label_free(p->a_label);
|
||||
nfs4_label_free(p->f_label);
|
||||
nfs4_label_free(p->f_attr.label);
|
||||
|
||||
dput(p->dir);
|
||||
dput(p->dentry);
|
||||
@@ -1610,15 +1604,16 @@ static bool nfs_stateid_is_sequential(struct nfs4_state *state,
|
||||
{
|
||||
if (test_bit(NFS_OPEN_STATE, &state->flags)) {
|
||||
/* The common case - we're updating to a new sequence number */
|
||||
if (nfs4_stateid_match_other(stateid, &state->open_stateid) &&
|
||||
nfs4_stateid_is_next(&state->open_stateid, stateid)) {
|
||||
return true;
|
||||
if (nfs4_stateid_match_other(stateid, &state->open_stateid)) {
|
||||
if (nfs4_stateid_is_next(&state->open_stateid, stateid))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
/* This is the first OPEN in this generation */
|
||||
if (stateid->seqid == cpu_to_be32(1))
|
||||
return true;
|
||||
/* The server returned a new stateid */
|
||||
}
|
||||
/* This is the first OPEN in this generation */
|
||||
if (stateid->seqid == cpu_to_be32(1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2014,7 +2009,7 @@ nfs4_opendata_get_inode(struct nfs4_opendata *data)
|
||||
if (!(data->f_attr.valid & NFS_ATTR_FATTR))
|
||||
return ERR_PTR(-EAGAIN);
|
||||
inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh,
|
||||
&data->f_attr, data->f_label);
|
||||
&data->f_attr);
|
||||
break;
|
||||
default:
|
||||
inode = d_inode(data->dentry);
|
||||
@@ -2473,11 +2468,15 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
||||
/* Set the create mode (note dependency on the session type) */
|
||||
data->o_arg.createmode = NFS4_CREATE_UNCHECKED;
|
||||
if (data->o_arg.open_flags & O_EXCL) {
|
||||
data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE;
|
||||
if (nfs4_has_persistent_session(clp))
|
||||
data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1;
|
||||
if (clp->cl_mvops->minor_version == 0) {
|
||||
data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE;
|
||||
/* don't put an ACCESS op in OPEN compound if O_EXCL,
|
||||
* because ACCESS will return permission denied for
|
||||
* all bits until close */
|
||||
data->o_res.access_request = data->o_arg.access = 0;
|
||||
} else if (nfs4_has_persistent_session(clp))
|
||||
data->o_arg.createmode = NFS4_CREATE_GUARDED;
|
||||
else if (clp->cl_mvops->minor_version > 0)
|
||||
data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1;
|
||||
}
|
||||
return;
|
||||
unlock_no_action:
|
||||
@@ -2709,8 +2708,7 @@ static int _nfs4_proc_open(struct nfs4_opendata *data,
|
||||
}
|
||||
if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
|
||||
nfs4_sequence_free_slot(&o_res->seq_res);
|
||||
nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr,
|
||||
o_res->f_label, NULL);
|
||||
nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -3126,7 +3124,6 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL;
|
||||
struct iattr *sattr = c->sattr;
|
||||
struct nfs4_label *label = c->label;
|
||||
struct nfs4_label *olabel = NULL;
|
||||
int status;
|
||||
|
||||
/* Protect against reboot recovery conflicts */
|
||||
@@ -3149,19 +3146,11 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
if (opendata == NULL)
|
||||
goto err_put_state_owner;
|
||||
|
||||
if (label) {
|
||||
olabel = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(olabel)) {
|
||||
status = PTR_ERR(olabel);
|
||||
goto err_opendata_put;
|
||||
}
|
||||
}
|
||||
|
||||
if (server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) {
|
||||
if (!opendata->f_attr.mdsthreshold) {
|
||||
opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc();
|
||||
if (!opendata->f_attr.mdsthreshold)
|
||||
goto err_free_label;
|
||||
goto err_opendata_put;
|
||||
}
|
||||
opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0];
|
||||
}
|
||||
@@ -3170,7 +3159,7 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
|
||||
status = _nfs4_open_and_get_state(opendata, flags, ctx);
|
||||
if (status != 0)
|
||||
goto err_free_label;
|
||||
goto err_opendata_put;
|
||||
state = ctx->state;
|
||||
|
||||
if ((opendata->o_arg.open_flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) &&
|
||||
@@ -3187,11 +3176,11 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
nfs_fattr_init(opendata->o_res.f_attr);
|
||||
status = nfs4_do_setattr(state->inode, cred,
|
||||
opendata->o_res.f_attr, sattr,
|
||||
ctx, label, olabel);
|
||||
ctx, label);
|
||||
if (status == 0) {
|
||||
nfs_setattr_update_inode(state->inode, sattr,
|
||||
opendata->o_res.f_attr);
|
||||
nfs_setsecurity(state->inode, opendata->o_res.f_attr, olabel);
|
||||
nfs_setsecurity(state->inode, opendata->o_res.f_attr);
|
||||
}
|
||||
sattr->ia_valid = ia_old;
|
||||
}
|
||||
@@ -3204,13 +3193,9 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
opendata->f_attr.mdsthreshold = NULL;
|
||||
}
|
||||
|
||||
nfs4_label_free(olabel);
|
||||
|
||||
nfs4_opendata_put(opendata);
|
||||
nfs4_put_state_owner(sp);
|
||||
return 0;
|
||||
err_free_label:
|
||||
nfs4_label_free(olabel);
|
||||
err_opendata_put:
|
||||
nfs4_opendata_put(opendata);
|
||||
err_put_state_owner:
|
||||
@@ -3355,8 +3340,7 @@ zero_stateid:
|
||||
|
||||
static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
|
||||
struct nfs_fattr *fattr, struct iattr *sattr,
|
||||
struct nfs_open_context *ctx, struct nfs4_label *ilabel,
|
||||
struct nfs4_label *olabel)
|
||||
struct nfs_open_context *ctx, struct nfs4_label *ilabel)
|
||||
{
|
||||
struct nfs_server *server = NFS_SERVER(inode);
|
||||
__u32 bitmask[NFS4_BITMASK_SZ];
|
||||
@@ -3370,7 +3354,6 @@ static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
|
||||
};
|
||||
struct nfs_setattrres res = {
|
||||
.fattr = fattr,
|
||||
.label = olabel,
|
||||
.server = server,
|
||||
};
|
||||
struct nfs4_exception exception = {
|
||||
@@ -3387,7 +3370,7 @@ static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
|
||||
adjust_flags |= NFS_INO_INVALID_OTHER;
|
||||
|
||||
do {
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, olabel),
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, fattr->label),
|
||||
inode, adjust_flags);
|
||||
|
||||
err = _nfs4_do_setattr(inode, &arg, &res, cred, ctx);
|
||||
@@ -3562,7 +3545,6 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
|
||||
.stateid = &calldata->arg.stateid,
|
||||
};
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
if (!nfs4_sequence_done(task, &calldata->res.seq_res))
|
||||
return;
|
||||
trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status);
|
||||
@@ -3617,7 +3599,7 @@ out_release:
|
||||
task->tk_status = 0;
|
||||
nfs_release_seqid(calldata->arg.seqid);
|
||||
nfs_refresh_inode(calldata->inode, &calldata->fattr);
|
||||
dprintk("%s: done, ret = %d!\n", __func__, task->tk_status);
|
||||
dprintk("%s: ret = %d\n", __func__, task->tk_status);
|
||||
return;
|
||||
out_restart:
|
||||
task->tk_status = 0;
|
||||
@@ -3635,7 +3617,6 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
|
||||
bool is_rdonly, is_wronly, is_rdwr;
|
||||
int call_close = 0;
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
|
||||
goto out_wait;
|
||||
|
||||
@@ -3709,7 +3690,6 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
|
||||
&calldata->res.seq_res,
|
||||
task) != 0)
|
||||
nfs_release_seqid(calldata->arg.seqid);
|
||||
dprintk("%s: done!\n", __func__);
|
||||
return;
|
||||
out_no_action:
|
||||
task->tk_action = NULL;
|
||||
@@ -3942,6 +3922,8 @@ int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
|
||||
.interruptible = true,
|
||||
};
|
||||
int err;
|
||||
|
||||
nfs4_server_set_init_caps(server);
|
||||
do {
|
||||
err = nfs4_handle_exception(server,
|
||||
_nfs4_server_capabilities(server, fhandle),
|
||||
@@ -4105,7 +4087,6 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
|
||||
{
|
||||
int error;
|
||||
struct nfs_fattr *fattr = info->fattr;
|
||||
struct nfs4_label *label = fattr->label;
|
||||
|
||||
error = nfs4_server_capabilities(server, mntfh);
|
||||
if (error < 0) {
|
||||
@@ -4113,7 +4094,7 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
|
||||
return error;
|
||||
}
|
||||
|
||||
error = nfs4_proc_getattr(server, mntfh, fattr, label, NULL);
|
||||
error = nfs4_proc_getattr(server, mntfh, fattr, NULL);
|
||||
if (error < 0) {
|
||||
dprintk("nfs4_get_root: getattr error = %d\n", -error);
|
||||
goto out;
|
||||
@@ -4176,8 +4157,7 @@ out:
|
||||
}
|
||||
|
||||
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||
struct inode *inode)
|
||||
struct nfs_fattr *fattr, struct inode *inode)
|
||||
{
|
||||
__u32 bitmask[NFS4_BITMASK_SZ];
|
||||
struct nfs4_getattr_arg args = {
|
||||
@@ -4186,7 +4166,6 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
};
|
||||
struct nfs4_getattr_res res = {
|
||||
.fattr = fattr,
|
||||
.label = label,
|
||||
.server = server,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
@@ -4203,7 +4182,7 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
|
||||
task_flags |= RPC_TASK_TIMEOUT;
|
||||
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, label), inode, 0);
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, fattr->label), inode, 0);
|
||||
nfs_fattr_init(fattr);
|
||||
nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
|
||||
return nfs4_do_call_sync(server->client, server, &msg,
|
||||
@@ -4211,15 +4190,14 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
}
|
||||
|
||||
int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||
struct inode *inode)
|
||||
struct nfs_fattr *fattr, struct inode *inode)
|
||||
{
|
||||
struct nfs4_exception exception = {
|
||||
.interruptible = true,
|
||||
};
|
||||
int err;
|
||||
do {
|
||||
err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
|
||||
err = _nfs4_proc_getattr(server, fhandle, fattr, inode);
|
||||
trace_nfs4_getattr(server, fhandle, fattr, err);
|
||||
err = nfs4_handle_exception(server, err,
|
||||
&exception);
|
||||
@@ -4251,7 +4229,6 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
||||
struct inode *inode = d_inode(dentry);
|
||||
const struct cred *cred = NULL;
|
||||
struct nfs_open_context *ctx = NULL;
|
||||
struct nfs4_label *label = NULL;
|
||||
int status;
|
||||
|
||||
if (pnfs_ld_layoutret_on_setattr(inode) &&
|
||||
@@ -4277,26 +4254,21 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
||||
cred = ctx->cred;
|
||||
}
|
||||
|
||||
label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
|
||||
if (IS_ERR(label))
|
||||
return PTR_ERR(label);
|
||||
|
||||
/* Return any delegations if we're going to change ACLs */
|
||||
if ((sattr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0)
|
||||
nfs4_inode_make_writeable(inode);
|
||||
|
||||
status = nfs4_do_setattr(inode, cred, fattr, sattr, ctx, NULL, label);
|
||||
status = nfs4_do_setattr(inode, cred, fattr, sattr, ctx, NULL);
|
||||
if (status == 0) {
|
||||
nfs_setattr_update_inode(inode, sattr, fattr);
|
||||
nfs_setsecurity(inode, fattr, label);
|
||||
nfs_setsecurity(inode, fattr);
|
||||
}
|
||||
nfs4_label_free(label);
|
||||
return status;
|
||||
}
|
||||
|
||||
static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
|
||||
struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs_server *server = NFS_SERVER(dir);
|
||||
int status;
|
||||
@@ -4308,7 +4280,6 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
|
||||
struct nfs4_lookup_res res = {
|
||||
.server = server,
|
||||
.fattr = fattr,
|
||||
.label = label,
|
||||
.fh = fhandle,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
@@ -4325,7 +4296,7 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
|
||||
if (nfs_lookup_is_soft_revalidate(dentry))
|
||||
task_flags |= RPC_TASK_TIMEOUT;
|
||||
|
||||
args.bitmask = nfs4_bitmask(server, label);
|
||||
args.bitmask = nfs4_bitmask(server, fattr->label);
|
||||
|
||||
nfs_fattr_init(fattr);
|
||||
|
||||
@@ -4347,7 +4318,7 @@ static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr)
|
||||
|
||||
static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
|
||||
struct dentry *dentry, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs4_exception exception = {
|
||||
.interruptible = true,
|
||||
@@ -4356,7 +4327,7 @@ static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
|
||||
const struct qstr *name = &dentry->d_name;
|
||||
int err;
|
||||
do {
|
||||
err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr, label);
|
||||
err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr);
|
||||
trace_nfs4_lookup(dir, name, err);
|
||||
switch (err) {
|
||||
case -NFS4ERR_BADNAME:
|
||||
@@ -4392,13 +4363,12 @@ out:
|
||||
}
|
||||
|
||||
static int nfs4_proc_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
||||
{
|
||||
int status;
|
||||
struct rpc_clnt *client = NFS_CLIENT(dir);
|
||||
|
||||
status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, label);
|
||||
status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr);
|
||||
if (client != NFS_CLIENT(dir)) {
|
||||
rpc_shutdown_client(client);
|
||||
nfs_fixup_secinfo_attributes(fattr);
|
||||
@@ -4413,15 +4383,14 @@ nfs4_proc_lookup_mountpoint(struct inode *dir, struct dentry *dentry,
|
||||
struct rpc_clnt *client = NFS_CLIENT(dir);
|
||||
int status;
|
||||
|
||||
status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, NULL);
|
||||
status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr);
|
||||
if (status < 0)
|
||||
return ERR_PTR(status);
|
||||
return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
|
||||
}
|
||||
|
||||
static int _nfs4_proc_lookupp(struct inode *inode,
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
||||
{
|
||||
struct rpc_clnt *clnt = NFS_CLIENT(inode);
|
||||
struct nfs_server *server = NFS_SERVER(inode);
|
||||
@@ -4433,7 +4402,6 @@ static int _nfs4_proc_lookupp(struct inode *inode,
|
||||
struct nfs4_lookupp_res res = {
|
||||
.server = server,
|
||||
.fattr = fattr,
|
||||
.label = label,
|
||||
.fh = fhandle,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
@@ -4446,7 +4414,7 @@ static int _nfs4_proc_lookupp(struct inode *inode,
|
||||
if (NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL)
|
||||
task_flags |= RPC_TASK_TIMEOUT;
|
||||
|
||||
args.bitmask = nfs4_bitmask(server, label);
|
||||
args.bitmask = nfs4_bitmask(server, fattr->label);
|
||||
|
||||
nfs_fattr_init(fattr);
|
||||
|
||||
@@ -4458,14 +4426,14 @@ static int _nfs4_proc_lookupp(struct inode *inode,
|
||||
}
|
||||
|
||||
static int nfs4_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs4_exception exception = {
|
||||
.interruptible = true,
|
||||
};
|
||||
int err;
|
||||
do {
|
||||
err = _nfs4_proc_lookupp(inode, fhandle, fattr, label);
|
||||
err = _nfs4_proc_lookupp(inode, fhandle, fattr);
|
||||
trace_nfs4_lookupp(inode, err);
|
||||
err = nfs4_handle_exception(NFS_SERVER(inode), err,
|
||||
&exception);
|
||||
@@ -4792,7 +4760,6 @@ static int _nfs4_proc_link(struct inode *inode, struct inode *dir, const struct
|
||||
};
|
||||
struct nfs4_link_res res = {
|
||||
.server = server,
|
||||
.label = NULL,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
|
||||
@@ -4801,18 +4768,12 @@ static int _nfs4_proc_link(struct inode *inode, struct inode *dir, const struct
|
||||
};
|
||||
int status = -ENOMEM;
|
||||
|
||||
res.fattr = nfs_alloc_fattr();
|
||||
res.fattr = nfs_alloc_fattr_with_label(server);
|
||||
if (res.fattr == NULL)
|
||||
goto out;
|
||||
|
||||
res.label = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(res.label)) {
|
||||
status = PTR_ERR(res.label);
|
||||
goto out;
|
||||
}
|
||||
|
||||
nfs4_inode_make_writeable(inode);
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, res.label), inode,
|
||||
nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, res.fattr->label), inode,
|
||||
NFS_INO_INVALID_CHANGE);
|
||||
status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
||||
if (!status) {
|
||||
@@ -4821,12 +4782,9 @@ static int _nfs4_proc_link(struct inode *inode, struct inode *dir, const struct
|
||||
nfs4_inc_nlink(inode);
|
||||
status = nfs_post_op_update_inode(inode, res.fattr);
|
||||
if (!status)
|
||||
nfs_setsecurity(inode, res.fattr, res.label);
|
||||
nfs_setsecurity(inode, res.fattr);
|
||||
}
|
||||
|
||||
|
||||
nfs4_label_free(res.label);
|
||||
|
||||
out:
|
||||
nfs_free_fattr(res.fattr);
|
||||
return status;
|
||||
@@ -4852,7 +4810,6 @@ struct nfs4_createdata {
|
||||
struct nfs4_create_res res;
|
||||
struct nfs_fh fh;
|
||||
struct nfs_fattr fattr;
|
||||
struct nfs4_label *label;
|
||||
};
|
||||
|
||||
static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
|
||||
@@ -4864,8 +4821,8 @@ static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
|
||||
if (data != NULL) {
|
||||
struct nfs_server *server = NFS_SERVER(dir);
|
||||
|
||||
data->label = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(data->label))
|
||||
data->fattr.label = nfs4_label_alloc(server, GFP_KERNEL);
|
||||
if (IS_ERR(data->fattr.label))
|
||||
goto out_free;
|
||||
|
||||
data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE];
|
||||
@@ -4876,12 +4833,11 @@ static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
|
||||
data->arg.name = name;
|
||||
data->arg.attrs = sattr;
|
||||
data->arg.ftype = ftype;
|
||||
data->arg.bitmask = nfs4_bitmask(server, data->label);
|
||||
data->arg.bitmask = nfs4_bitmask(server, data->fattr.label);
|
||||
data->arg.umask = current_umask();
|
||||
data->res.server = server;
|
||||
data->res.fh = &data->fh;
|
||||
data->res.fattr = &data->fattr;
|
||||
data->res.label = data->label;
|
||||
nfs_fattr_init(data->res.fattr);
|
||||
}
|
||||
return data;
|
||||
@@ -4903,14 +4859,14 @@ static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_
|
||||
data->res.fattr->time_start,
|
||||
NFS_INO_INVALID_DATA);
|
||||
spin_unlock(&dir->i_lock);
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, data->res.label);
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
static void nfs4_free_createdata(struct nfs4_createdata *data)
|
||||
{
|
||||
nfs4_label_free(data->label);
|
||||
nfs4_label_free(data->fattr.label);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
@@ -5348,8 +5304,6 @@ static bool nfs4_read_plus_not_supported(struct rpc_task *task,
|
||||
|
||||
static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
|
||||
{
|
||||
dprintk("--> %s\n", __func__);
|
||||
|
||||
if (!nfs4_sequence_done(task, &hdr->res.seq_res))
|
||||
return -EAGAIN;
|
||||
if (nfs4_read_stateid_changed(task, &hdr->args))
|
||||
@@ -6005,17 +5959,18 @@ static int _nfs4_get_security_label(struct inode *inode, void *buf,
|
||||
size_t buflen)
|
||||
{
|
||||
struct nfs_server *server = NFS_SERVER(inode);
|
||||
struct nfs_fattr fattr;
|
||||
struct nfs4_label label = {0, 0, buflen, buf};
|
||||
|
||||
u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL };
|
||||
struct nfs_fattr fattr = {
|
||||
.label = &label,
|
||||
};
|
||||
struct nfs4_getattr_arg arg = {
|
||||
.fh = NFS_FH(inode),
|
||||
.bitmask = bitmask,
|
||||
};
|
||||
struct nfs4_getattr_res res = {
|
||||
.fattr = &fattr,
|
||||
.label = &label,
|
||||
.server = server,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
@@ -6057,8 +6012,7 @@ static int nfs4_get_security_label(struct inode *inode, void *buf,
|
||||
|
||||
static int _nfs4_do_set_security_label(struct inode *inode,
|
||||
struct nfs4_label *ilabel,
|
||||
struct nfs_fattr *fattr,
|
||||
struct nfs4_label *olabel)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
|
||||
struct iattr sattr = {0};
|
||||
@@ -6073,7 +6027,6 @@ static int _nfs4_do_set_security_label(struct inode *inode,
|
||||
};
|
||||
struct nfs_setattrres res = {
|
||||
.fattr = fattr,
|
||||
.label = olabel,
|
||||
.server = server,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
@@ -6094,15 +6047,13 @@ static int _nfs4_do_set_security_label(struct inode *inode,
|
||||
|
||||
static int nfs4_do_set_security_label(struct inode *inode,
|
||||
struct nfs4_label *ilabel,
|
||||
struct nfs_fattr *fattr,
|
||||
struct nfs4_label *olabel)
|
||||
struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs4_exception exception = { };
|
||||
int err;
|
||||
|
||||
do {
|
||||
err = _nfs4_do_set_security_label(inode, ilabel,
|
||||
fattr, olabel);
|
||||
err = _nfs4_do_set_security_label(inode, ilabel, fattr);
|
||||
trace_nfs4_set_security_label(inode, err);
|
||||
err = nfs4_handle_exception(NFS_SERVER(inode), err,
|
||||
&exception);
|
||||
@@ -6113,32 +6064,21 @@ static int nfs4_do_set_security_label(struct inode *inode,
|
||||
static int
|
||||
nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen)
|
||||
{
|
||||
struct nfs4_label ilabel, *olabel = NULL;
|
||||
struct nfs_fattr fattr;
|
||||
struct nfs4_label ilabel = {0, 0, buflen, (char *)buf };
|
||||
struct nfs_fattr *fattr;
|
||||
int status;
|
||||
|
||||
if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
nfs_fattr_init(&fattr);
|
||||
fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
|
||||
if (fattr == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ilabel.pi = 0;
|
||||
ilabel.lfs = 0;
|
||||
ilabel.label = (char *)buf;
|
||||
ilabel.len = buflen;
|
||||
|
||||
olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
|
||||
if (IS_ERR(olabel)) {
|
||||
status = -PTR_ERR(olabel);
|
||||
goto out;
|
||||
}
|
||||
|
||||
status = nfs4_do_set_security_label(inode, &ilabel, &fattr, olabel);
|
||||
status = nfs4_do_set_security_label(inode, &ilabel, fattr);
|
||||
if (status == 0)
|
||||
nfs_setsecurity(inode, &fattr, olabel);
|
||||
nfs_setsecurity(inode, fattr);
|
||||
|
||||
nfs4_label_free(olabel);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
#endif /* CONFIG_NFS_V4_SECURITY_LABEL */
|
||||
@@ -7004,7 +6944,6 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
|
||||
struct nfs4_lockdata *data = calldata;
|
||||
struct nfs4_state *state = data->lsp->ls_state;
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
|
||||
goto out_wait;
|
||||
/* Do we need to do an open_to_lock_owner? */
|
||||
@@ -7038,7 +6977,7 @@ out_release_lock_seqid:
|
||||
nfs_release_seqid(data->arg.lock_seqid);
|
||||
out_wait:
|
||||
nfs4_sequence_done(task, &data->res.seq_res);
|
||||
dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
|
||||
dprintk("%s: ret = %d\n", __func__, data->rpc_status);
|
||||
}
|
||||
|
||||
static void nfs4_lock_done(struct rpc_task *task, void *calldata)
|
||||
@@ -7046,8 +6985,6 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata)
|
||||
struct nfs4_lockdata *data = calldata;
|
||||
struct nfs4_lock_state *lsp = data->lsp;
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
|
||||
if (!nfs4_sequence_done(task, &data->res.seq_res))
|
||||
return;
|
||||
|
||||
@@ -7081,7 +7018,7 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata)
|
||||
goto out_restart;
|
||||
}
|
||||
out_done:
|
||||
dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
|
||||
dprintk("%s: ret = %d!\n", __func__, data->rpc_status);
|
||||
return;
|
||||
out_restart:
|
||||
if (!data->cancelled)
|
||||
@@ -7093,7 +7030,6 @@ static void nfs4_lock_release(void *calldata)
|
||||
{
|
||||
struct nfs4_lockdata *data = calldata;
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
nfs_free_seqid(data->arg.open_seqid);
|
||||
if (data->cancelled && data->rpc_status == 0) {
|
||||
struct rpc_task *task;
|
||||
@@ -7107,7 +7043,6 @@ static void nfs4_lock_release(void *calldata)
|
||||
nfs4_put_lock_state(data->lsp);
|
||||
put_nfs_open_context(data->ctx);
|
||||
kfree(data);
|
||||
dprintk("%s: done!\n", __func__);
|
||||
}
|
||||
|
||||
static const struct rpc_call_ops nfs4_lock_ops = {
|
||||
@@ -7154,7 +7089,6 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
|
||||
if (client->cl_minorversion)
|
||||
task_setup_data.flags |= RPC_TASK_MOVEABLE;
|
||||
|
||||
dprintk("%s: begin!\n", __func__);
|
||||
data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
|
||||
fl->fl_u.nfs4_fl.owner,
|
||||
recovery_type == NFS_LOCK_NEW ? GFP_KERNEL : GFP_NOFS);
|
||||
@@ -7185,7 +7119,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
|
||||
data->cancelled = true;
|
||||
trace_nfs4_set_lock(fl, state, &data->res.stateid, cmd, ret);
|
||||
rpc_put_task(task);
|
||||
dprintk("%s: done, ret = %d!\n", __func__, ret);
|
||||
dprintk("%s: ret = %d\n", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -8856,14 +8790,12 @@ static void nfs4_get_lease_time_prepare(struct rpc_task *task,
|
||||
struct nfs4_get_lease_time_data *data =
|
||||
(struct nfs4_get_lease_time_data *)calldata;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
/* just setup sequence, do not trigger session recovery
|
||||
since we're invoked within one */
|
||||
nfs4_setup_sequence(data->clp,
|
||||
&data->args->la_seq_args,
|
||||
&data->res->lr_seq_res,
|
||||
task);
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -8875,13 +8807,11 @@ static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
|
||||
struct nfs4_get_lease_time_data *data =
|
||||
(struct nfs4_get_lease_time_data *)calldata;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
if (!nfs4_sequence_done(task, &data->res->lr_seq_res))
|
||||
return;
|
||||
switch (task->tk_status) {
|
||||
case -NFS4ERR_DELAY:
|
||||
case -NFS4ERR_GRACE:
|
||||
dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
|
||||
rpc_delay(task, NFS4_POLL_RETRY_MIN);
|
||||
task->tk_status = 0;
|
||||
fallthrough;
|
||||
@@ -8889,7 +8819,6 @@ static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
|
||||
rpc_restart_call_prepare(task);
|
||||
return;
|
||||
}
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static const struct rpc_call_ops nfs4_get_lease_time_ops = {
|
||||
@@ -9121,7 +9050,6 @@ int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)
|
||||
dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
|
||||
clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
|
||||
out:
|
||||
dprintk("<-- %s\n", __func__);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -9139,8 +9067,6 @@ int nfs4_proc_destroy_session(struct nfs4_session *session,
|
||||
};
|
||||
int status = 0;
|
||||
|
||||
dprintk("--> nfs4_proc_destroy_session\n");
|
||||
|
||||
/* session is still being setup */
|
||||
if (!test_and_clear_bit(NFS4_SESSION_ESTABLISHED, &session->session_state))
|
||||
return 0;
|
||||
@@ -9152,8 +9078,6 @@ int nfs4_proc_destroy_session(struct nfs4_session *session,
|
||||
if (status)
|
||||
dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "
|
||||
"Session has been destroyed regardless...\n", status);
|
||||
|
||||
dprintk("<-- nfs4_proc_destroy_session\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -9201,7 +9125,7 @@ static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
|
||||
if (task->tk_status < 0) {
|
||||
dprintk("%s ERROR %d\n", __func__, task->tk_status);
|
||||
if (refcount_read(&clp->cl_count) == 1)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
if (nfs41_sequence_handle_errors(task, clp) == -EAGAIN) {
|
||||
rpc_restart_call_prepare(task);
|
||||
@@ -9209,8 +9133,6 @@ static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
|
||||
}
|
||||
}
|
||||
dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
|
||||
out:
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static void nfs41_sequence_prepare(struct rpc_task *task, void *data)
|
||||
@@ -9357,7 +9279,6 @@ static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data)
|
||||
struct nfs_client *clp = calldata->clp;
|
||||
struct nfs4_sequence_res *res = &calldata->res.seq_res;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
if (!nfs41_sequence_done(task, res))
|
||||
return;
|
||||
|
||||
@@ -9366,7 +9287,6 @@ static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data)
|
||||
rpc_restart_call_prepare(task);
|
||||
return;
|
||||
}
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static void nfs4_free_reclaim_complete_data(void *data)
|
||||
@@ -9401,7 +9321,6 @@ static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
|
||||
};
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
|
||||
if (calldata == NULL)
|
||||
goto out;
|
||||
@@ -9424,19 +9343,15 @@ nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
|
||||
struct nfs4_layoutget *lgp = calldata;
|
||||
struct nfs_server *server = NFS_SERVER(lgp->args.inode);
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs4_setup_sequence(server->nfs_client, &lgp->args.seq_args,
|
||||
&lgp->res.seq_res, task);
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
|
||||
{
|
||||
struct nfs4_layoutget *lgp = calldata;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs41_sequence_process(task, &lgp->res.seq_res);
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -9525,7 +9440,6 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
|
||||
status = err;
|
||||
}
|
||||
out:
|
||||
dprintk("<-- %s\n", __func__);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -9539,10 +9453,8 @@ static void nfs4_layoutget_release(void *calldata)
|
||||
{
|
||||
struct nfs4_layoutget *lgp = calldata;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs4_sequence_free_slot(&lgp->res.seq_res);
|
||||
pnfs_layoutget_free(lgp);
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static const struct rpc_call_ops nfs4_layoutget_call_ops = {
|
||||
@@ -9578,8 +9490,6 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout)
|
||||
};
|
||||
int status = 0;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
|
||||
nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0, 0);
|
||||
|
||||
task = rpc_run_task(&task_setup_data);
|
||||
@@ -9615,7 +9525,6 @@ nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata)
|
||||
{
|
||||
struct nfs4_layoutreturn *lrp = calldata;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs4_setup_sequence(lrp->clp,
|
||||
&lrp->args.seq_args,
|
||||
&lrp->res.seq_res,
|
||||
@@ -9629,8 +9538,6 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
|
||||
struct nfs4_layoutreturn *lrp = calldata;
|
||||
struct nfs_server *server;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
|
||||
if (!nfs41_sequence_process(task, &lrp->res.seq_res))
|
||||
return;
|
||||
|
||||
@@ -9661,7 +9568,6 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
|
||||
break;
|
||||
goto out_restart;
|
||||
}
|
||||
dprintk("<-- %s\n", __func__);
|
||||
return;
|
||||
out_restart:
|
||||
task->tk_status = 0;
|
||||
@@ -9674,7 +9580,6 @@ static void nfs4_layoutreturn_release(void *calldata)
|
||||
struct nfs4_layoutreturn *lrp = calldata;
|
||||
struct pnfs_layout_hdr *lo = lrp->args.layout;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
pnfs_layoutreturn_free_lsegs(lo, &lrp->args.stateid, &lrp->args.range,
|
||||
lrp->res.lrs_present ? &lrp->res.stateid : NULL);
|
||||
nfs4_sequence_free_slot(&lrp->res.seq_res);
|
||||
@@ -9684,7 +9589,6 @@ static void nfs4_layoutreturn_release(void *calldata)
|
||||
nfs_iput_and_deactive(lrp->inode);
|
||||
put_cred(lrp->cred);
|
||||
kfree(calldata);
|
||||
dprintk("<-- %s\n", __func__);
|
||||
}
|
||||
|
||||
static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
|
||||
@@ -9715,7 +9619,6 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
|
||||
NFS_SP4_MACH_CRED_PNFS_CLEANUP,
|
||||
&task_setup_data.rpc_client, &msg);
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
lrp->inode = nfs_igrab_and_active(lrp->args.inode);
|
||||
if (!sync) {
|
||||
if (!lrp->inode) {
|
||||
@@ -9762,7 +9665,6 @@ _nfs4_proc_getdeviceinfo(struct nfs_server *server,
|
||||
};
|
||||
int status;
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
||||
if (res.notification & ~args.notify_types)
|
||||
dprintk("%s: unsupported notification\n", __func__);
|
||||
@@ -9934,7 +9836,6 @@ _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
msg.rpc_cred = cred;
|
||||
}
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
|
||||
status = nfs4_call_sync_custom(&task_setup);
|
||||
dprintk("<-- %s status=%d\n", __func__, status);
|
||||
@@ -10158,6 +10059,10 @@ static void nfs41_free_stateid_done(struct rpc_task *task, void *calldata)
|
||||
|
||||
static void nfs41_free_stateid_release(void *calldata)
|
||||
{
|
||||
struct nfs_free_stateid_data *data = calldata;
|
||||
struct nfs_client *clp = data->server->nfs_client;
|
||||
|
||||
nfs_put_client(clp);
|
||||
kfree(calldata);
|
||||
}
|
||||
|
||||
@@ -10194,6 +10099,10 @@ static int nfs41_free_stateid(struct nfs_server *server,
|
||||
};
|
||||
struct nfs_free_stateid_data *data;
|
||||
struct rpc_task *task;
|
||||
struct nfs_client *clp = server->nfs_client;
|
||||
|
||||
if (!refcount_inc_not_zero(&clp->cl_count))
|
||||
return -EIO;
|
||||
|
||||
nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
|
||||
&task_setup.rpc_client, &msg);
|
||||
|
||||
@@ -511,12 +511,16 @@ void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,
|
||||
struct nfs4_slot *slot,
|
||||
struct nfs4_sequence_res *res)
|
||||
{
|
||||
u32 target_highest_slotid = min(res->sr_target_highest_slotid,
|
||||
NFS4_MAX_SLOTID);
|
||||
u32 highest_slotid = min(res->sr_highest_slotid, NFS4_MAX_SLOTID);
|
||||
|
||||
spin_lock(&tbl->slot_tbl_lock);
|
||||
if (!nfs41_is_outlier_target_slotid(tbl, res->sr_target_highest_slotid))
|
||||
nfs41_set_target_slotid_locked(tbl, res->sr_target_highest_slotid);
|
||||
if (!nfs41_is_outlier_target_slotid(tbl, target_highest_slotid))
|
||||
nfs41_set_target_slotid_locked(tbl, target_highest_slotid);
|
||||
if (tbl->generation == slot->generation)
|
||||
nfs41_set_server_slotid_locked(tbl, res->sr_highest_slotid);
|
||||
nfs41_set_max_slotid_locked(tbl, res->sr_target_highest_slotid);
|
||||
nfs41_set_server_slotid_locked(tbl, highest_slotid);
|
||||
nfs41_set_max_slotid_locked(tbl, target_highest_slotid);
|
||||
spin_unlock(&tbl->slot_tbl_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#define NFS4_DEF_SLOT_TABLE_SIZE (64U)
|
||||
#define NFS4_DEF_CB_SLOT_TABLE_SIZE (16U)
|
||||
#define NFS4_MAX_SLOT_TABLE (1024U)
|
||||
#define NFS4_MAX_SLOTID (NFS4_MAX_SLOT_TABLE - 1U)
|
||||
#define NFS4_NO_SLOT ((u32)-1)
|
||||
|
||||
#if IS_ENABLED(CONFIG_NFS_V4)
|
||||
|
||||
@@ -1194,10 +1194,7 @@ static int nfs4_run_state_manager(void *);
|
||||
|
||||
static void nfs4_clear_state_manager_bit(struct nfs_client *clp)
|
||||
{
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
|
||||
smp_mb__after_atomic();
|
||||
wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING);
|
||||
clear_and_wake_up_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
|
||||
rpc_wake_up(&clp->cl_rpcwaitq);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3168,20 +3168,23 @@ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char
|
||||
|
||||
static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
|
||||
{
|
||||
__be32 *p;
|
||||
ssize_t ret;
|
||||
void *ptr;
|
||||
u32 tmp;
|
||||
|
||||
p = xdr_inline_decode(xdr, 8);
|
||||
if (unlikely(!p))
|
||||
if (xdr_stream_decode_u32(xdr, &tmp) < 0)
|
||||
return -EIO;
|
||||
hdr->status = be32_to_cpup(p++);
|
||||
hdr->taglen = be32_to_cpup(p);
|
||||
hdr->status = tmp;
|
||||
|
||||
p = xdr_inline_decode(xdr, hdr->taglen + 4);
|
||||
if (unlikely(!p))
|
||||
ret = xdr_stream_decode_opaque_inline(xdr, &ptr, NFS4_OPAQUE_LIMIT);
|
||||
if (ret < 0)
|
||||
return -EIO;
|
||||
hdr->tag = (char *)p;
|
||||
p += XDR_QUADLEN(hdr->taglen);
|
||||
hdr->nops = be32_to_cpup(p);
|
||||
hdr->taglen = ret;
|
||||
hdr->tag = ptr;
|
||||
|
||||
if (xdr_stream_decode_u32(xdr, &tmp) < 0)
|
||||
return -EIO;
|
||||
hdr->nops = tmp;
|
||||
if (unlikely(hdr->nops < 1))
|
||||
return nfs4_stat_to_errno(hdr->status);
|
||||
return 0;
|
||||
@@ -4582,8 +4585,7 @@ static int decode_attr_mdsthreshold(struct xdr_stream *xdr,
|
||||
|
||||
static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||
struct nfs_fattr *fattr, struct nfs_fh *fh,
|
||||
struct nfs4_fs_locations *fs_loc, struct nfs4_label *label,
|
||||
const struct nfs_server *server)
|
||||
struct nfs4_fs_locations *fs_loc, const struct nfs_server *server)
|
||||
{
|
||||
int status;
|
||||
umode_t fmode = 0;
|
||||
@@ -4698,8 +4700,8 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||
if (status < 0)
|
||||
goto xdr_error;
|
||||
|
||||
if (label) {
|
||||
status = decode_attr_security_label(xdr, bitmap, label);
|
||||
if (fattr->label) {
|
||||
status = decode_attr_security_label(xdr, bitmap, fattr->label);
|
||||
if (status < 0)
|
||||
goto xdr_error;
|
||||
fattr->valid |= status;
|
||||
@@ -4712,7 +4714,7 @@ xdr_error:
|
||||
|
||||
static int decode_getfattr_generic(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
||||
struct nfs_fh *fh, struct nfs4_fs_locations *fs_loc,
|
||||
struct nfs4_label *label, const struct nfs_server *server)
|
||||
const struct nfs_server *server)
|
||||
{
|
||||
unsigned int savep;
|
||||
uint32_t attrlen,
|
||||
@@ -4731,8 +4733,7 @@ static int decode_getfattr_generic(struct xdr_stream *xdr, struct nfs_fattr *fat
|
||||
if (status < 0)
|
||||
goto xdr_error;
|
||||
|
||||
status = decode_getfattr_attrs(xdr, bitmap, fattr, fh, fs_loc,
|
||||
label, server);
|
||||
status = decode_getfattr_attrs(xdr, bitmap, fattr, fh, fs_loc, server);
|
||||
if (status < 0)
|
||||
goto xdr_error;
|
||||
|
||||
@@ -4742,16 +4743,10 @@ xdr_error:
|
||||
return status;
|
||||
}
|
||||
|
||||
static int decode_getfattr_label(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label, const struct nfs_server *server)
|
||||
{
|
||||
return decode_getfattr_generic(xdr, fattr, NULL, NULL, label, server);
|
||||
}
|
||||
|
||||
static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
||||
const struct nfs_server *server)
|
||||
{
|
||||
return decode_getfattr_generic(xdr, fattr, NULL, NULL, NULL, server);
|
||||
return decode_getfattr_generic(xdr, fattr, NULL, NULL, server);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5572,20 +5567,9 @@ static int decode_secinfo_no_name(struct xdr_stream *xdr, struct nfs4_secinfo_re
|
||||
|
||||
static int decode_op_map(struct xdr_stream *xdr, struct nfs4_op_map *op_map)
|
||||
{
|
||||
__be32 *p;
|
||||
uint32_t bitmap_words;
|
||||
unsigned int i;
|
||||
|
||||
p = xdr_inline_decode(xdr, 4);
|
||||
if (!p)
|
||||
if (xdr_stream_decode_uint32_array(xdr, op_map->u.words,
|
||||
ARRAY_SIZE(op_map->u.words)) < 0)
|
||||
return -EIO;
|
||||
bitmap_words = be32_to_cpup(p++);
|
||||
if (bitmap_words > NFS4_OP_MAP_NUM_WORDS)
|
||||
return -EIO;
|
||||
p = xdr_inline_decode(xdr, 4 * bitmap_words);
|
||||
for (i = 0; i < bitmap_words; i++)
|
||||
op_map->u.words[i] = be32_to_cpup(p++);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6179,7 +6163,7 @@ static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
status = decode_getfh(xdr, res->fh);
|
||||
if (status)
|
||||
goto out;
|
||||
status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
status = decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6209,7 +6193,7 @@ static int nfs4_xdr_dec_lookupp(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
status = decode_getfh(xdr, res->fh);
|
||||
if (status)
|
||||
goto out;
|
||||
status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
status = decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6236,8 +6220,7 @@ static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp,
|
||||
goto out;
|
||||
status = decode_getfh(xdr, res->fh);
|
||||
if (status == 0)
|
||||
status = decode_getfattr_label(xdr, res->fattr,
|
||||
res->label, res->server);
|
||||
status = decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6331,7 +6314,7 @@ static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
status = decode_restorefh(xdr);
|
||||
if (status)
|
||||
goto out;
|
||||
decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6361,7 +6344,7 @@ static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
status = decode_getfh(xdr, res->fh);
|
||||
if (status)
|
||||
goto out;
|
||||
decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6394,7 +6377,7 @@ static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
status = decode_putfh(xdr);
|
||||
if (status)
|
||||
goto out;
|
||||
status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
status = decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -6532,7 +6515,7 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
goto out;
|
||||
if (res->access_request)
|
||||
decode_access(xdr, &res->access_supported, &res->access_result);
|
||||
decode_getfattr_label(xdr, res->f_attr, res->f_label, res->server);
|
||||
decode_getfattr(xdr, res->f_attr, res->server);
|
||||
if (res->lg_res)
|
||||
decode_layoutget(xdr, rqstp, res->lg_res);
|
||||
out:
|
||||
@@ -6616,7 +6599,7 @@ static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp,
|
||||
status = decode_setattr(xdr);
|
||||
if (status)
|
||||
goto out;
|
||||
decode_getfattr_label(xdr, res->fattr, res->label, res->server);
|
||||
decode_getfattr(xdr, res->fattr, res->server);
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
@@ -7031,7 +7014,7 @@ static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
|
||||
status = decode_getfattr_generic(xdr,
|
||||
&res->fs_locations->fattr,
|
||||
NULL, res->fs_locations,
|
||||
NULL, res->fs_locations->server);
|
||||
res->fs_locations->server);
|
||||
if (status)
|
||||
goto out;
|
||||
if (res->renew)
|
||||
@@ -7044,7 +7027,7 @@ static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
|
||||
status = decode_getfattr_generic(xdr,
|
||||
&res->fs_locations->fattr,
|
||||
NULL, res->fs_locations,
|
||||
NULL, res->fs_locations->server);
|
||||
res->fs_locations->server);
|
||||
}
|
||||
out:
|
||||
return status;
|
||||
@@ -7475,7 +7458,7 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
|
||||
return -EAGAIN;
|
||||
|
||||
if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
|
||||
NULL, entry->label, entry->server) < 0)
|
||||
NULL, entry->server) < 0)
|
||||
return -EAGAIN;
|
||||
if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
|
||||
entry->ino = entry->fattr->mounted_on_fileid;
|
||||
|
||||
@@ -11,45 +11,9 @@
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/iversion.h>
|
||||
|
||||
TRACE_DEFINE_ENUM(DT_UNKNOWN);
|
||||
TRACE_DEFINE_ENUM(DT_FIFO);
|
||||
TRACE_DEFINE_ENUM(DT_CHR);
|
||||
TRACE_DEFINE_ENUM(DT_DIR);
|
||||
TRACE_DEFINE_ENUM(DT_BLK);
|
||||
TRACE_DEFINE_ENUM(DT_REG);
|
||||
TRACE_DEFINE_ENUM(DT_LNK);
|
||||
TRACE_DEFINE_ENUM(DT_SOCK);
|
||||
TRACE_DEFINE_ENUM(DT_WHT);
|
||||
|
||||
#define nfs_show_file_type(ftype) \
|
||||
__print_symbolic(ftype, \
|
||||
{ DT_UNKNOWN, "UNKNOWN" }, \
|
||||
{ DT_FIFO, "FIFO" }, \
|
||||
{ DT_CHR, "CHR" }, \
|
||||
{ DT_DIR, "DIR" }, \
|
||||
{ DT_BLK, "BLK" }, \
|
||||
{ DT_REG, "REG" }, \
|
||||
{ DT_LNK, "LNK" }, \
|
||||
{ DT_SOCK, "SOCK" }, \
|
||||
{ DT_WHT, "WHT" })
|
||||
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_DATA);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_ATIME);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_ACCESS);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_ACL);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_REVAL_PAGECACHE);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_REVAL_FORCED);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_LABEL);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_CHANGE);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_CTIME);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_MTIME);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_SIZE);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_OTHER);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_DATA_INVAL_DEFER);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_BLOCKS);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_XATTR);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_NLINK);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALID_MODE);
|
||||
#include <trace/events/fs.h>
|
||||
#include <trace/events/nfs.h>
|
||||
#include <trace/events/sunrpc_base.h>
|
||||
|
||||
#define nfs_show_cache_validity(v) \
|
||||
__print_flags(v, "|", \
|
||||
@@ -71,17 +35,6 @@ TRACE_DEFINE_ENUM(NFS_INO_INVALID_MODE);
|
||||
{ NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
|
||||
{ NFS_INO_INVALID_MODE, "INVALID_MODE" })
|
||||
|
||||
TRACE_DEFINE_ENUM(NFS_INO_ADVISE_RDPLUS);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_STALE);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_ACL_LRU_SET);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_INVALIDATING);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_FSCACHE);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_FSCACHE_LOCK);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMIT);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMITTING);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_LAYOUTSTATS);
|
||||
TRACE_DEFINE_ENUM(NFS_INO_ODIRECT);
|
||||
|
||||
#define nfs_show_nfsi_flags(v) \
|
||||
__print_flags(v, "|", \
|
||||
{ BIT(NFS_INO_ADVISE_RDPLUS), "ADVISE_RDPLUS" }, \
|
||||
@@ -163,12 +116,12 @@ DECLARE_EVENT_CLASS(nfs_inode_event_done,
|
||||
"error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
|
||||
"type=%u (%s) version=%llu size=%lld "
|
||||
"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle,
|
||||
__entry->type,
|
||||
nfs_show_file_type(__entry->type),
|
||||
show_fs_dirent_type(__entry->type),
|
||||
(unsigned long long)__entry->version,
|
||||
(long long)__entry->size,
|
||||
__entry->cache_validity,
|
||||
@@ -254,12 +207,12 @@ TRACE_EVENT(nfs_access_exit,
|
||||
"type=%u (%s) version=%llu size=%lld "
|
||||
"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
|
||||
"mask=0x%x permitted=0x%x",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle,
|
||||
__entry->type,
|
||||
nfs_show_file_type(__entry->type),
|
||||
show_fs_dirent_type(__entry->type),
|
||||
(unsigned long long)__entry->version,
|
||||
(long long)__entry->size,
|
||||
__entry->cache_validity,
|
||||
@@ -270,33 +223,55 @@ TRACE_EVENT(nfs_access_exit,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_DEFINE_ENUM(LOOKUP_FOLLOW);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_DIRECTORY);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_AUTOMOUNT);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_PARENT);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_REVAL);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_RCU);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_OPEN);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_CREATE);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_EXCL);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_RENAME_TARGET);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_EMPTY);
|
||||
TRACE_DEFINE_ENUM(LOOKUP_DOWN);
|
||||
DECLARE_EVENT_CLASS(nfs_update_size_class,
|
||||
TP_PROTO(
|
||||
const struct inode *inode,
|
||||
loff_t new_size
|
||||
),
|
||||
|
||||
#define show_lookup_flags(flags) \
|
||||
__print_flags(flags, "|", \
|
||||
{ LOOKUP_FOLLOW, "FOLLOW" }, \
|
||||
{ LOOKUP_DIRECTORY, "DIRECTORY" }, \
|
||||
{ LOOKUP_AUTOMOUNT, "AUTOMOUNT" }, \
|
||||
{ LOOKUP_PARENT, "PARENT" }, \
|
||||
{ LOOKUP_REVAL, "REVAL" }, \
|
||||
{ LOOKUP_RCU, "RCU" }, \
|
||||
{ LOOKUP_OPEN, "OPEN" }, \
|
||||
{ LOOKUP_CREATE, "CREATE" }, \
|
||||
{ LOOKUP_EXCL, "EXCL" }, \
|
||||
{ LOOKUP_RENAME_TARGET, "RENAME_TARGET" }, \
|
||||
{ LOOKUP_EMPTY, "EMPTY" }, \
|
||||
{ LOOKUP_DOWN, "DOWN" })
|
||||
TP_ARGS(inode, new_size),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(u64, fileid)
|
||||
__field(u64, version)
|
||||
__field(loff_t, cur_size)
|
||||
__field(loff_t, new_size)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
|
||||
__entry->fileid = nfsi->fileid;
|
||||
__entry->version = inode_peek_iversion_raw(inode);
|
||||
__entry->cur_size = i_size_read(inode);
|
||||
__entry->new_size = new_size;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cursize=%lld newsize=%lld",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->version,
|
||||
__entry->cur_size, __entry->new_size
|
||||
)
|
||||
);
|
||||
|
||||
#define DEFINE_NFS_UPDATE_SIZE_EVENT(name) \
|
||||
DEFINE_EVENT(nfs_update_size_class, nfs_size_##name, \
|
||||
TP_PROTO( \
|
||||
const struct inode *inode, \
|
||||
loff_t new_size \
|
||||
), \
|
||||
TP_ARGS(inode, new_size))
|
||||
|
||||
DEFINE_NFS_UPDATE_SIZE_EVENT(truncate);
|
||||
DEFINE_NFS_UPDATE_SIZE_EVENT(wcc);
|
||||
DEFINE_NFS_UPDATE_SIZE_EVENT(update);
|
||||
DEFINE_NFS_UPDATE_SIZE_EVENT(grow);
|
||||
|
||||
DECLARE_EVENT_CLASS(nfs_lookup_event,
|
||||
TP_PROTO(
|
||||
@@ -324,7 +299,7 @@ DECLARE_EVENT_CLASS(nfs_lookup_event,
|
||||
TP_printk(
|
||||
"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
__entry->flags,
|
||||
show_lookup_flags(__entry->flags),
|
||||
show_fs_lookup_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -368,9 +343,9 @@ DECLARE_EVENT_CLASS(nfs_lookup_event_done,
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
__entry->flags,
|
||||
show_lookup_flags(__entry->flags),
|
||||
show_fs_lookup_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -392,46 +367,6 @@ DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
|
||||
DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
|
||||
DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
|
||||
|
||||
TRACE_DEFINE_ENUM(O_WRONLY);
|
||||
TRACE_DEFINE_ENUM(O_RDWR);
|
||||
TRACE_DEFINE_ENUM(O_CREAT);
|
||||
TRACE_DEFINE_ENUM(O_EXCL);
|
||||
TRACE_DEFINE_ENUM(O_NOCTTY);
|
||||
TRACE_DEFINE_ENUM(O_TRUNC);
|
||||
TRACE_DEFINE_ENUM(O_APPEND);
|
||||
TRACE_DEFINE_ENUM(O_NONBLOCK);
|
||||
TRACE_DEFINE_ENUM(O_DSYNC);
|
||||
TRACE_DEFINE_ENUM(O_DIRECT);
|
||||
TRACE_DEFINE_ENUM(O_LARGEFILE);
|
||||
TRACE_DEFINE_ENUM(O_DIRECTORY);
|
||||
TRACE_DEFINE_ENUM(O_NOFOLLOW);
|
||||
TRACE_DEFINE_ENUM(O_NOATIME);
|
||||
TRACE_DEFINE_ENUM(O_CLOEXEC);
|
||||
|
||||
#define show_open_flags(flags) \
|
||||
__print_flags(flags, "|", \
|
||||
{ O_WRONLY, "O_WRONLY" }, \
|
||||
{ O_RDWR, "O_RDWR" }, \
|
||||
{ O_CREAT, "O_CREAT" }, \
|
||||
{ O_EXCL, "O_EXCL" }, \
|
||||
{ O_NOCTTY, "O_NOCTTY" }, \
|
||||
{ O_TRUNC, "O_TRUNC" }, \
|
||||
{ O_APPEND, "O_APPEND" }, \
|
||||
{ O_NONBLOCK, "O_NONBLOCK" }, \
|
||||
{ O_DSYNC, "O_DSYNC" }, \
|
||||
{ O_DIRECT, "O_DIRECT" }, \
|
||||
{ O_LARGEFILE, "O_LARGEFILE" }, \
|
||||
{ O_DIRECTORY, "O_DIRECTORY" }, \
|
||||
{ O_NOFOLLOW, "O_NOFOLLOW" }, \
|
||||
{ O_NOATIME, "O_NOATIME" }, \
|
||||
{ O_CLOEXEC, "O_CLOEXEC" })
|
||||
|
||||
#define show_fmode_flags(mode) \
|
||||
__print_flags(mode, "|", \
|
||||
{ ((__force unsigned long)FMODE_READ), "READ" }, \
|
||||
{ ((__force unsigned long)FMODE_WRITE), "WRITE" }, \
|
||||
{ ((__force unsigned long)FMODE_EXEC), "EXEC" })
|
||||
|
||||
TRACE_EVENT(nfs_atomic_open_enter,
|
||||
TP_PROTO(
|
||||
const struct inode *dir,
|
||||
@@ -443,7 +378,7 @@ TRACE_EVENT(nfs_atomic_open_enter,
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, flags)
|
||||
__field(unsigned int, fmode)
|
||||
__field(unsigned long, fmode)
|
||||
__field(dev_t, dev)
|
||||
__field(u64, dir)
|
||||
__string(name, ctx->dentry->d_name.name)
|
||||
@@ -453,15 +388,15 @@ TRACE_EVENT(nfs_atomic_open_enter,
|
||||
__entry->dev = dir->i_sb->s_dev;
|
||||
__entry->dir = NFS_FILEID(dir);
|
||||
__entry->flags = flags;
|
||||
__entry->fmode = (__force unsigned int)ctx->mode;
|
||||
__entry->fmode = (__force unsigned long)ctx->mode;
|
||||
__assign_str(name, ctx->dentry->d_name.name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
|
||||
__entry->flags,
|
||||
show_open_flags(__entry->flags),
|
||||
show_fmode_flags(__entry->fmode),
|
||||
show_fs_fcntl_open_flags(__entry->flags),
|
||||
show_fs_fmode_flags(__entry->fmode),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -481,7 +416,7 @@ TRACE_EVENT(nfs_atomic_open_exit,
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, error)
|
||||
__field(unsigned long, flags)
|
||||
__field(unsigned int, fmode)
|
||||
__field(unsigned long, fmode)
|
||||
__field(dev_t, dev)
|
||||
__field(u64, dir)
|
||||
__string(name, ctx->dentry->d_name.name)
|
||||
@@ -492,17 +427,17 @@ TRACE_EVENT(nfs_atomic_open_exit,
|
||||
__entry->dev = dir->i_sb->s_dev;
|
||||
__entry->dir = NFS_FILEID(dir);
|
||||
__entry->flags = flags;
|
||||
__entry->fmode = (__force unsigned int)ctx->mode;
|
||||
__entry->fmode = (__force unsigned long)ctx->mode;
|
||||
__assign_str(name, ctx->dentry->d_name.name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) flags=0x%lx (%s) fmode=%s "
|
||||
"name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
__entry->flags,
|
||||
show_open_flags(__entry->flags),
|
||||
show_fmode_flags(__entry->fmode),
|
||||
show_fs_fcntl_open_flags(__entry->flags),
|
||||
show_fs_fmode_flags(__entry->fmode),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -535,7 +470,7 @@ TRACE_EVENT(nfs_create_enter,
|
||||
TP_printk(
|
||||
"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
__entry->flags,
|
||||
show_open_flags(__entry->flags),
|
||||
show_fs_fcntl_open_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -570,9 +505,9 @@ TRACE_EVENT(nfs_create_exit,
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
__entry->flags,
|
||||
show_open_flags(__entry->flags),
|
||||
show_fs_fcntl_open_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -640,7 +575,7 @@ DECLARE_EVENT_CLASS(nfs_directory_event_done,
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
@@ -730,7 +665,7 @@ TRACE_EVENT(nfs_link_exit,
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
__entry->fileid,
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
@@ -817,7 +752,7 @@ DECLARE_EVENT_CLASS(nfs_rename_event_done,
|
||||
TP_printk(
|
||||
"error=%ld (%s) old_name=%02x:%02x:%llu/%s "
|
||||
"new_name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->old_dir,
|
||||
__get_str(old_name),
|
||||
@@ -871,13 +806,163 @@ TRACE_EVENT(nfs_sillyrename_unlink,
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) name=%02x:%02x:%llu/%s",
|
||||
-__entry->error, nfs_show_status(__entry->error),
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs_aop_readpage,
|
||||
TP_PROTO(
|
||||
const struct inode *inode,
|
||||
struct page *page
|
||||
),
|
||||
|
||||
TP_ARGS(inode, page),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(u64, fileid)
|
||||
__field(u64, version)
|
||||
__field(loff_t, offset)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->fileid = nfsi->fileid;
|
||||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
|
||||
__entry->version = inode_peek_iversion_raw(inode);
|
||||
__entry->offset = page_index(page) << PAGE_SHIFT;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->version,
|
||||
__entry->offset
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs_aop_readpage_done,
|
||||
TP_PROTO(
|
||||
const struct inode *inode,
|
||||
struct page *page,
|
||||
int ret
|
||||
),
|
||||
|
||||
TP_ARGS(inode, page, ret),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(int, ret)
|
||||
__field(u64, fileid)
|
||||
__field(u64, version)
|
||||
__field(loff_t, offset)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->fileid = nfsi->fileid;
|
||||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
|
||||
__entry->version = inode_peek_iversion_raw(inode);
|
||||
__entry->offset = page_index(page) << PAGE_SHIFT;
|
||||
__entry->ret = ret;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld ret=%d",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->version,
|
||||
__entry->offset, __entry->ret
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs_aop_readahead,
|
||||
TP_PROTO(
|
||||
const struct inode *inode,
|
||||
struct page *page,
|
||||
unsigned int nr_pages
|
||||
),
|
||||
|
||||
TP_ARGS(inode, page, nr_pages),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(u64, fileid)
|
||||
__field(u64, version)
|
||||
__field(loff_t, offset)
|
||||
__field(unsigned int, nr_pages)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->fileid = nfsi->fileid;
|
||||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
|
||||
__entry->version = inode_peek_iversion_raw(inode);
|
||||
__entry->offset = page_index(page) << PAGE_SHIFT;
|
||||
__entry->nr_pages = nr_pages;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld nr_pages=%u",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->version,
|
||||
__entry->offset, __entry->nr_pages
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs_aop_readahead_done,
|
||||
TP_PROTO(
|
||||
const struct inode *inode,
|
||||
unsigned int nr_pages,
|
||||
int ret
|
||||
),
|
||||
|
||||
TP_ARGS(inode, nr_pages, ret),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(u32, fhandle)
|
||||
__field(int, ret)
|
||||
__field(u64, fileid)
|
||||
__field(u64, version)
|
||||
__field(loff_t, offset)
|
||||
__field(unsigned int, nr_pages)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
__entry->dev = inode->i_sb->s_dev;
|
||||
__entry->fileid = nfsi->fileid;
|
||||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
|
||||
__entry->version = inode_peek_iversion_raw(inode);
|
||||
__entry->nr_pages = nr_pages;
|
||||
__entry->ret = ret;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu nr_pages=%u ret=%d",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->version,
|
||||
__entry->nr_pages, __entry->ret
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs_initiate_read,
|
||||
TP_PROTO(
|
||||
const struct nfs_pgio_header *hdr
|
||||
@@ -1054,16 +1139,6 @@ TRACE_EVENT(nfs_pgio_error,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_DEFINE_ENUM(NFS_UNSTABLE);
|
||||
TRACE_DEFINE_ENUM(NFS_DATA_SYNC);
|
||||
TRACE_DEFINE_ENUM(NFS_FILE_SYNC);
|
||||
|
||||
#define nfs_show_stable(stable) \
|
||||
__print_symbolic(stable, \
|
||||
{ NFS_UNSTABLE, "UNSTABLE" }, \
|
||||
{ NFS_DATA_SYNC, "DATA_SYNC" }, \
|
||||
{ NFS_FILE_SYNC, "FILE_SYNC" })
|
||||
|
||||
TRACE_EVENT(nfs_initiate_write,
|
||||
TP_PROTO(
|
||||
const struct nfs_pgio_header *hdr
|
||||
@@ -1077,7 +1152,7 @@ TRACE_EVENT(nfs_initiate_write,
|
||||
__field(u64, fileid)
|
||||
__field(loff_t, offset)
|
||||
__field(u32, count)
|
||||
__field(enum nfs3_stable_how, stable)
|
||||
__field(unsigned long, stable)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
@@ -1101,7 +1176,7 @@ TRACE_EVENT(nfs_initiate_write,
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle,
|
||||
(long long)__entry->offset, __entry->count,
|
||||
nfs_show_stable(__entry->stable)
|
||||
show_nfs_stable_how(__entry->stable)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -1121,7 +1196,7 @@ TRACE_EVENT(nfs_writeback_done,
|
||||
__field(u32, arg_count)
|
||||
__field(u32, res_count)
|
||||
__field(int, status)
|
||||
__field(enum nfs3_stable_how, stable)
|
||||
__field(unsigned long, stable)
|
||||
__array(char, verifier, NFS4_VERIFIER_SIZE)
|
||||
),
|
||||
|
||||
@@ -1154,8 +1229,8 @@ TRACE_EVENT(nfs_writeback_done,
|
||||
__entry->fhandle,
|
||||
(long long)__entry->offset, __entry->arg_count,
|
||||
__entry->res_count, __entry->status,
|
||||
nfs_show_stable(__entry->stable),
|
||||
__print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
|
||||
show_nfs_stable_how(__entry->stable),
|
||||
show_nfs4_verifier(__entry->verifier)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -1256,7 +1331,7 @@ TRACE_EVENT(nfs_commit_done,
|
||||
__field(u64, fileid)
|
||||
__field(loff_t, offset)
|
||||
__field(int, status)
|
||||
__field(enum nfs3_stable_how, stable)
|
||||
__field(unsigned long, stable)
|
||||
__array(char, verifier, NFS4_VERIFIER_SIZE)
|
||||
),
|
||||
|
||||
@@ -1285,8 +1360,8 @@ TRACE_EVENT(nfs_commit_done,
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle,
|
||||
(long long)__entry->offset, __entry->status,
|
||||
nfs_show_stable(__entry->stable),
|
||||
__print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
|
||||
show_nfs_stable_how(__entry->stable),
|
||||
show_nfs4_verifier(__entry->verifier)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -1323,76 +1398,6 @@ TRACE_EVENT(nfs_fh_to_dentry,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_DEFINE_ENUM(NFS_OK);
|
||||
TRACE_DEFINE_ENUM(NFSERR_PERM);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOENT);
|
||||
TRACE_DEFINE_ENUM(NFSERR_IO);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NXIO);
|
||||
TRACE_DEFINE_ENUM(ECHILD);
|
||||
TRACE_DEFINE_ENUM(NFSERR_EAGAIN);
|
||||
TRACE_DEFINE_ENUM(NFSERR_ACCES);
|
||||
TRACE_DEFINE_ENUM(NFSERR_EXIST);
|
||||
TRACE_DEFINE_ENUM(NFSERR_XDEV);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NODEV);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOTDIR);
|
||||
TRACE_DEFINE_ENUM(NFSERR_ISDIR);
|
||||
TRACE_DEFINE_ENUM(NFSERR_INVAL);
|
||||
TRACE_DEFINE_ENUM(NFSERR_FBIG);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOSPC);
|
||||
TRACE_DEFINE_ENUM(NFSERR_ROFS);
|
||||
TRACE_DEFINE_ENUM(NFSERR_MLINK);
|
||||
TRACE_DEFINE_ENUM(NFSERR_OPNOTSUPP);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NAMETOOLONG);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOTEMPTY);
|
||||
TRACE_DEFINE_ENUM(NFSERR_DQUOT);
|
||||
TRACE_DEFINE_ENUM(NFSERR_STALE);
|
||||
TRACE_DEFINE_ENUM(NFSERR_REMOTE);
|
||||
TRACE_DEFINE_ENUM(NFSERR_WFLUSH);
|
||||
TRACE_DEFINE_ENUM(NFSERR_BADHANDLE);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOT_SYNC);
|
||||
TRACE_DEFINE_ENUM(NFSERR_BAD_COOKIE);
|
||||
TRACE_DEFINE_ENUM(NFSERR_NOTSUPP);
|
||||
TRACE_DEFINE_ENUM(NFSERR_TOOSMALL);
|
||||
TRACE_DEFINE_ENUM(NFSERR_SERVERFAULT);
|
||||
TRACE_DEFINE_ENUM(NFSERR_BADTYPE);
|
||||
TRACE_DEFINE_ENUM(NFSERR_JUKEBOX);
|
||||
|
||||
#define nfs_show_status(x) \
|
||||
__print_symbolic(x, \
|
||||
{ NFS_OK, "OK" }, \
|
||||
{ NFSERR_PERM, "PERM" }, \
|
||||
{ NFSERR_NOENT, "NOENT" }, \
|
||||
{ NFSERR_IO, "IO" }, \
|
||||
{ NFSERR_NXIO, "NXIO" }, \
|
||||
{ ECHILD, "CHILD" }, \
|
||||
{ NFSERR_EAGAIN, "AGAIN" }, \
|
||||
{ NFSERR_ACCES, "ACCES" }, \
|
||||
{ NFSERR_EXIST, "EXIST" }, \
|
||||
{ NFSERR_XDEV, "XDEV" }, \
|
||||
{ NFSERR_NODEV, "NODEV" }, \
|
||||
{ NFSERR_NOTDIR, "NOTDIR" }, \
|
||||
{ NFSERR_ISDIR, "ISDIR" }, \
|
||||
{ NFSERR_INVAL, "INVAL" }, \
|
||||
{ NFSERR_FBIG, "FBIG" }, \
|
||||
{ NFSERR_NOSPC, "NOSPC" }, \
|
||||
{ NFSERR_ROFS, "ROFS" }, \
|
||||
{ NFSERR_MLINK, "MLINK" }, \
|
||||
{ NFSERR_OPNOTSUPP, "OPNOTSUPP" }, \
|
||||
{ NFSERR_NAMETOOLONG, "NAMETOOLONG" }, \
|
||||
{ NFSERR_NOTEMPTY, "NOTEMPTY" }, \
|
||||
{ NFSERR_DQUOT, "DQUOT" }, \
|
||||
{ NFSERR_STALE, "STALE" }, \
|
||||
{ NFSERR_REMOTE, "REMOTE" }, \
|
||||
{ NFSERR_WFLUSH, "WFLUSH" }, \
|
||||
{ NFSERR_BADHANDLE, "BADHANDLE" }, \
|
||||
{ NFSERR_NOT_SYNC, "NOTSYNC" }, \
|
||||
{ NFSERR_BAD_COOKIE, "BADCOOKIE" }, \
|
||||
{ NFSERR_NOTSUPP, "NOTSUPP" }, \
|
||||
{ NFSERR_TOOSMALL, "TOOSMALL" }, \
|
||||
{ NFSERR_SERVERFAULT, "REMOTEIO" }, \
|
||||
{ NFSERR_BADTYPE, "BADTYPE" }, \
|
||||
{ NFSERR_JUKEBOX, "JUKEBOX" })
|
||||
|
||||
DECLARE_EVENT_CLASS(nfs_xdr_event,
|
||||
TP_PROTO(
|
||||
const struct xdr_stream *xdr,
|
||||
@@ -1427,12 +1432,12 @@ DECLARE_EVENT_CLASS(nfs_xdr_event,
|
||||
__assign_str(procedure, task->tk_msg.rpc_proc->p_name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"task:%u@%d xid=0x%08x %sv%d %s error=%ld (%s)",
|
||||
TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
|
||||
" xid=0x%08x %sv%d %s error=%ld (%s)",
|
||||
__entry->task_id, __entry->client_id, __entry->xid,
|
||||
__get_str(program), __entry->version,
|
||||
__get_str(procedure), -__entry->error,
|
||||
nfs_show_status(__entry->error)
|
||||
show_nfs_status(__entry->error)
|
||||
)
|
||||
);
|
||||
#define DEFINE_NFS_XDR_EVENT(name) \
|
||||
|
||||
@@ -271,8 +271,7 @@ nfs_page_set_headlock(struct nfs_page *req)
|
||||
void
|
||||
nfs_page_clear_headlock(struct nfs_page *req)
|
||||
{
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(PG_HEADLOCK, &req->wb_flags);
|
||||
clear_bit_unlock(PG_HEADLOCK, &req->wb_flags);
|
||||
smp_mb__after_atomic();
|
||||
if (!test_bit(PG_CONTENDED1, &req->wb_flags))
|
||||
return;
|
||||
@@ -525,12 +524,7 @@ nfs_create_subreq(struct nfs_page *req,
|
||||
*/
|
||||
void nfs_unlock_request(struct nfs_page *req)
|
||||
{
|
||||
if (!NFS_WBACK_BUSY(req)) {
|
||||
printk(KERN_ERR "NFS: Invalid unlock attempted\n");
|
||||
BUG();
|
||||
}
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(PG_BUSY, &req->wb_flags);
|
||||
clear_bit_unlock(PG_BUSY, &req->wb_flags);
|
||||
smp_mb__after_atomic();
|
||||
if (!test_bit(PG_CONTENDED2, &req->wb_flags))
|
||||
return;
|
||||
@@ -870,9 +864,6 @@ static void nfs_pgio_result(struct rpc_task *task, void *calldata)
|
||||
struct nfs_pgio_header *hdr = calldata;
|
||||
struct inode *inode = hdr->inode;
|
||||
|
||||
dprintk("NFS: %s: %5u, (status %d)\n", __func__,
|
||||
task->tk_pid, task->tk_status);
|
||||
|
||||
if (hdr->rw_ops->rw_done(task, hdr, inode) != 0)
|
||||
return;
|
||||
if (task->tk_status < 0)
|
||||
|
||||
@@ -82,10 +82,6 @@ enum pnfs_try_status {
|
||||
PNFS_TRY_AGAIN = 2,
|
||||
};
|
||||
|
||||
/* error codes for internal use */
|
||||
#define NFS4ERR_RESET_TO_MDS 12001
|
||||
#define NFS4ERR_RESET_TO_PNFS 12002
|
||||
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
|
||||
#define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4"
|
||||
@@ -517,7 +513,7 @@ pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
|
||||
{
|
||||
struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
|
||||
|
||||
if (!lseg || !fl_cinfo->ops->mark_request_commit)
|
||||
if (!lseg || !fl_cinfo->ops || !fl_cinfo->ops->mark_request_commit)
|
||||
return false;
|
||||
fl_cinfo->ops->mark_request_commit(req, lseg, cinfo, ds_commit_idx);
|
||||
return true;
|
||||
|
||||
@@ -468,7 +468,6 @@ pnfs_bucket_alloc_ds_commits(struct list_head *list,
|
||||
goto out_error;
|
||||
data->ds_commit_index = i;
|
||||
list_add_tail(&data->list, list);
|
||||
atomic_inc(&cinfo->mds->rpcs_out);
|
||||
nreq++;
|
||||
}
|
||||
mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
@@ -520,7 +519,6 @@ pnfs_generic_commit_pagelist(struct inode *inode, struct list_head *mds_pages,
|
||||
data->ds_commit_index = -1;
|
||||
list_splice_init(mds_pages, &data->pages);
|
||||
list_add_tail(&data->list, &list);
|
||||
atomic_inc(&cinfo->mds->rpcs_out);
|
||||
nreq++;
|
||||
}
|
||||
|
||||
@@ -895,7 +893,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv,
|
||||
}
|
||||
|
||||
smp_wmb();
|
||||
ds->ds_clp = clp;
|
||||
WRITE_ONCE(ds->ds_clp, clp);
|
||||
dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
|
||||
out:
|
||||
return status;
|
||||
@@ -973,7 +971,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
|
||||
}
|
||||
|
||||
smp_wmb();
|
||||
ds->ds_clp = clp;
|
||||
WRITE_ONCE(ds->ds_clp, clp);
|
||||
dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
|
||||
out:
|
||||
return status;
|
||||
|
||||
@@ -91,7 +91,7 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
info->dtpref = fsinfo.tsize;
|
||||
info->maxfilesize = 0x7FFFFFFF;
|
||||
info->lease_time = 0;
|
||||
info->change_attr_type = NFS4_CHANGE_TYPE_IS_TIME_METADATA;
|
||||
info->change_attr_type = NFS4_CHANGE_TYPE_IS_UNDEFINED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -100,8 +100,7 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
*/
|
||||
static int
|
||||
nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||
struct inode *inode)
|
||||
struct nfs_fattr *fattr, struct inode *inode)
|
||||
{
|
||||
struct rpc_message msg = {
|
||||
.rpc_proc = &nfs_procedures[NFSPROC_GETATTR],
|
||||
@@ -154,8 +153,7 @@ nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
||||
|
||||
static int
|
||||
nfs_proc_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr,
|
||||
struct nfs4_label *label)
|
||||
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs_diropargs arg = {
|
||||
.fh = NFS_FH(dir),
|
||||
@@ -257,7 +255,7 @@ nfs_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
||||
nfs_mark_for_revalidate(dir);
|
||||
if (status == 0)
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
|
||||
nfs_free_createdata(data);
|
||||
out:
|
||||
dprintk("NFS reply create: %d\n", status);
|
||||
@@ -304,7 +302,7 @@ nfs_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
|
||||
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
||||
}
|
||||
if (status == 0)
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
|
||||
nfs_free_createdata(data);
|
||||
out:
|
||||
dprintk("NFS reply mknod: %d\n", status);
|
||||
@@ -436,7 +434,7 @@ nfs_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page,
|
||||
* should fill in the data with a LOOKUP call on the wire.
|
||||
*/
|
||||
if (status == 0)
|
||||
status = nfs_instantiate(dentry, fh, fattr, NULL);
|
||||
status = nfs_instantiate(dentry, fh, fattr);
|
||||
|
||||
out_free:
|
||||
nfs_free_fattr(fattr);
|
||||
@@ -465,7 +463,7 @@ nfs_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
|
||||
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
||||
nfs_mark_for_revalidate(dir);
|
||||
if (status == 0)
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, NULL);
|
||||
status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
|
||||
nfs_free_createdata(data);
|
||||
out:
|
||||
dprintk("NFS reply mkdir: %d\n", status);
|
||||
|
||||
@@ -337,8 +337,7 @@ int nfs_readpage(struct file *file, struct page *page)
|
||||
struct inode *inode = page_file_mapping(page)->host;
|
||||
int ret;
|
||||
|
||||
dprintk("NFS: nfs_readpage (%p %ld@%lu)\n",
|
||||
page, PAGE_SIZE, page_index(page));
|
||||
trace_nfs_aop_readpage(inode, page);
|
||||
nfs_inc_stats(inode, NFSIOS_VFSREADPAGE);
|
||||
|
||||
/*
|
||||
@@ -390,9 +389,11 @@ out_wait:
|
||||
}
|
||||
out:
|
||||
put_nfs_open_context(desc.ctx);
|
||||
trace_nfs_aop_readpage_done(inode, page, ret);
|
||||
return ret;
|
||||
out_unlock:
|
||||
unlock_page(page);
|
||||
trace_nfs_aop_readpage_done(inode, page, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -403,10 +404,7 @@ int nfs_readpages(struct file *file, struct address_space *mapping,
|
||||
struct inode *inode = mapping->host;
|
||||
int ret;
|
||||
|
||||
dprintk("NFS: nfs_readpages (%s/%Lu %d)\n",
|
||||
inode->i_sb->s_id,
|
||||
(unsigned long long)NFS_FILEID(inode),
|
||||
nr_pages);
|
||||
trace_nfs_aop_readahead(inode, lru_to_page(pages), nr_pages);
|
||||
nfs_inc_stats(inode, NFSIOS_VFSREADPAGES);
|
||||
|
||||
ret = -ESTALE;
|
||||
@@ -439,6 +437,7 @@ int nfs_readpages(struct file *file, struct address_space *mapping,
|
||||
read_complete:
|
||||
put_nfs_open_context(desc.ctx);
|
||||
out:
|
||||
trace_nfs_aop_readahead_done(inode, nr_pages, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1004,6 +1004,7 @@ int nfs_reconfigure(struct fs_context *fc)
|
||||
struct nfs_fs_context *ctx = nfs_fc2context(fc);
|
||||
struct super_block *sb = fc->root->d_sb;
|
||||
struct nfs_server *nfss = sb->s_fs_info;
|
||||
int ret;
|
||||
|
||||
sync_filesystem(sb);
|
||||
|
||||
@@ -1028,7 +1029,11 @@ int nfs_reconfigure(struct fs_context *fc)
|
||||
}
|
||||
|
||||
/* compare new mount options with old ones */
|
||||
return nfs_compare_remount_data(nfss, ctx);
|
||||
ret = nfs_compare_remount_data(nfss, ctx);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return nfs_probe_server(nfss, NFS_FH(d_inode(fc->root)));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_reconfigure);
|
||||
|
||||
|
||||
@@ -288,6 +288,7 @@ static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int c
|
||||
end = page_file_offset(page) + ((loff_t)offset+count);
|
||||
if (i_size >= end)
|
||||
goto out;
|
||||
trace_nfs_size_grow(inode, end);
|
||||
i_size_write(inode, end);
|
||||
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
|
||||
nfs_inc_stats(inode, NFSIOS_EXTENDWRITE);
|
||||
@@ -1038,25 +1039,11 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
|
||||
struct nfs_page *req, *tmp;
|
||||
int ret = 0;
|
||||
|
||||
restart:
|
||||
list_for_each_entry_safe(req, tmp, src, wb_list) {
|
||||
kref_get(&req->wb_kref);
|
||||
if (!nfs_lock_request(req)) {
|
||||
int status;
|
||||
|
||||
/* Prevent deadlock with nfs_lock_and_join_requests */
|
||||
if (!list_empty(dst)) {
|
||||
nfs_release_request(req);
|
||||
continue;
|
||||
}
|
||||
/* Ensure we make progress to prevent livelock */
|
||||
mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
status = nfs_wait_on_request(req);
|
||||
nfs_release_request(req);
|
||||
mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
|
||||
if (status < 0)
|
||||
break;
|
||||
goto restart;
|
||||
continue;
|
||||
}
|
||||
nfs_request_remove_commit_list(req, cinfo);
|
||||
clear_bit(PG_COMMIT_TO_DS, &req->wb_flags);
|
||||
@@ -1246,7 +1233,7 @@ nfs_key_timeout_notify(struct file *filp, struct inode *inode)
|
||||
struct nfs_open_context *ctx = nfs_file_open_context(filp);
|
||||
|
||||
if (nfs_ctx_key_to_expire(ctx, inode) &&
|
||||
!ctx->ll_cred)
|
||||
!rcu_access_pointer(ctx->ll_cred))
|
||||
/* Already expired! */
|
||||
return -EACCES;
|
||||
return 0;
|
||||
@@ -1258,23 +1245,38 @@ nfs_key_timeout_notify(struct file *filp, struct inode *inode)
|
||||
bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode)
|
||||
{
|
||||
struct rpc_auth *auth = NFS_SERVER(inode)->client->cl_auth;
|
||||
struct rpc_cred *cred = ctx->ll_cred;
|
||||
struct rpc_cred *cred, *new, *old = NULL;
|
||||
struct auth_cred acred = {
|
||||
.cred = ctx->cred,
|
||||
};
|
||||
bool ret = false;
|
||||
|
||||
if (cred && !cred->cr_ops->crmatch(&acred, cred, 0)) {
|
||||
put_rpccred(cred);
|
||||
ctx->ll_cred = NULL;
|
||||
cred = NULL;
|
||||
}
|
||||
if (!cred)
|
||||
cred = auth->au_ops->lookup_cred(auth, &acred, 0);
|
||||
if (!cred || IS_ERR(cred))
|
||||
rcu_read_lock();
|
||||
cred = rcu_dereference(ctx->ll_cred);
|
||||
if (cred && !(cred->cr_ops->crkey_timeout &&
|
||||
cred->cr_ops->crkey_timeout(cred)))
|
||||
goto out;
|
||||
rcu_read_unlock();
|
||||
|
||||
new = auth->au_ops->lookup_cred(auth, &acred, 0);
|
||||
if (new == cred) {
|
||||
put_rpccred(new);
|
||||
return true;
|
||||
ctx->ll_cred = cred;
|
||||
return !!(cred->cr_ops->crkey_timeout &&
|
||||
cred->cr_ops->crkey_timeout(cred));
|
||||
}
|
||||
if (IS_ERR_OR_NULL(new)) {
|
||||
new = NULL;
|
||||
ret = true;
|
||||
} else if (new->cr_ops->crkey_timeout &&
|
||||
new->cr_ops->crkey_timeout(new))
|
||||
ret = true;
|
||||
|
||||
rcu_read_lock();
|
||||
old = rcu_dereference_protected(xchg(&ctx->ll_cred,
|
||||
RCU_INITIALIZER(new)), 1);
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
put_rpccred(old);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1382,8 +1384,6 @@ int nfs_updatepage(struct file *file, struct page *page,
|
||||
status = nfs_writepage_setup(ctx, page, offset, count);
|
||||
if (status < 0)
|
||||
nfs_set_pageerror(mapping);
|
||||
else
|
||||
__set_page_dirty_nobuffers(page);
|
||||
out:
|
||||
dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n",
|
||||
status, (long long)i_size_read(inode));
|
||||
@@ -1671,10 +1671,13 @@ static void nfs_commit_begin(struct nfs_mds_commit_info *cinfo)
|
||||
atomic_inc(&cinfo->rpcs_out);
|
||||
}
|
||||
|
||||
static void nfs_commit_end(struct nfs_mds_commit_info *cinfo)
|
||||
bool nfs_commit_end(struct nfs_mds_commit_info *cinfo)
|
||||
{
|
||||
if (atomic_dec_and_test(&cinfo->rpcs_out))
|
||||
if (atomic_dec_and_test(&cinfo->rpcs_out)) {
|
||||
wake_up_var(&cinfo->rpcs_out);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void nfs_commitdata_release(struct nfs_commit_data *data)
|
||||
@@ -1774,6 +1777,7 @@ void nfs_init_commit(struct nfs_commit_data *data,
|
||||
data->res.fattr = &data->fattr;
|
||||
data->res.verf = &data->verf;
|
||||
nfs_fattr_init(&data->fattr);
|
||||
nfs_commit_begin(cinfo->mds);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_init_commit);
|
||||
|
||||
@@ -1820,7 +1824,6 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
|
||||
|
||||
/* Set up the argument struct */
|
||||
nfs_init_commit(data, head, NULL, cinfo);
|
||||
atomic_inc(&cinfo->mds->rpcs_out);
|
||||
if (NFS_SERVER(inode)->nfs_client->cl_minorversion)
|
||||
task_flags = RPC_TASK_MOVEABLE;
|
||||
return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
|
||||
@@ -1835,9 +1838,6 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata)
|
||||
{
|
||||
struct nfs_commit_data *data = calldata;
|
||||
|
||||
dprintk("NFS: %5u nfs_commit_done (status %d)\n",
|
||||
task->tk_pid, task->tk_status);
|
||||
|
||||
/* Call the NFS version-specific code */
|
||||
NFS_PROTO(data->inode)->commit_done(task, data);
|
||||
trace_nfs_commit_done(task, data);
|
||||
@@ -1936,6 +1936,7 @@ static int __nfs_commit_inode(struct inode *inode, int how,
|
||||
int may_wait = how & FLUSH_SYNC;
|
||||
int ret, nscan;
|
||||
|
||||
how &= ~FLUSH_SYNC;
|
||||
nfs_init_cinfo_from_inode(&cinfo, inode);
|
||||
nfs_commit_begin(cinfo.mds);
|
||||
for (;;) {
|
||||
|
||||
Reference in New Issue
Block a user