Skip to content

Commit 663dfb6

Browse files
committed
netfs: Refactor arguments for netfs_alloc_read_request
Pass start and len to the rreq allocator. This should ensure that the fields are set so that ->init_request() can use them. Also add a parameter to indicates the origin of the request. Ceph can use this to tell whether to get caps. Changes ======= ver #3) - Change the author to me as Jeff feels that most of the patch is my changes now. ver #2) - Show the request origin in the netfs_rreq tracepoint. Signed-off-by: Jeff Layton <[email protected]> Co-developed-by: David Howells <[email protected]> Signed-off-by: David Howells <[email protected]> cc: [email protected] Link: https://lore.kernel.org/r/164622989020.3564931.17517006047854958747.stgit@warthog.procyon.org.uk/ # v1 Link: https://lore.kernel.org/r/164678208569.1200972.12153682697842916557.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/164692904155.2099075.14717645623034355995.stgit@warthog.procyon.org.uk/ # v3
1 parent 5c88705 commit 663dfb6

File tree

5 files changed

+43
-18
lines changed

5 files changed

+43
-18
lines changed

fs/netfs/internal.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
/*
1818
* objects.c
1919
*/
20-
struct netfs_io_request *netfs_alloc_request(const struct netfs_request_ops *ops,
20+
struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
21+
struct file *file,
22+
const struct netfs_request_ops *ops,
2123
void *netfs_priv,
22-
struct file *file);
24+
loff_t start, size_t len,
25+
enum netfs_io_origin origin);
2326
void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what);
2427
void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async);
2528
void netfs_put_request(struct netfs_io_request *rreq, bool was_async,

fs/netfs/objects.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,24 @@
1111
/*
1212
* Allocate an I/O request and initialise it.
1313
*/
14-
struct netfs_io_request *netfs_alloc_request(
15-
const struct netfs_request_ops *ops, void *netfs_priv,
16-
struct file *file)
14+
struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
15+
struct file *file,
16+
const struct netfs_request_ops *ops,
17+
void *netfs_priv,
18+
loff_t start, size_t len,
19+
enum netfs_io_origin origin)
1720
{
1821
static atomic_t debug_ids;
1922
struct netfs_io_request *rreq;
2023

2124
rreq = kzalloc(sizeof(struct netfs_io_request), GFP_KERNEL);
2225
if (rreq) {
26+
rreq->start = start;
27+
rreq->len = len;
28+
rreq->origin = origin;
2329
rreq->netfs_ops = ops;
2430
rreq->netfs_priv = netfs_priv;
31+
rreq->mapping = mapping;
2532
rreq->inode = file_inode(file);
2633
rreq->i_size = i_size_read(rreq->inode);
2734
rreq->debug_id = atomic_inc_return(&debug_ids);

fs/netfs/read_helper.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -763,12 +763,13 @@ void netfs_readahead(struct readahead_control *ractl,
763763
if (readahead_count(ractl) == 0)
764764
goto cleanup;
765765

766-
rreq = netfs_alloc_request(ops, netfs_priv, ractl->file);
766+
rreq = netfs_alloc_request(ractl->mapping, ractl->file,
767+
ops, netfs_priv,
768+
readahead_pos(ractl),
769+
readahead_length(ractl),
770+
NETFS_READAHEAD);
767771
if (!rreq)
768772
goto cleanup;
769-
rreq->mapping = ractl->mapping;
770-
rreq->start = readahead_pos(ractl);
771-
rreq->len = readahead_length(ractl);
772773

773774
if (ops->begin_cache_operation) {
774775
ret = ops->begin_cache_operation(rreq);
@@ -838,16 +839,15 @@ int netfs_readpage(struct file *file,
838839

839840
_enter("%lx", folio_index(folio));
840841

841-
rreq = netfs_alloc_request(ops, netfs_priv, file);
842+
rreq = netfs_alloc_request(folio->mapping, file, ops, netfs_priv,
843+
folio_file_pos(folio), folio_size(folio),
844+
NETFS_READPAGE);
842845
if (!rreq) {
843846
if (netfs_priv)
844847
ops->cleanup(folio_file_mapping(folio), netfs_priv);
845848
folio_unlock(folio);
846849
return -ENOMEM;
847850
}
848-
rreq->mapping = folio_file_mapping(folio);
849-
rreq->start = folio_file_pos(folio);
850-
rreq->len = folio_size(folio);
851851

852852
if (ops->begin_cache_operation) {
853853
ret = ops->begin_cache_operation(rreq);
@@ -1008,12 +1008,11 @@ int netfs_write_begin(struct file *file, struct address_space *mapping,
10081008
}
10091009

10101010
ret = -ENOMEM;
1011-
rreq = netfs_alloc_request(ops, netfs_priv, file);
1011+
rreq = netfs_alloc_request(mapping, file, ops, netfs_priv,
1012+
folio_file_pos(folio), folio_size(folio),
1013+
NETFS_READ_FOR_WRITE);
10121014
if (!rreq)
10131015
goto error;
1014-
rreq->mapping = folio_file_mapping(folio);
1015-
rreq->start = folio_file_pos(folio);
1016-
rreq->len = folio_size(folio);
10171016
rreq->no_unlock_folio = folio_index(folio);
10181017
__set_bit(NETFS_RREQ_NO_UNLOCK_FOLIO, &rreq->flags);
10191018
netfs_priv = NULL;

include/linux/netfs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ struct netfs_io_subrequest {
150150
#define NETFS_SREQ_NO_PROGRESS 4 /* Set if we didn't manage to read any data */
151151
};
152152

153+
enum netfs_io_origin {
154+
NETFS_READAHEAD, /* This read was triggered by readahead */
155+
NETFS_READPAGE, /* This read is a synchronous read */
156+
NETFS_READ_FOR_WRITE, /* This read is to prepare a write */
157+
} __mode(byte);
158+
153159
/*
154160
* Descriptor for an I/O helper request. This is used to make multiple I/O
155161
* operations to a variety of data stores and then stitch the result together.
@@ -167,6 +173,7 @@ struct netfs_io_request {
167173
size_t submitted; /* Amount submitted for I/O so far */
168174
size_t len; /* Length of the request */
169175
short error; /* 0 or error that occurred */
176+
enum netfs_io_origin origin; /* Origin of the request */
170177
loff_t i_size; /* Size of the file */
171178
loff_t start; /* Start position */
172179
pgoff_t no_unlock_folio; /* Don't unlock this folio after read */

include/trace/events/netfs.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
EM(netfs_read_trace_readpage, "READPAGE ") \
2222
E_(netfs_read_trace_write_begin, "WRITEBEGN")
2323

24+
#define netfs_rreq_origins \
25+
EM(NETFS_READAHEAD, "RA") \
26+
EM(NETFS_READPAGE, "RP") \
27+
E_(NETFS_READ_FOR_WRITE, "RW")
28+
2429
#define netfs_rreq_traces \
2530
EM(netfs_rreq_trace_assess, "ASSESS ") \
2631
EM(netfs_rreq_trace_copy, "COPY ") \
@@ -101,6 +106,7 @@ enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
101106
#define E_(a, b) TRACE_DEFINE_ENUM(a);
102107

103108
netfs_read_traces;
109+
netfs_rreq_origins;
104110
netfs_rreq_traces;
105111
netfs_sreq_sources;
106112
netfs_sreq_traces;
@@ -159,17 +165,20 @@ TRACE_EVENT(netfs_rreq,
159165
TP_STRUCT__entry(
160166
__field(unsigned int, rreq )
161167
__field(unsigned int, flags )
168+
__field(enum netfs_io_origin, origin )
162169
__field(enum netfs_rreq_trace, what )
163170
),
164171

165172
TP_fast_assign(
166173
__entry->rreq = rreq->debug_id;
167174
__entry->flags = rreq->flags;
175+
__entry->origin = rreq->origin;
168176
__entry->what = what;
169177
),
170178

171-
TP_printk("R=%08x %s f=%02x",
179+
TP_printk("R=%08x %s %s f=%02x",
172180
__entry->rreq,
181+
__print_symbolic(__entry->origin, netfs_rreq_origins),
173182
__print_symbolic(__entry->what, netfs_rreq_traces),
174183
__entry->flags)
175184
);

0 commit comments

Comments
 (0)