mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-24 01:09:38 -05:00
NFS Client Updates for Linux 6.8
New Features: * Always ask for type with READDIR * Remove nfs_writepage() Bugfixes: * Fix a suspicious RCU usage warning * Fix a blocklayoutdriver reference leak * Fix the block driver's calculation of layoutget size * Fix handling NFS4ERR_RETURNCONFLICT * Fix _xprt_switch_find_current_entry() * Fix v4.1 backchannel request timeouts * Don't add zero-length pnfs block devices * Use the parent cred in nfs_access_login_time() Cleanups: * A few improvements when dealing with referring calls from the server * Clean up various unused variables, struct fields, and function calls * Various tracepoint improvements -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEnZ5MQTpR7cLU7KEp18tUv7ClQOsFAmWfDp8ACgkQ18tUv7Cl QOsJ+Q/8DgrVmP3jwoM9Fu7JI/RnTQr9svk7zyrlyrQd3ywYqu6A1SC7lphcrzhy qxH55ykUuVgCB4kFqWPsU5yilJ8UzPncTOUObiBxN3pCU885Wckm4PJ9PNXtF9ct hc7+RpSTby/hYxiJABGVLgUADJ30rYBe6Y+KspSf+S1HvmgY1jbMPhEbVGpP2QBt zSF5pmnecZ748LGzSwSeW29WUZhvRPBL5B204EB4aq9SmPAhnAclnE7uhErQ1u8e Z6RVwSXv2j1FcM79F5xc/gAByCQhObGuMceFd0sAnx87RUttHi1fteVboz2gZxHB rawZQ9p9K9c7ayCu8disxKWTxNYAztvXDOs+Dnij+c3/2EpAmEUD53AXnXAz025b IbSnh6ggLlxoKLv1Lrwrli2d/Qi4TYTm2RSW/dY416pIhoO3aC6fv1a5tUnou9RX 3XpiiFeNoTixWswmS23AMT7BrJTWXY/+NX7AxFZUyPyJ8y9F2Ug8BCam8uAvTluf 80Dx0pB+7DRF19/ZkH0mUFU+2/+mlK/Ub0p+izSJhkhPSH5TwUTA7hvX6xb7yFtS OY4aTVD0rpTbSOvHOEI+F4tWBnw8onTobYMfRcuwNKYJCvuEh4mLLpn44QEJwW9M 3nHIzdE75Nz3deO+gg6Jo5JuiMwqvh7AEGsxIA64FnAi/xRCDi0= =9hVw -----END PGP SIGNATURE----- Merge tag 'nfs-for-6.8-1' of git://git.linux-nfs.org/projects/anna/linux-nfs Pull nfs client updates from Anna Schumaker: "New Features: - Always ask for type with READDIR - Remove nfs_writepage() Bugfixes: - Fix a suspicious RCU usage warning - Fix a blocklayoutdriver reference leak - Fix the block driver's calculation of layoutget size - Fix handling NFS4ERR_RETURNCONFLICT - Fix _xprt_switch_find_current_entry() - Fix v4.1 backchannel request timeouts - Don't add zero-length pnfs block devices - Use the parent cred in nfs_access_login_time() Cleanups: - A few improvements when dealing with referring calls from the server - Clean up various unused variables, struct fields, and function calls - Various tracepoint improvements" * tag 'nfs-for-6.8-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (21 commits) NFSv4.1: Use the nfs_client's rpc timeouts for backchannel SUNRPC: Fixup v4.1 backchannel request timeouts rpc_pipefs: Replace one label in bl_resolve_deviceid() nfs: Remove writepage NFS: drop unused nfs_direct_req bytes_left pNFS: Fix the pnfs block driver's calculation of layoutget size nfs: print fileid in lookup tracepoints nfs: rename the nfs_async_rename_done tracepoint nfs: add new tracepoint at nfs4 revalidate entry point SUNRPC: fix _xprt_switch_find_current_entry logic NFSv4.1/pnfs: Ensure we handle the error NFS4ERR_RETURNCONFLICT NFSv4.1: if referring calls are complete, trust the stateid argument NFSv4: Track the number of referring calls in struct cb_process_state NFS: Use parent's objective cred in nfs_access_login_time() NFSv4: Always ask for type with READDIR pnfs/blocklayout: Don't add zero-length pnfs_block_dev blocklayoutdriver: Fix reference leak of pnfs_device_node SUNRPC: Fix a suspicious RCU usage warning SUNRPC: Create a helper function for accessing the rpc_clnt's xprt_switch SUNRPC: Remove unused function rpc_clnt_xprt_switch_put() ...
This commit is contained in:
commit
587217f970
26 changed files with 183 additions and 125 deletions
|
@ -580,6 +580,8 @@ retry:
|
|||
nfs4_delete_deviceid(node->ld, node->nfs_client, id);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
nfs4_put_deviceid_node(node);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
|
@ -893,10 +895,9 @@ bl_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
|
|||
}
|
||||
|
||||
if (pgio->pg_dreq == NULL)
|
||||
wb_size = pnfs_num_cont_bytes(pgio->pg_inode,
|
||||
req->wb_index);
|
||||
wb_size = pnfs_num_cont_bytes(pgio->pg_inode, req->wb_index);
|
||||
else
|
||||
wb_size = nfs_dreq_bytes_left(pgio->pg_dreq);
|
||||
wb_size = nfs_dreq_bytes_left(pgio->pg_dreq, req_offset(req));
|
||||
|
||||
pnfs_generic_pg_init_write(pgio, req, wb_size);
|
||||
|
||||
|
|
|
@ -351,6 +351,9 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
|
|||
d->map = bl_map_simple;
|
||||
d->pr_key = v->scsi.pr_key;
|
||||
|
||||
if (d->len == 0)
|
||||
return -ENODEV;
|
||||
|
||||
pr_info("pNFS: using block device %s (reservation key 0x%llx)\n",
|
||||
d->bdev_handle->bdev->bd_disk->disk_name, d->pr_key);
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ bl_resolve_deviceid(struct nfs_server *server, struct pnfs_block_volume *b,
|
|||
msg->len = sizeof(*bl_msg) + b->simple.len;
|
||||
msg->data = kzalloc(msg->len, gfp_mask);
|
||||
if (!msg->data)
|
||||
goto out_free_data;
|
||||
goto out_unlock;
|
||||
|
||||
bl_msg = msg->data;
|
||||
bl_msg->type = BL_DEVICE_MOUNT;
|
||||
|
|
|
@ -21,11 +21,12 @@ enum nfs4_callback_procnum {
|
|||
|
||||
struct nfs4_slot;
|
||||
struct cb_process_state {
|
||||
__be32 drc_status;
|
||||
struct nfs_client *clp;
|
||||
struct nfs4_slot *slot;
|
||||
u32 minorversion;
|
||||
struct net *net;
|
||||
u32 minorversion;
|
||||
__be32 drc_status;
|
||||
unsigned int referring_calls;
|
||||
};
|
||||
|
||||
struct cb_compound_hdr_arg {
|
||||
|
|
|
@ -207,7 +207,8 @@ static struct inode *nfs_layout_find_inode(struct nfs_client *clp,
|
|||
* Enforce RFC5661 section 12.5.5.2.1. (Layout Recall and Return Sequencing)
|
||||
*/
|
||||
static u32 pnfs_check_callback_stateid(struct pnfs_layout_hdr *lo,
|
||||
const nfs4_stateid *new)
|
||||
const nfs4_stateid *new,
|
||||
struct cb_process_state *cps)
|
||||
{
|
||||
u32 oldseq, newseq;
|
||||
|
||||
|
@ -221,28 +222,29 @@ static u32 pnfs_check_callback_stateid(struct pnfs_layout_hdr *lo,
|
|||
|
||||
newseq = be32_to_cpu(new->seqid);
|
||||
/* Are we already in a layout recall situation? */
|
||||
if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) &&
|
||||
lo->plh_return_seq != 0) {
|
||||
if (newseq < lo->plh_return_seq)
|
||||
return NFS4ERR_OLD_STATEID;
|
||||
if (newseq > lo->plh_return_seq)
|
||||
if (test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags))
|
||||
return NFS4ERR_DELAY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check that the stateid matches what we think it should be. */
|
||||
/*
|
||||
* Check that the stateid matches what we think it should be.
|
||||
* Note that if the server sent us a list of referring calls,
|
||||
* and we know that those have completed, then we trust the
|
||||
* stateid argument is correct.
|
||||
*/
|
||||
oldseq = be32_to_cpu(lo->plh_stateid.seqid);
|
||||
if (newseq > oldseq + 1)
|
||||
if (newseq > oldseq + 1 && !cps->referring_calls)
|
||||
return NFS4ERR_DELAY;
|
||||
|
||||
/* Crazy server! */
|
||||
if (newseq <= oldseq)
|
||||
return NFS4ERR_OLD_STATEID;
|
||||
out:
|
||||
|
||||
return NFS_OK;
|
||||
}
|
||||
|
||||
static u32 initiate_file_draining(struct nfs_client *clp,
|
||||
struct cb_layoutrecallargs *args)
|
||||
struct cb_layoutrecallargs *args,
|
||||
struct cb_process_state *cps)
|
||||
{
|
||||
struct inode *ino;
|
||||
struct pnfs_layout_hdr *lo;
|
||||
|
@ -266,7 +268,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,
|
|||
goto out;
|
||||
}
|
||||
pnfs_get_layout_hdr(lo);
|
||||
rv = pnfs_check_callback_stateid(lo, &args->cbl_stateid);
|
||||
rv = pnfs_check_callback_stateid(lo, &args->cbl_stateid, cps);
|
||||
if (rv != NFS_OK)
|
||||
goto unlock;
|
||||
|
||||
|
@ -326,10 +328,11 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,
|
|||
}
|
||||
|
||||
static u32 do_callback_layoutrecall(struct nfs_client *clp,
|
||||
struct cb_layoutrecallargs *args)
|
||||
struct cb_layoutrecallargs *args,
|
||||
struct cb_process_state *cps)
|
||||
{
|
||||
if (args->cbl_recall_type == RETURN_FILE)
|
||||
return initiate_file_draining(clp, args);
|
||||
return initiate_file_draining(clp, args, cps);
|
||||
return initiate_bulk_draining(clp, args);
|
||||
}
|
||||
|
||||
|
@ -340,11 +343,12 @@ __be32 nfs4_callback_layoutrecall(void *argp, void *resp,
|
|||
u32 res = NFS4ERR_OP_NOT_IN_SESSION;
|
||||
|
||||
if (cps->clp)
|
||||
res = do_callback_layoutrecall(cps->clp, args);
|
||||
res = do_callback_layoutrecall(cps->clp, args, cps);
|
||||
return cpu_to_be32(res);
|
||||
}
|
||||
|
||||
static void pnfs_recall_all_layouts(struct nfs_client *clp)
|
||||
static void pnfs_recall_all_layouts(struct nfs_client *clp,
|
||||
struct cb_process_state *cps)
|
||||
{
|
||||
struct cb_layoutrecallargs args;
|
||||
|
||||
|
@ -352,7 +356,7 @@ static void pnfs_recall_all_layouts(struct nfs_client *clp)
|
|||
memset(&args, 0, sizeof(args));
|
||||
args.cbl_recall_type = RETURN_ALL;
|
||||
/* FIXME we ignore errors, what should we do? */
|
||||
do_callback_layoutrecall(clp, &args);
|
||||
do_callback_layoutrecall(clp, &args, cps);
|
||||
}
|
||||
|
||||
__be32 nfs4_callback_devicenotify(void *argp, void *resp,
|
||||
|
@ -450,6 +454,7 @@ static int referring_call_exists(struct nfs_client *clp,
|
|||
__acquires(lock)
|
||||
{
|
||||
int status = 0;
|
||||
int found = 0;
|
||||
int i, j;
|
||||
struct nfs4_session *session;
|
||||
struct nfs4_slot_table *tbl;
|
||||
|
@ -478,11 +483,12 @@ static int referring_call_exists(struct nfs_client *clp,
|
|||
spin_lock(lock);
|
||||
if (status)
|
||||
goto out;
|
||||
found++;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
return status < 0 ? status : found;
|
||||
}
|
||||
|
||||
__be32 nfs4_callback_sequence(void *argp, void *resp,
|
||||
|
@ -493,6 +499,7 @@ __be32 nfs4_callback_sequence(void *argp, void *resp,
|
|||
struct nfs4_slot_table *tbl;
|
||||
struct nfs4_slot *slot;
|
||||
struct nfs_client *clp;
|
||||
int ret;
|
||||
int i;
|
||||
__be32 status = htonl(NFS4ERR_BADSESSION);
|
||||
|
||||
|
@ -552,11 +559,13 @@ __be32 nfs4_callback_sequence(void *argp, void *resp,
|
|||
* related callback was received before the response to the original
|
||||
* call.
|
||||
*/
|
||||
if (referring_call_exists(clp, args->csa_nrclists, args->csa_rclists,
|
||||
&tbl->slot_tbl_lock) < 0) {
|
||||
ret = referring_call_exists(clp, args->csa_nrclists, args->csa_rclists,
|
||||
&tbl->slot_tbl_lock);
|
||||
if (ret < 0) {
|
||||
status = htonl(NFS4ERR_DELAY);
|
||||
goto out_unlock;
|
||||
}
|
||||
cps->referring_calls = ret;
|
||||
|
||||
/*
|
||||
* RFC5661 20.9.3
|
||||
|
@ -617,7 +626,7 @@ __be32 nfs4_callback_recallany(void *argp, void *resp,
|
|||
nfs_expire_unused_delegation_types(cps->clp, flags);
|
||||
|
||||
if (args->craa_type_mask & BIT(RCA4_TYPE_MASK_FILE_LAYOUT))
|
||||
pnfs_recall_all_layouts(cps->clp);
|
||||
pnfs_recall_all_layouts(cps->clp, cps);
|
||||
|
||||
if (args->craa_type_mask & BIT(PNFS_FF_RCA4_TYPE_MASK_READ)) {
|
||||
set_bit(NFS4CLNT_RECALL_ANY_LAYOUT_READ, &cps->clp->cl_state);
|
||||
|
|
|
@ -967,6 +967,11 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
|
|||
nops--;
|
||||
}
|
||||
|
||||
if (svc_is_backchannel(rqstp) && cps.clp) {
|
||||
rqstp->bc_to_initval = cps.clp->cl_rpcclient->cl_timeout->to_initval;
|
||||
rqstp->bc_to_retries = cps.clp->cl_rpcclient->cl_timeout->to_retries;
|
||||
}
|
||||
|
||||
*hdr_res.status = status;
|
||||
*hdr_res.nops = htonl(nops);
|
||||
nfs4_cb_free_slot(&cps);
|
||||
|
|
|
@ -2194,6 +2194,8 @@ nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
|
|||
{
|
||||
struct inode *inode;
|
||||
|
||||
trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
|
||||
|
||||
if (!(flags & LOOKUP_OPEN) || (flags & LOOKUP_DIRECTORY))
|
||||
goto full_reval;
|
||||
if (d_mountpoint(dentry))
|
||||
|
@ -2963,7 +2965,7 @@ static u64 nfs_access_login_time(const struct task_struct *task,
|
|||
rcu_read_lock();
|
||||
for (;;) {
|
||||
parent = rcu_dereference(task->real_parent);
|
||||
pcred = rcu_dereference(parent->cred);
|
||||
pcred = __task_cred(parent);
|
||||
if (parent == task || cred_fscmp(pcred, cred) != 0)
|
||||
break;
|
||||
task = parent;
|
||||
|
|
|
@ -205,9 +205,10 @@ static void nfs_direct_req_release(struct nfs_direct_req *dreq)
|
|||
kref_put(&dreq->kref, nfs_direct_req_free);
|
||||
}
|
||||
|
||||
ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq)
|
||||
ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq, loff_t offset)
|
||||
{
|
||||
return dreq->bytes_left;
|
||||
loff_t start = offset - dreq->io_start;
|
||||
return dreq->max_count - start;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_dreq_bytes_left);
|
||||
|
||||
|
@ -368,7 +369,6 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
|
|||
bytes -= req_len;
|
||||
requested_bytes += req_len;
|
||||
pos += req_len;
|
||||
dreq->bytes_left -= req_len;
|
||||
}
|
||||
nfs_direct_release_pages(pagevec, npages);
|
||||
kvfree(pagevec);
|
||||
|
@ -440,7 +440,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
|
|||
goto out;
|
||||
|
||||
dreq->inode = inode;
|
||||
dreq->bytes_left = dreq->max_count = count;
|
||||
dreq->max_count = count;
|
||||
dreq->io_start = iocb->ki_pos;
|
||||
dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
|
||||
l_ctx = nfs_get_lock_context(dreq->ctx);
|
||||
|
@ -873,7 +873,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
|
|||
bytes -= req_len;
|
||||
requested_bytes += req_len;
|
||||
pos += req_len;
|
||||
dreq->bytes_left -= req_len;
|
||||
|
||||
if (defer) {
|
||||
nfs_mark_request_commit(req, NULL, &cinfo, 0);
|
||||
|
@ -980,7 +979,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter,
|
|||
goto out;
|
||||
|
||||
dreq->inode = inode;
|
||||
dreq->bytes_left = dreq->max_count = count;
|
||||
dreq->max_count = count;
|
||||
dreq->io_start = pos;
|
||||
dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
|
||||
l_ctx = nfs_get_lock_context(dreq->ctx);
|
||||
|
|
|
@ -558,7 +558,6 @@ const struct address_space_operations nfs_file_aops = {
|
|||
.read_folio = nfs_read_folio,
|
||||
.readahead = nfs_readahead,
|
||||
.dirty_folio = filemap_dirty_folio,
|
||||
.writepage = nfs_writepage,
|
||||
.writepages = nfs_writepages,
|
||||
.write_begin = nfs_write_begin,
|
||||
.write_end = nfs_write_end,
|
||||
|
|
|
@ -655,7 +655,7 @@ extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry);
|
|||
/* direct.c */
|
||||
void nfs_init_cinfo_from_dreq(struct nfs_commit_info *cinfo,
|
||||
struct nfs_direct_req *dreq);
|
||||
extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq);
|
||||
extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq, loff_t offset);
|
||||
|
||||
/* nfs4proc.c */
|
||||
extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
|
||||
|
@ -936,7 +936,6 @@ struct nfs_direct_req {
|
|||
loff_t io_start; /* Start offset for I/O */
|
||||
ssize_t count, /* bytes actually processed */
|
||||
max_count, /* max expected count */
|
||||
bytes_left, /* bytes left to be sent */
|
||||
error; /* any reported error */
|
||||
struct completion completion; /* wait for i/o completion */
|
||||
|
||||
|
|
|
@ -170,6 +170,7 @@ static int nfs4_map_errors(int err)
|
|||
case -NFS4ERR_RESOURCE:
|
||||
case -NFS4ERR_LAYOUTTRYLATER:
|
||||
case -NFS4ERR_RECALLCONFLICT:
|
||||
case -NFS4ERR_RETURNCONFLICT:
|
||||
return -EREMOTEIO;
|
||||
case -NFS4ERR_WRONGSEC:
|
||||
case -NFS4ERR_WRONG_CRED:
|
||||
|
@ -558,6 +559,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server,
|
|||
case -NFS4ERR_GRACE:
|
||||
case -NFS4ERR_LAYOUTTRYLATER:
|
||||
case -NFS4ERR_RECALLCONFLICT:
|
||||
case -NFS4ERR_RETURNCONFLICT:
|
||||
exception->delay = 1;
|
||||
return 0;
|
||||
|
||||
|
@ -9691,6 +9693,7 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
|
|||
status = -EBUSY;
|
||||
break;
|
||||
case -NFS4ERR_RECALLCONFLICT:
|
||||
case -NFS4ERR_RETURNCONFLICT:
|
||||
status = -ERECALLCONFLICT;
|
||||
break;
|
||||
case -NFS4ERR_DELEG_REVOKED:
|
||||
|
|
|
@ -1602,7 +1602,8 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_pgio_args *args
|
|||
static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req, struct compound_hdr *hdr)
|
||||
{
|
||||
uint32_t attrs[3] = {
|
||||
FATTR4_WORD0_RDATTR_ERROR,
|
||||
FATTR4_WORD0_TYPE
|
||||
| FATTR4_WORD0_RDATTR_ERROR,
|
||||
FATTR4_WORD1_MOUNTED_ON_FILEID,
|
||||
};
|
||||
uint32_t dircount = readdir->count;
|
||||
|
@ -1612,12 +1613,20 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg
|
|||
unsigned int i;
|
||||
|
||||
if (readdir->plus) {
|
||||
attrs[0] |= FATTR4_WORD0_TYPE|FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE|
|
||||
FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE|FATTR4_WORD0_FILEID;
|
||||
attrs[1] |= FATTR4_WORD1_MODE|FATTR4_WORD1_NUMLINKS|FATTR4_WORD1_OWNER|
|
||||
FATTR4_WORD1_OWNER_GROUP|FATTR4_WORD1_RAWDEV|
|
||||
FATTR4_WORD1_SPACE_USED|FATTR4_WORD1_TIME_ACCESS|
|
||||
FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
|
||||
attrs[0] |= FATTR4_WORD0_CHANGE
|
||||
| FATTR4_WORD0_SIZE
|
||||
| FATTR4_WORD0_FSID
|
||||
| FATTR4_WORD0_FILEHANDLE
|
||||
| FATTR4_WORD0_FILEID;
|
||||
attrs[1] |= FATTR4_WORD1_MODE
|
||||
| FATTR4_WORD1_NUMLINKS
|
||||
| FATTR4_WORD1_OWNER
|
||||
| FATTR4_WORD1_OWNER_GROUP
|
||||
| FATTR4_WORD1_RAWDEV
|
||||
| FATTR4_WORD1_SPACE_USED
|
||||
| FATTR4_WORD1_TIME_ACCESS
|
||||
| FATTR4_WORD1_TIME_METADATA
|
||||
| FATTR4_WORD1_TIME_MODIFY;
|
||||
attrs[2] |= FATTR4_WORD2_SECURITY_LABEL;
|
||||
}
|
||||
/* Use mounted_on_fileid only if the server supports it */
|
||||
|
|
|
@ -400,6 +400,7 @@ DECLARE_EVENT_CLASS(nfs_lookup_event,
|
|||
__field(unsigned long, flags)
|
||||
__field(dev_t, dev)
|
||||
__field(u64, dir)
|
||||
__field(u64, fileid)
|
||||
__string(name, dentry->d_name.name)
|
||||
),
|
||||
|
||||
|
@ -407,16 +408,18 @@ DECLARE_EVENT_CLASS(nfs_lookup_event,
|
|||
__entry->dev = dir->i_sb->s_dev;
|
||||
__entry->dir = NFS_FILEID(dir);
|
||||
__entry->flags = flags;
|
||||
__entry->fileid = d_is_negative(dentry) ? 0 : NFS_FILEID(d_inode(dentry));
|
||||
__assign_str(name, dentry->d_name.name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
"flags=0x%lx (%s) name=%02x:%02x:%llu/%s fileid=%llu",
|
||||
__entry->flags,
|
||||
show_fs_lookup_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
__get_str(name),
|
||||
__entry->fileid
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -444,6 +447,7 @@ DECLARE_EVENT_CLASS(nfs_lookup_event_done,
|
|||
__field(unsigned long, flags)
|
||||
__field(dev_t, dev)
|
||||
__field(u64, dir)
|
||||
__field(u64, fileid)
|
||||
__string(name, dentry->d_name.name)
|
||||
),
|
||||
|
||||
|
@ -452,17 +456,19 @@ DECLARE_EVENT_CLASS(nfs_lookup_event_done,
|
|||
__entry->dir = NFS_FILEID(dir);
|
||||
__entry->error = error < 0 ? -error : 0;
|
||||
__entry->flags = flags;
|
||||
__entry->fileid = d_is_negative(dentry) ? 0 : NFS_FILEID(d_inode(dentry));
|
||||
__assign_str(name, dentry->d_name.name);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
|
||||
"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s fileid=%llu",
|
||||
-__entry->error, show_nfs_status(__entry->error),
|
||||
__entry->flags,
|
||||
show_fs_lookup_flags(__entry->flags),
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->dir,
|
||||
__get_str(name)
|
||||
__get_str(name),
|
||||
__entry->fileid
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -893,7 +899,7 @@ DECLARE_EVENT_CLASS(nfs_rename_event_done,
|
|||
DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
|
||||
DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
|
||||
|
||||
DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
|
||||
DEFINE_NFS_RENAME_EVENT_DONE(nfs_async_rename_done);
|
||||
|
||||
TRACE_EVENT(nfs_sillyrename_unlink,
|
||||
TP_PROTO(
|
||||
|
@ -1539,7 +1545,6 @@ DECLARE_EVENT_CLASS(nfs_direct_req_class,
|
|||
__field(u32, fhandle)
|
||||
__field(loff_t, offset)
|
||||
__field(ssize_t, count)
|
||||
__field(ssize_t, bytes_left)
|
||||
__field(ssize_t, error)
|
||||
__field(int, flags)
|
||||
),
|
||||
|
@ -1554,19 +1559,18 @@ DECLARE_EVENT_CLASS(nfs_direct_req_class,
|
|||
__entry->fhandle = nfs_fhandle_hash(fh);
|
||||
__entry->offset = dreq->io_start;
|
||||
__entry->count = dreq->count;
|
||||
__entry->bytes_left = dreq->bytes_left;
|
||||
__entry->error = dreq->error;
|
||||
__entry->flags = dreq->flags;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%zd fileid=%02x:%02x:%llu fhandle=0x%08x "
|
||||
"offset=%lld count=%zd bytes_left=%zd flags=%s",
|
||||
"offset=%lld count=%zd flags=%s",
|
||||
__entry->error, MAJOR(__entry->dev),
|
||||
MINOR(__entry->dev),
|
||||
(unsigned long long)__entry->fileid,
|
||||
__entry->fhandle, __entry->offset,
|
||||
__entry->count, __entry->bytes_left,
|
||||
__entry->count,
|
||||
nfs_show_direct_req_flags(__entry->flags)
|
||||
)
|
||||
);
|
||||
|
|
|
@ -2733,7 +2733,8 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
|
|||
if (pgio->pg_dreq == NULL)
|
||||
rd_size = i_size_read(pgio->pg_inode) - req_offset(req);
|
||||
else
|
||||
rd_size = nfs_dreq_bytes_left(pgio->pg_dreq);
|
||||
rd_size = nfs_dreq_bytes_left(pgio->pg_dreq,
|
||||
req_offset(req));
|
||||
|
||||
pgio->pg_lseg =
|
||||
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
|
||||
|
|
|
@ -267,7 +267,7 @@ static void nfs_async_rename_done(struct rpc_task *task, void *calldata)
|
|||
struct inode *new_dir = data->new_dir;
|
||||
struct dentry *old_dentry = data->old_dentry;
|
||||
|
||||
trace_nfs_sillyrename_rename(old_dir, old_dentry,
|
||||
trace_nfs_async_rename_done(old_dir, old_dentry,
|
||||
new_dir, data->new_dentry, task->tk_status);
|
||||
if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) {
|
||||
rpc_restart_call_prepare(task);
|
||||
|
|
|
@ -680,17 +680,6 @@ static int nfs_writepage_locked(struct folio *folio,
|
|||
return err;
|
||||
}
|
||||
|
||||
int nfs_writepage(struct page *page, struct writeback_control *wbc)
|
||||
{
|
||||
struct folio *folio = page_folio(page);
|
||||
int ret;
|
||||
|
||||
ret = nfs_writepage_locked(folio, wbc);
|
||||
if (ret != AOP_WRITEPAGE_ACTIVATE)
|
||||
unlock_page(page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nfs_writepages_callback(struct folio *folio,
|
||||
struct writeback_control *wbc, void *data)
|
||||
{
|
||||
|
|
|
@ -595,7 +595,6 @@ extern void nfs_complete_unlink(struct dentry *dentry, struct inode *);
|
|||
* linux/fs/nfs/write.c
|
||||
*/
|
||||
extern int nfs_congestion_kb;
|
||||
extern int nfs_writepage(struct page *page, struct writeback_control *wbc);
|
||||
extern int nfs_writepages(struct address_space *, struct writeback_control *);
|
||||
extern int nfs_flush_incompatible(struct file *file, struct folio *folio);
|
||||
extern int nfs_update_folio(struct file *file, struct folio *folio,
|
||||
|
|
|
@ -20,7 +20,8 @@
|
|||
#ifdef CONFIG_SUNRPC_BACKCHANNEL
|
||||
struct rpc_rqst *xprt_lookup_bc_request(struct rpc_xprt *xprt, __be32 xid);
|
||||
void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied);
|
||||
void xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task);
|
||||
void xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task,
|
||||
const struct rpc_timeout *to);
|
||||
void xprt_free_bc_request(struct rpc_rqst *req);
|
||||
int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs);
|
||||
void xprt_destroy_backchannel(struct rpc_xprt *, unsigned int max_reqs);
|
||||
|
|
|
@ -252,7 +252,6 @@ void rpc_clnt_probe_trunked_xprts(struct rpc_clnt *,
|
|||
|
||||
const char *rpc_proc_name(const struct rpc_task *task);
|
||||
|
||||
void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
|
||||
void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
|
||||
void rpc_clnt_xprt_switch_remove_xprt(struct rpc_clnt *, struct rpc_xprt *);
|
||||
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
|
||||
|
|
|
@ -37,6 +37,17 @@ struct rpc_wait {
|
|||
struct list_head timer_list; /* Timer list */
|
||||
};
|
||||
|
||||
/*
|
||||
* This describes a timeout strategy
|
||||
*/
|
||||
struct rpc_timeout {
|
||||
unsigned long to_initval, /* initial timeout */
|
||||
to_maxval, /* max timeout */
|
||||
to_increment; /* if !exponential */
|
||||
unsigned int to_retries; /* max # of retries */
|
||||
unsigned char to_exponential;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the RPC task struct
|
||||
*/
|
||||
|
@ -205,7 +216,8 @@ struct rpc_wait_queue {
|
|||
*/
|
||||
struct rpc_task *rpc_new_task(const struct rpc_task_setup *);
|
||||
struct rpc_task *rpc_run_task(const struct rpc_task_setup *);
|
||||
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req);
|
||||
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req,
|
||||
struct rpc_timeout *timeout);
|
||||
void rpc_put_task(struct rpc_task *);
|
||||
void rpc_put_task_async(struct rpc_task *);
|
||||
bool rpc_task_set_rpc_status(struct rpc_task *task, int rpc_status);
|
||||
|
|
|
@ -231,6 +231,8 @@ struct svc_rqst {
|
|||
struct net *rq_bc_net; /* pointer to backchannel's
|
||||
* net namespace
|
||||
*/
|
||||
unsigned long bc_to_initval;
|
||||
unsigned int bc_to_retries;
|
||||
void ** rq_lease_breaker; /* The v4 client breaking a lease */
|
||||
unsigned int rq_status_counter; /* RPC processing counter */
|
||||
};
|
||||
|
|
|
@ -30,17 +30,6 @@
|
|||
#define RPC_MAXCWND(xprt) ((xprt)->max_reqs << RPC_CWNDSHIFT)
|
||||
#define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd)
|
||||
|
||||
/*
|
||||
* This describes a timeout strategy
|
||||
*/
|
||||
struct rpc_timeout {
|
||||
unsigned long to_initval, /* initial timeout */
|
||||
to_maxval, /* max timeout */
|
||||
to_increment; /* if !exponential */
|
||||
unsigned int to_retries; /* max # of retries */
|
||||
unsigned char to_exponential;
|
||||
};
|
||||
|
||||
enum rpc_display_format_t {
|
||||
RPC_DISPLAY_ADDR = 0,
|
||||
RPC_DISPLAY_PORT,
|
||||
|
|
|
@ -803,15 +803,24 @@ out_revert:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_switch_client_transport);
|
||||
|
||||
static
|
||||
int _rpc_clnt_xprt_iter_init(struct rpc_clnt *clnt, struct rpc_xprt_iter *xpi,
|
||||
void func(struct rpc_xprt_iter *xpi, struct rpc_xprt_switch *xps))
|
||||
static struct rpc_xprt_switch *rpc_clnt_xprt_switch_get(struct rpc_clnt *clnt)
|
||||
{
|
||||
struct rpc_xprt_switch *xps;
|
||||
|
||||
rcu_read_lock();
|
||||
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
|
||||
rcu_read_unlock();
|
||||
|
||||
return xps;
|
||||
}
|
||||
|
||||
static
|
||||
int _rpc_clnt_xprt_iter_init(struct rpc_clnt *clnt, struct rpc_xprt_iter *xpi,
|
||||
void func(struct rpc_xprt_iter *xpi, struct rpc_xprt_switch *xps))
|
||||
{
|
||||
struct rpc_xprt_switch *xps;
|
||||
|
||||
xps = rpc_clnt_xprt_switch_get(clnt);
|
||||
if (xps == NULL)
|
||||
return -EAGAIN;
|
||||
func(xpi, xps);
|
||||
|
@ -1308,8 +1317,10 @@ static void call_bc_encode(struct rpc_task *task);
|
|||
* rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
|
||||
* rpc_execute against it
|
||||
* @req: RPC request
|
||||
* @timeout: timeout values to use for this task
|
||||
*/
|
||||
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req)
|
||||
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req,
|
||||
struct rpc_timeout *timeout)
|
||||
{
|
||||
struct rpc_task *task;
|
||||
struct rpc_task_setup task_setup_data = {
|
||||
|
@ -1328,7 +1339,7 @@ struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req)
|
|||
return task;
|
||||
}
|
||||
|
||||
xprt_init_bc_request(req, task);
|
||||
xprt_init_bc_request(req, task, timeout);
|
||||
|
||||
task->tk_action = call_bc_encode;
|
||||
atomic_inc(&task->tk_count);
|
||||
|
@ -2212,9 +2223,7 @@ call_connect_status(struct rpc_task *task)
|
|||
struct rpc_xprt *saved = task->tk_xprt;
|
||||
struct rpc_xprt_switch *xps;
|
||||
|
||||
rcu_read_lock();
|
||||
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
|
||||
rcu_read_unlock();
|
||||
xps = rpc_clnt_xprt_switch_get(clnt);
|
||||
if (xps->xps_nxprts > 1) {
|
||||
long value;
|
||||
|
||||
|
@ -3122,7 +3131,6 @@ static int rpc_xprt_probe_trunked(struct rpc_clnt *clnt,
|
|||
struct rpc_xprt *xprt,
|
||||
struct rpc_add_xprt_test *data)
|
||||
{
|
||||
struct rpc_xprt_switch *xps;
|
||||
struct rpc_xprt *main_xprt;
|
||||
int status = 0;
|
||||
|
||||
|
@ -3130,7 +3138,6 @@ static int rpc_xprt_probe_trunked(struct rpc_clnt *clnt,
|
|||
|
||||
rcu_read_lock();
|
||||
main_xprt = xprt_get(rcu_dereference(clnt->cl_xprt));
|
||||
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
|
||||
status = rpc_cmp_addr_port((struct sockaddr *)&xprt->addr,
|
||||
(struct sockaddr *)&main_xprt->addr);
|
||||
rcu_read_unlock();
|
||||
|
@ -3141,7 +3148,6 @@ static int rpc_xprt_probe_trunked(struct rpc_clnt *clnt,
|
|||
status = rpc_clnt_add_xprt_helper(clnt, xprt, data);
|
||||
out:
|
||||
xprt_put(xprt);
|
||||
xprt_switch_put(xps);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -3256,34 +3262,27 @@ rpc_set_connect_timeout(struct rpc_clnt *clnt,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_set_connect_timeout);
|
||||
|
||||
void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt)
|
||||
{
|
||||
rcu_read_lock();
|
||||
xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
|
||||
rcu_read_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_put);
|
||||
|
||||
void rpc_clnt_xprt_set_online(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
|
||||
{
|
||||
struct rpc_xprt_switch *xps;
|
||||
|
||||
rcu_read_lock();
|
||||
xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch);
|
||||
rcu_read_unlock();
|
||||
xps = rpc_clnt_xprt_switch_get(clnt);
|
||||
xprt_set_online_locked(xprt, xps);
|
||||
xprt_switch_put(xps);
|
||||
}
|
||||
|
||||
void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
|
||||
{
|
||||
struct rpc_xprt_switch *xps;
|
||||
|
||||
if (rpc_clnt_xprt_switch_has_addr(clnt,
|
||||
(const struct sockaddr *)&xprt->addr)) {
|
||||
return rpc_clnt_xprt_set_online(clnt, xprt);
|
||||
}
|
||||
rcu_read_lock();
|
||||
rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch),
|
||||
xprt);
|
||||
rcu_read_unlock();
|
||||
|
||||
xps = rpc_clnt_xprt_switch_get(clnt);
|
||||
rpc_xprt_switch_add_xprt(xps, xprt);
|
||||
xprt_switch_put(xps);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_add_xprt);
|
||||
|
||||
|
|
|
@ -1550,6 +1550,7 @@ void svc_process_bc(struct rpc_rqst *req, struct svc_rqst *rqstp)
|
|||
{
|
||||
struct rpc_task *task;
|
||||
int proc_error;
|
||||
struct rpc_timeout timeout;
|
||||
|
||||
/* Build the svc_rqst used by the common processing routine */
|
||||
rqstp->rq_xid = req->rq_xid;
|
||||
|
@ -1595,8 +1596,16 @@ void svc_process_bc(struct rpc_rqst *req, struct svc_rqst *rqstp)
|
|||
return;
|
||||
}
|
||||
/* Finally, send the reply synchronously */
|
||||
if (rqstp->bc_to_initval > 0) {
|
||||
timeout.to_initval = rqstp->bc_to_initval;
|
||||
timeout.to_retries = rqstp->bc_to_initval;
|
||||
} else {
|
||||
timeout.to_initval = req->rq_xprt->timeout->to_initval;
|
||||
timeout.to_initval = req->rq_xprt->timeout->to_retries;
|
||||
}
|
||||
memcpy(&req->rq_snd_buf, &rqstp->rq_res, sizeof(req->rq_snd_buf));
|
||||
task = rpc_run_bc_task(req);
|
||||
task = rpc_run_bc_task(req, &timeout);
|
||||
|
||||
if (IS_ERR(task))
|
||||
return;
|
||||
|
||||
|
|
|
@ -651,9 +651,9 @@ static unsigned long xprt_abs_ktime_to_jiffies(ktime_t abstime)
|
|||
jiffies + nsecs_to_jiffies(-delta);
|
||||
}
|
||||
|
||||
static unsigned long xprt_calc_majortimeo(struct rpc_rqst *req)
|
||||
static unsigned long xprt_calc_majortimeo(struct rpc_rqst *req,
|
||||
const struct rpc_timeout *to)
|
||||
{
|
||||
const struct rpc_timeout *to = req->rq_task->tk_client->cl_timeout;
|
||||
unsigned long majortimeo = req->rq_timeout;
|
||||
|
||||
if (to->to_exponential)
|
||||
|
@ -665,9 +665,10 @@ static unsigned long xprt_calc_majortimeo(struct rpc_rqst *req)
|
|||
return majortimeo;
|
||||
}
|
||||
|
||||
static void xprt_reset_majortimeo(struct rpc_rqst *req)
|
||||
static void xprt_reset_majortimeo(struct rpc_rqst *req,
|
||||
const struct rpc_timeout *to)
|
||||
{
|
||||
req->rq_majortimeo += xprt_calc_majortimeo(req);
|
||||
req->rq_majortimeo += xprt_calc_majortimeo(req, to);
|
||||
}
|
||||
|
||||
static void xprt_reset_minortimeo(struct rpc_rqst *req)
|
||||
|
@ -675,7 +676,8 @@ static void xprt_reset_minortimeo(struct rpc_rqst *req)
|
|||
req->rq_minortimeo += req->rq_timeout;
|
||||
}
|
||||
|
||||
static void xprt_init_majortimeo(struct rpc_task *task, struct rpc_rqst *req)
|
||||
static void xprt_init_majortimeo(struct rpc_task *task, struct rpc_rqst *req,
|
||||
const struct rpc_timeout *to)
|
||||
{
|
||||
unsigned long time_init;
|
||||
struct rpc_xprt *xprt = req->rq_xprt;
|
||||
|
@ -684,8 +686,9 @@ static void xprt_init_majortimeo(struct rpc_task *task, struct rpc_rqst *req)
|
|||
time_init = jiffies;
|
||||
else
|
||||
time_init = xprt_abs_ktime_to_jiffies(task->tk_start);
|
||||
req->rq_timeout = task->tk_client->cl_timeout->to_initval;
|
||||
req->rq_majortimeo = time_init + xprt_calc_majortimeo(req);
|
||||
|
||||
req->rq_timeout = to->to_initval;
|
||||
req->rq_majortimeo = time_init + xprt_calc_majortimeo(req, to);
|
||||
req->rq_minortimeo = time_init + req->rq_timeout;
|
||||
}
|
||||
|
||||
|
@ -713,7 +716,7 @@ int xprt_adjust_timeout(struct rpc_rqst *req)
|
|||
} else {
|
||||
req->rq_timeout = to->to_initval;
|
||||
req->rq_retries = 0;
|
||||
xprt_reset_majortimeo(req);
|
||||
xprt_reset_majortimeo(req, to);
|
||||
/* Reset the RTT counters == "slow start" */
|
||||
spin_lock(&xprt->transport_lock);
|
||||
rpc_init_rtt(req->rq_task->tk_client->cl_rtt, to->to_initval);
|
||||
|
@ -1886,7 +1889,7 @@ xprt_request_init(struct rpc_task *task)
|
|||
req->rq_snd_buf.bvec = NULL;
|
||||
req->rq_rcv_buf.bvec = NULL;
|
||||
req->rq_release_snd_buf = NULL;
|
||||
xprt_init_majortimeo(task, req);
|
||||
xprt_init_majortimeo(task, req, task->tk_client->cl_timeout);
|
||||
|
||||
trace_xprt_reserve(req);
|
||||
}
|
||||
|
@ -1983,7 +1986,8 @@ void xprt_release(struct rpc_task *task)
|
|||
|
||||
#ifdef CONFIG_SUNRPC_BACKCHANNEL
|
||||
void
|
||||
xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task)
|
||||
xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task,
|
||||
const struct rpc_timeout *to)
|
||||
{
|
||||
struct xdr_buf *xbufp = &req->rq_snd_buf;
|
||||
|
||||
|
@ -1996,6 +2000,13 @@ xprt_init_bc_request(struct rpc_rqst *req, struct rpc_task *task)
|
|||
*/
|
||||
xbufp->len = xbufp->head[0].iov_len + xbufp->page_len +
|
||||
xbufp->tail[0].iov_len;
|
||||
/*
|
||||
* Backchannel Replies are sent with !RPC_TASK_SOFT and
|
||||
* RPC_TASK_NO_RETRANS_TIMEOUT. The major timeout setting
|
||||
* affects only how long each Reply waits to be sent when
|
||||
* a transport connection cannot be established.
|
||||
*/
|
||||
xprt_init_majortimeo(task, req, to);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -284,7 +284,7 @@ struct rpc_xprt *_xprt_switch_find_current_entry(struct list_head *head,
|
|||
if (cur == pos)
|
||||
found = true;
|
||||
if (found && ((find_active && xprt_is_active(pos)) ||
|
||||
(!find_active && xprt_is_active(pos))))
|
||||
(!find_active && !xprt_is_active(pos))))
|
||||
return pos;
|
||||
}
|
||||
return NULL;
|
||||
|
@ -336,7 +336,8 @@ struct rpc_xprt *xprt_iter_current_entry_offline(struct rpc_xprt_iter *xpi)
|
|||
xprt_switch_find_current_entry_offline);
|
||||
}
|
||||
|
||||
bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
||||
static
|
||||
bool __rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
||||
const struct sockaddr *sap)
|
||||
{
|
||||
struct list_head *head;
|
||||
|
@ -356,6 +357,18 @@ bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
||||
const struct sockaddr *sap)
|
||||
{
|
||||
bool res;
|
||||
|
||||
rcu_read_lock();
|
||||
res = __rpc_xprt_switch_has_addr(xps, sap);
|
||||
rcu_read_unlock();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static
|
||||
struct rpc_xprt *xprt_switch_find_next_entry(struct list_head *head,
|
||||
const struct rpc_xprt *cur, bool check_active)
|
||||
|
|
Loading…
Add table
Reference in a new issue