Skip to content

Commit 878b3df

Browse files
author
Trond Myklebust
committed
Merge part 2 of branch 'sysfs-devel'
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
2 parents dd5c153 + 6f08169 commit 878b3df

11 files changed

Lines changed: 177 additions & 18 deletions

File tree

fs/nfs/nfs4proc.c

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,11 @@ static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
11551155
struct nfs4_sequence_args *args,
11561156
struct nfs4_sequence_res *res)
11571157
{
1158-
return nfs4_do_call_sync(clnt, server, msg, args, res, 0);
1158+
unsigned short task_flags = 0;
1159+
1160+
if (server->nfs_client->cl_minorversion)
1161+
task_flags = RPC_TASK_MOVEABLE;
1162+
return nfs4_do_call_sync(clnt, server, msg, args, res, task_flags);
11591163
}
11601164

11611165

@@ -2566,6 +2570,9 @@ static int nfs4_run_open_task(struct nfs4_opendata *data,
25662570
};
25672571
int status;
25682572

2573+
if (server->nfs_client->cl_minorversion)
2574+
task_setup_data.flags |= RPC_TASK_MOVEABLE;
2575+
25692576
kref_get(&data->kref);
25702577
data->rpc_done = false;
25712578
data->rpc_status = 0;
@@ -3746,6 +3753,9 @@ int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
37463753
};
37473754
int status = -ENOMEM;
37483755

3756+
if (server->nfs_client->cl_minorversion)
3757+
task_setup_data.flags |= RPC_TASK_MOVEABLE;
3758+
37493759
nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP,
37503760
&task_setup_data.rpc_client, &msg);
37513761

@@ -4185,6 +4195,9 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
41854195
};
41864196
unsigned short task_flags = 0;
41874197

4198+
if (nfs4_has_session(server->nfs_client))
4199+
task_flags = RPC_TASK_MOVEABLE;
4200+
41884201
/* Is this is an attribute revalidation, subject to softreval? */
41894202
if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
41904203
task_flags |= RPC_TASK_TIMEOUT;
@@ -4304,6 +4317,9 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
43044317
};
43054318
unsigned short task_flags = 0;
43064319

4320+
if (server->nfs_client->cl_minorversion)
4321+
task_flags = RPC_TASK_MOVEABLE;
4322+
43074323
/* Is this is an attribute revalidation, subject to softreval? */
43084324
if (nfs_lookup_is_soft_revalidate(dentry))
43094325
task_flags |= RPC_TASK_TIMEOUT;
@@ -6535,7 +6551,7 @@ static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred,
65356551
.rpc_client = server->client,
65366552
.rpc_message = &msg,
65376553
.callback_ops = &nfs4_delegreturn_ops,
6538-
.flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
6554+
.flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT | RPC_TASK_MOVEABLE,
65396555
};
65406556
int status = 0;
65416557

@@ -6853,6 +6869,11 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
68536869
.workqueue = nfsiod_workqueue,
68546870
.flags = RPC_TASK_ASYNC,
68556871
};
6872+
struct nfs_client *client =
6873+
NFS_SERVER(lsp->ls_state->inode)->nfs_client;
6874+
6875+
if (client->cl_minorversion)
6876+
task_setup_data.flags |= RPC_TASK_MOVEABLE;
68566877

68576878
nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client,
68586879
NFS_SP4_MACH_CRED_CLEANUP, &task_setup_data.rpc_client, &msg);
@@ -7127,6 +7148,10 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
71277148
.flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
71287149
};
71297150
int ret;
7151+
struct nfs_client *client = NFS_SERVER(state->inode)->nfs_client;
7152+
7153+
if (client->cl_minorversion)
7154+
task_setup_data.flags |= RPC_TASK_MOVEABLE;
71307155

71317156
dprintk("%s: begin!\n", __func__);
71327157
data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
@@ -9220,7 +9245,7 @@ static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
92209245
.rpc_client = clp->cl_rpcclient,
92219246
.rpc_message = &msg,
92229247
.callback_ops = &nfs41_sequence_ops,
9223-
.flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
9248+
.flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT | RPC_TASK_MOVEABLE,
92249249
};
92259250
struct rpc_task *ret;
92269251

@@ -9542,7 +9567,8 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout)
95429567
.rpc_message = &msg,
95439568
.callback_ops = &nfs4_layoutget_call_ops,
95449569
.callback_data = lgp,
9545-
.flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
9570+
.flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF |
9571+
RPC_TASK_MOVEABLE,
95469572
};
95479573
struct pnfs_layout_segment *lseg = NULL;
95489574
struct nfs4_exception exception = {
@@ -9680,6 +9706,7 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
96809706
.rpc_message = &msg,
96819707
.callback_ops = &nfs4_layoutreturn_call_ops,
96829708
.callback_data = lrp,
9709+
.flags = RPC_TASK_MOVEABLE,
96839710
};
96849711
int status = 0;
96859712

@@ -9834,6 +9861,7 @@ nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync)
98349861
.rpc_message = &msg,
98359862
.callback_ops = &nfs4_layoutcommit_ops,
98369863
.callback_data = data,
9864+
.flags = RPC_TASK_MOVEABLE,
98379865
};
98389866
struct rpc_task *task;
98399867
int status = 0;
@@ -10161,7 +10189,7 @@ static int nfs41_free_stateid(struct nfs_server *server,
1016110189
.rpc_client = server->client,
1016210190
.rpc_message = &msg,
1016310191
.callback_ops = &nfs41_free_stateid_ops,
10164-
.flags = RPC_TASK_ASYNC,
10192+
.flags = RPC_TASK_ASYNC | RPC_TASK_MOVEABLE,
1016510193
};
1016610194
struct nfs_free_stateid_data *data;
1016710195
struct rpc_task *task;

fs/nfs/pagelist.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,7 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
954954
{
955955
struct nfs_pgio_header *hdr;
956956
int ret;
957+
unsigned short task_flags = 0;
957958

958959
hdr = nfs_pgio_header_alloc(desc->pg_rw_ops);
959960
if (!hdr) {
@@ -962,14 +963,17 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
962963
}
963964
nfs_pgheader_init(desc, hdr, nfs_pgio_header_free);
964965
ret = nfs_generic_pgio(desc, hdr);
965-
if (ret == 0)
966+
if (ret == 0) {
967+
if (NFS_SERVER(hdr->inode)->nfs_client->cl_minorversion)
968+
task_flags = RPC_TASK_MOVEABLE;
966969
ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode),
967970
hdr,
968971
hdr->cred,
969972
NFS_PROTO(hdr->inode),
970973
desc->pg_rpc_callops,
971974
desc->pg_ioflags,
972-
RPC_TASK_CRED_NOREF);
975+
RPC_TASK_CRED_NOREF | task_flags);
976+
}
973977
return ret;
974978
}
975979

fs/nfs/write.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1810,6 +1810,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
18101810
struct nfs_commit_info *cinfo)
18111811
{
18121812
struct nfs_commit_data *data;
1813+
unsigned short task_flags = 0;
18131814

18141815
/* another commit raced with us */
18151816
if (list_empty(head))
@@ -1820,8 +1821,11 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
18201821
/* Set up the argument struct */
18211822
nfs_init_commit(data, head, NULL, cinfo);
18221823
atomic_inc(&cinfo->mds->rpcs_out);
1824+
if (NFS_SERVER(inode)->nfs_client->cl_minorversion)
1825+
task_flags = RPC_TASK_MOVEABLE;
18231826
return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
1824-
data->mds_ops, how, RPC_TASK_CRED_NOREF);
1827+
data->mds_ops, how,
1828+
RPC_TASK_CRED_NOREF | task_flags);
18251829
}
18261830

18271831
/*

include/linux/sunrpc/sched.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ struct rpc_task_setup {
121121
*/
122122
#define RPC_TASK_ASYNC 0x0001 /* is an async task */
123123
#define RPC_TASK_SWAPPER 0x0002 /* is swapping in/out */
124+
#define RPC_TASK_MOVEABLE 0x0004 /* nfs4.1+ rpc tasks */
124125
#define RPC_TASK_NULLCREDS 0x0010 /* Use AUTH_NULL credential */
125126
#define RPC_CALL_MAJORSEEN 0x0020 /* major timeout seen */
126127
#define RPC_TASK_ROOTCREDS 0x0040 /* force root creds */
@@ -139,6 +140,7 @@ struct rpc_task_setup {
139140
#define RPC_IS_SOFT(t) ((t)->tk_flags & (RPC_TASK_SOFT|RPC_TASK_TIMEOUT))
140141
#define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN)
141142
#define RPC_WAS_SENT(t) ((t)->tk_flags & RPC_TASK_SENT)
143+
#define RPC_IS_MOVEABLE(t) ((t)->tk_flags & RPC_TASK_MOVEABLE)
142144

143145
#define RPC_TASK_RUNNING 0
144146
#define RPC_TASK_QUEUED 1

include/linux/sunrpc/xprt.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ struct rpc_xprt {
293293
struct rcu_head rcu;
294294
const struct xprt_class *xprt_class;
295295
struct rpc_sysfs_xprt *xprt_sysfs;
296+
bool main; /*mark if this is the 1st transport */
296297
};
297298

298299
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
@@ -426,6 +427,8 @@ void xprt_release_write(struct rpc_xprt *, struct rpc_task *);
426427
#define XPRT_BOUND (4)
427428
#define XPRT_BINDING (5)
428429
#define XPRT_CLOSING (6)
430+
#define XPRT_OFFLINE (7)
431+
#define XPRT_REMOVE (8)
429432
#define XPRT_CONGESTED (9)
430433
#define XPRT_CWND_WAIT (10)
431434
#define XPRT_WRITE_SPACE (11)

include/linux/sunrpc/xprtsock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
int init_socket_xprt(void);
1212
void cleanup_socket_xprt(void);
13+
unsigned short get_srcport(struct rpc_xprt *);
1314

1415
#define RPC_MIN_RESVPORT (1U)
1516
#define RPC_MAX_RESVPORT (65535U)

net/sunrpc/clnt.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
412412
}
413413

414414
rpc_clnt_set_transport(clnt, xprt, timeout);
415+
xprt->main = true;
415416
xprt_iter_init(&clnt->cl_xpi, xps);
416417
xprt_switch_put(xps);
417418

@@ -2105,6 +2106,30 @@ call_connect_status(struct rpc_task *task)
21052106
case -ENOTCONN:
21062107
case -EAGAIN:
21072108
case -ETIMEDOUT:
2109+
if (!(task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) &&
2110+
(task->tk_flags & RPC_TASK_MOVEABLE) &&
2111+
test_bit(XPRT_REMOVE, &xprt->state)) {
2112+
struct rpc_xprt *saved = task->tk_xprt;
2113+
struct rpc_xprt_switch *xps;
2114+
2115+
rcu_read_lock();
2116+
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
2117+
rcu_read_unlock();
2118+
if (xps->xps_nxprts > 1) {
2119+
long value;
2120+
2121+
xprt_release(task);
2122+
value = atomic_long_dec_return(&xprt->queuelen);
2123+
if (value == 0)
2124+
rpc_xprt_switch_remove_xprt(xps, saved);
2125+
xprt_put(saved);
2126+
task->tk_xprt = NULL;
2127+
task->tk_action = call_start;
2128+
}
2129+
xprt_switch_put(xps);
2130+
if (!task->tk_xprt)
2131+
return;
2132+
}
21082133
goto out_retry;
21092134
case -ENOBUFS:
21102135
rpc_delay(task, HZ >> 2);

0 commit comments

Comments
 (0)