Skip to content

Commit 0fb3442

Browse files
committed
Merge tag 'vfs-6.16-rc1.netfs' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull netfs updates from Christian Brauner: - The main API document has been extensively updated/rewritten - Fix an oops in write-retry due to mis-resetting the I/O iterator - Fix the recording of transferred bytes for short DIO reads - Fix a request's work item to not require a reference, thereby avoiding the need to get rid of it in BH/IRQ context - Fix waiting and waking to be consistent about the waitqueue used - Remove NETFS_SREQ_SEEK_DATA_READ, NETFS_INVALID_WRITE, NETFS_ICTX_WRITETHROUGH, NETFS_READ_HOLE_CLEAR, NETFS_RREQ_DONT_UNLOCK_FOLIOS, and NETFS_RREQ_BLOCKED - Reorder structs to eliminate holes - Remove netfs_io_request::ractl - Only provide proc_link field if CONFIG_PROC_FS=y - Remove folio_queue::marks3 - Fix undifferentiation of DIO reads from unbuffered reads * tag 'vfs-6.16-rc1.netfs' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: netfs: Fix undifferentiation of DIO reads from unbuffered reads netfs: Fix wait/wake to be consistent about the waitqueue used netfs: Fix the request's work item to not require a ref netfs: Fix setting of transferred bytes with short DIO reads netfs: Fix oops in write-retry from mis-resetting the subreq iterator fs/netfs: remove unused flag NETFS_RREQ_BLOCKED fs/netfs: remove unused flag NETFS_RREQ_DONT_UNLOCK_FOLIOS folio_queue: remove unused field `marks3` fs/netfs: declare field `proc_link` only if CONFIG_PROC_FS=y fs/netfs: remove `netfs_io_request.ractl` fs/netfs: reorder struct fields to eliminate holes fs/netfs: remove unused enum choice NETFS_READ_HOLE_CLEAR fs/netfs: remove unused flag NETFS_ICTX_WRITETHROUGH fs/netfs: remove unused source NETFS_INVALID_WRITE fs/netfs: remove unused flag NETFS_SREQ_SEEK_DATA_READ
2 parents fcd0bb8 + db26d62 commit 0fb3442

33 files changed

+478
-487
lines changed

Documentation/core-api/folio_queue.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,19 +151,16 @@ The marks can be set by::
151151

152152
void folioq_mark(struct folio_queue *folioq, unsigned int slot);
153153
void folioq_mark2(struct folio_queue *folioq, unsigned int slot);
154-
void folioq_mark3(struct folio_queue *folioq, unsigned int slot);
155154

156155
Cleared by::
157156

158157
void folioq_unmark(struct folio_queue *folioq, unsigned int slot);
159158
void folioq_unmark2(struct folio_queue *folioq, unsigned int slot);
160-
void folioq_unmark3(struct folio_queue *folioq, unsigned int slot);
161159

162160
And the marks can be queried by::
163161

164162
bool folioq_is_marked(const struct folio_queue *folioq, unsigned int slot);
165163
bool folioq_is_marked2(const struct folio_queue *folioq, unsigned int slot);
166-
bool folioq_is_marked3(const struct folio_queue *folioq, unsigned int slot);
167164

168165
The marks can be used for any purpose and are not interpreted by this API.
169166

Documentation/filesystems/netfs_library.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,6 @@ handle falling back from one source type to another. The members are:
712712
at a boundary with the filesystem structure (e.g. at the end of a Ceph
713713
object). It tells netfslib not to retile subrequests across it.
714714

715-
* ``NETFS_SREQ_SEEK_DATA_READ``
716-
717-
This is a hint from netfslib to the cache that it might want to try
718-
skipping ahead to the next data (ie. using SEEK_DATA).
719-
720715
* ``error``
721716

722717
This is for the filesystem to store result of the subrequest. It should be

fs/9p/vfs_addr.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static void v9fs_issue_write(struct netfs_io_subrequest *subreq)
5959
len = p9_client_write(fid, subreq->start, &subreq->io_iter, &err);
6060
if (len > 0)
6161
__set_bit(NETFS_SREQ_MADE_PROGRESS, &subreq->flags);
62-
netfs_write_subrequest_terminated(subreq, len ?: err, false);
62+
netfs_write_subrequest_terminated(subreq, len ?: err);
6363
}
6464

6565
/**
@@ -77,7 +77,8 @@ static void v9fs_issue_read(struct netfs_io_subrequest *subreq)
7777

7878
/* if we just extended the file size, any portion not in
7979
* cache won't be on server and is zeroes */
80-
if (subreq->rreq->origin != NETFS_DIO_READ)
80+
if (subreq->rreq->origin != NETFS_UNBUFFERED_READ &&
81+
subreq->rreq->origin != NETFS_DIO_READ)
8182
__set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags);
8283
if (pos + total >= i_size_read(rreq->inode))
8384
__set_bit(NETFS_SREQ_HIT_EOF, &subreq->flags);

fs/afs/write.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,17 @@ static void afs_issue_write_worker(struct work_struct *work)
120120

121121
#if 0 // Error injection
122122
if (subreq->debug_index == 3)
123-
return netfs_write_subrequest_terminated(subreq, -ENOANO, false);
123+
return netfs_write_subrequest_terminated(subreq, -ENOANO);
124124

125125
if (!subreq->retry_count) {
126126
set_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags);
127-
return netfs_write_subrequest_terminated(subreq, -EAGAIN, false);
127+
return netfs_write_subrequest_terminated(subreq, -EAGAIN);
128128
}
129129
#endif
130130

131131
op = afs_alloc_operation(wreq->netfs_priv, vnode->volume);
132132
if (IS_ERR(op))
133-
return netfs_write_subrequest_terminated(subreq, -EAGAIN, false);
133+
return netfs_write_subrequest_terminated(subreq, -EAGAIN);
134134

135135
afs_op_set_vnode(op, 0, vnode);
136136
op->file[0].dv_delta = 1;
@@ -166,7 +166,7 @@ static void afs_issue_write_worker(struct work_struct *work)
166166
break;
167167
}
168168

169-
netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len, false);
169+
netfs_write_subrequest_terminated(subreq, ret < 0 ? ret : subreq->len);
170170
}
171171

172172
void afs_issue_write(struct netfs_io_subrequest *subreq)
@@ -202,6 +202,7 @@ void afs_retry_request(struct netfs_io_request *wreq, struct netfs_io_stream *st
202202
case NETFS_READ_GAPS:
203203
case NETFS_READ_SINGLE:
204204
case NETFS_READ_FOR_WRITE:
205+
case NETFS_UNBUFFERED_READ:
205206
case NETFS_DIO_READ:
206207
return;
207208
default:

fs/cachefiles/io.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ static void cachefiles_read_complete(struct kiocb *iocb, long ret)
6363
ret = -ESTALE;
6464
}
6565

66-
ki->term_func(ki->term_func_priv, ret, ki->was_async);
66+
ki->term_func(ki->term_func_priv, ret);
6767
}
6868

6969
cachefiles_put_kiocb(ki);
@@ -188,7 +188,7 @@ static int cachefiles_read(struct netfs_cache_resources *cres,
188188

189189
presubmission_error:
190190
if (term_func)
191-
term_func(term_func_priv, ret < 0 ? ret : skipped, false);
191+
term_func(term_func_priv, ret < 0 ? ret : skipped);
192192
return ret;
193193
}
194194

@@ -271,7 +271,7 @@ static void cachefiles_write_complete(struct kiocb *iocb, long ret)
271271
atomic_long_sub(ki->b_writing, &object->volume->cache->b_writing);
272272
set_bit(FSCACHE_COOKIE_HAVE_DATA, &object->cookie->flags);
273273
if (ki->term_func)
274-
ki->term_func(ki->term_func_priv, ret, ki->was_async);
274+
ki->term_func(ki->term_func_priv, ret);
275275
cachefiles_put_kiocb(ki);
276276
}
277277

@@ -301,7 +301,7 @@ int __cachefiles_write(struct cachefiles_object *object,
301301
ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL);
302302
if (!ki) {
303303
if (term_func)
304-
term_func(term_func_priv, -ENOMEM, false);
304+
term_func(term_func_priv, -ENOMEM);
305305
return -ENOMEM;
306306
}
307307

@@ -366,7 +366,7 @@ static int cachefiles_write(struct netfs_cache_resources *cres,
366366
{
367367
if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) {
368368
if (term_func)
369-
term_func(term_func_priv, -ENOBUFS, false);
369+
term_func(term_func_priv, -ENOBUFS);
370370
trace_netfs_sreq(term_func_priv, netfs_sreq_trace_cache_nowrite);
371371
return -ENOBUFS;
372372
}
@@ -665,7 +665,7 @@ static void cachefiles_issue_write(struct netfs_io_subrequest *subreq)
665665
pre = CACHEFILES_DIO_BLOCK_SIZE - off;
666666
if (pre >= len) {
667667
fscache_count_dio_misfit();
668-
netfs_write_subrequest_terminated(subreq, len, false);
668+
netfs_write_subrequest_terminated(subreq, len);
669669
return;
670670
}
671671
subreq->transferred += pre;
@@ -691,7 +691,7 @@ static void cachefiles_issue_write(struct netfs_io_subrequest *subreq)
691691
len -= post;
692692
if (len == 0) {
693693
fscache_count_dio_misfit();
694-
netfs_write_subrequest_terminated(subreq, post, false);
694+
netfs_write_subrequest_terminated(subreq, post);
695695
return;
696696
}
697697
iov_iter_truncate(&subreq->io_iter, len);
@@ -703,7 +703,7 @@ static void cachefiles_issue_write(struct netfs_io_subrequest *subreq)
703703
&start, &len, len, true);
704704
cachefiles_end_secure(cache, saved_cred);
705705
if (ret < 0) {
706-
netfs_write_subrequest_terminated(subreq, ret, false);
706+
netfs_write_subrequest_terminated(subreq, ret);
707707
return;
708708
}
709709

fs/ceph/addr.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ static void finish_netfs_read(struct ceph_osd_request *req)
238238
if (sparse && err > 0)
239239
err = ceph_sparse_ext_map_end(op);
240240
if (err < subreq->len &&
241+
subreq->rreq->origin != NETFS_UNBUFFERED_READ &&
241242
subreq->rreq->origin != NETFS_DIO_READ)
242243
__set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags);
243244
if (IS_ENCRYPTED(inode) && err > 0) {
@@ -281,7 +282,8 @@ static bool ceph_netfs_issue_op_inline(struct netfs_io_subrequest *subreq)
281282
size_t len;
282283
int mode;
283284

284-
if (rreq->origin != NETFS_DIO_READ)
285+
if (rreq->origin != NETFS_UNBUFFERED_READ &&
286+
rreq->origin != NETFS_DIO_READ)
285287
__set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags);
286288
__clear_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags);
287289

@@ -539,7 +541,7 @@ static void ceph_set_page_fscache(struct page *page)
539541
folio_start_private_2(page_folio(page)); /* [DEPRECATED] */
540542
}
541543

542-
static void ceph_fscache_write_terminated(void *priv, ssize_t error, bool was_async)
544+
static void ceph_fscache_write_terminated(void *priv, ssize_t error)
543545
{
544546
struct inode *inode = priv;
545547

fs/erofs/fscache.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ static void erofs_fscache_req_io_put(struct erofs_fscache_io *io)
102102
erofs_fscache_req_put(req);
103103
}
104104

105-
static void erofs_fscache_req_end_io(void *priv,
106-
ssize_t transferred_or_error, bool was_async)
105+
static void erofs_fscache_req_end_io(void *priv, ssize_t transferred_or_error)
107106
{
108107
struct erofs_fscache_io *io = priv;
109108
struct erofs_fscache_rq *req = io->private;
@@ -180,8 +179,7 @@ struct erofs_fscache_bio {
180179
struct bio_vec bvecs[BIO_MAX_VECS];
181180
};
182181

183-
static void erofs_fscache_bio_endio(void *priv,
184-
ssize_t transferred_or_error, bool was_async)
182+
static void erofs_fscache_bio_endio(void *priv, ssize_t transferred_or_error)
185183
{
186184
struct erofs_fscache_bio *io = priv;
187185

fs/netfs/buffered_read.c

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,16 @@ static int netfs_begin_cache_read(struct netfs_io_request *rreq, struct netfs_in
7878
* [!] NOTE: This must be run in the same thread as ->issue_read() was called
7979
* in as we access the readahead_control struct.
8080
*/
81-
static ssize_t netfs_prepare_read_iterator(struct netfs_io_subrequest *subreq)
81+
static ssize_t netfs_prepare_read_iterator(struct netfs_io_subrequest *subreq,
82+
struct readahead_control *ractl)
8283
{
8384
struct netfs_io_request *rreq = subreq->rreq;
8485
size_t rsize = subreq->len;
8586

8687
if (subreq->source == NETFS_DOWNLOAD_FROM_SERVER)
8788
rsize = umin(rsize, rreq->io_streams[0].sreq_max_len);
8889

89-
if (rreq->ractl) {
90+
if (ractl) {
9091
/* If we don't have sufficient folios in the rolling buffer,
9192
* extract a folioq's worth from the readahead region at a time
9293
* into the buffer. Note that this acquires a ref on each page
@@ -99,7 +100,7 @@ static ssize_t netfs_prepare_read_iterator(struct netfs_io_subrequest *subreq)
99100
while (rreq->submitted < subreq->start + rsize) {
100101
ssize_t added;
101102

102-
added = rolling_buffer_load_from_ra(&rreq->buffer, rreq->ractl,
103+
added = rolling_buffer_load_from_ra(&rreq->buffer, ractl,
103104
&put_batch);
104105
if (added < 0)
105106
return added;
@@ -211,7 +212,8 @@ static void netfs_issue_read(struct netfs_io_request *rreq,
211212
* slicing up the region to be read according to available cache blocks and
212213
* network rsize.
213214
*/
214-
static void netfs_read_to_pagecache(struct netfs_io_request *rreq)
215+
static void netfs_read_to_pagecache(struct netfs_io_request *rreq,
216+
struct readahead_control *ractl)
215217
{
216218
struct netfs_inode *ictx = netfs_inode(rreq->inode);
217219
unsigned long long start = rreq->start;
@@ -262,9 +264,9 @@ static void netfs_read_to_pagecache(struct netfs_io_request *rreq)
262264
if (ret < 0) {
263265
subreq->error = ret;
264266
/* Not queued - release both refs. */
265-
netfs_put_subrequest(subreq, false,
267+
netfs_put_subrequest(subreq,
266268
netfs_sreq_trace_put_cancel);
267-
netfs_put_subrequest(subreq, false,
269+
netfs_put_subrequest(subreq,
268270
netfs_sreq_trace_put_cancel);
269271
break;
270272
}
@@ -291,14 +293,14 @@ static void netfs_read_to_pagecache(struct netfs_io_request *rreq)
291293
break;
292294

293295
issue:
294-
slice = netfs_prepare_read_iterator(subreq);
296+
slice = netfs_prepare_read_iterator(subreq, ractl);
295297
if (slice < 0) {
296298
ret = slice;
297299
subreq->error = ret;
298300
trace_netfs_sreq(subreq, netfs_sreq_trace_cancel);
299301
/* Not queued - release both refs. */
300-
netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_cancel);
301-
netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_cancel);
302+
netfs_put_subrequest(subreq, netfs_sreq_trace_put_cancel);
303+
netfs_put_subrequest(subreq, netfs_sreq_trace_put_cancel);
302304
break;
303305
}
304306
size -= slice;
@@ -312,7 +314,7 @@ static void netfs_read_to_pagecache(struct netfs_io_request *rreq)
312314
if (unlikely(size > 0)) {
313315
smp_wmb(); /* Write lists before ALL_QUEUED. */
314316
set_bit(NETFS_RREQ_ALL_QUEUED, &rreq->flags);
315-
netfs_wake_read_collector(rreq);
317+
netfs_wake_collector(rreq);
316318
}
317319

318320
/* Defer error return as we may need to wait for outstanding I/O. */
@@ -359,18 +361,15 @@ void netfs_readahead(struct readahead_control *ractl)
359361

360362
netfs_rreq_expand(rreq, ractl);
361363

362-
rreq->ractl = ractl;
363364
rreq->submitted = rreq->start;
364365
if (rolling_buffer_init(&rreq->buffer, rreq->debug_id, ITER_DEST) < 0)
365366
goto cleanup_free;
366-
netfs_read_to_pagecache(rreq);
367+
netfs_read_to_pagecache(rreq, ractl);
367368

368-
netfs_put_request(rreq, true, netfs_rreq_trace_put_return);
369-
return;
369+
return netfs_put_request(rreq, netfs_rreq_trace_put_return);
370370

371371
cleanup_free:
372-
netfs_put_request(rreq, false, netfs_rreq_trace_put_failed);
373-
return;
372+
return netfs_put_request(rreq, netfs_rreq_trace_put_failed);
374373
}
375374
EXPORT_SYMBOL(netfs_readahead);
376375

@@ -389,7 +388,6 @@ static int netfs_create_singular_buffer(struct netfs_io_request *rreq, struct fo
389388
if (added < 0)
390389
return added;
391390
rreq->submitted = rreq->start + added;
392-
rreq->ractl = (struct readahead_control *)1UL;
393391
return 0;
394392
}
395393

@@ -459,7 +457,7 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
459457
iov_iter_bvec(&rreq->buffer.iter, ITER_DEST, bvec, i, rreq->len);
460458
rreq->submitted = rreq->start + flen;
461459

462-
netfs_read_to_pagecache(rreq);
460+
netfs_read_to_pagecache(rreq, NULL);
463461

464462
if (sink)
465463
folio_put(sink);
@@ -470,11 +468,11 @@ static int netfs_read_gaps(struct file *file, struct folio *folio)
470468
folio_mark_uptodate(folio);
471469
}
472470
folio_unlock(folio);
473-
netfs_put_request(rreq, false, netfs_rreq_trace_put_return);
471+
netfs_put_request(rreq, netfs_rreq_trace_put_return);
474472
return ret < 0 ? ret : 0;
475473

476474
discard:
477-
netfs_put_request(rreq, false, netfs_rreq_trace_put_discard);
475+
netfs_put_request(rreq, netfs_rreq_trace_put_discard);
478476
alloc_error:
479477
folio_unlock(folio);
480478
return ret;
@@ -528,13 +526,13 @@ int netfs_read_folio(struct file *file, struct folio *folio)
528526
if (ret < 0)
529527
goto discard;
530528

531-
netfs_read_to_pagecache(rreq);
529+
netfs_read_to_pagecache(rreq, NULL);
532530
ret = netfs_wait_for_read(rreq);
533-
netfs_put_request(rreq, false, netfs_rreq_trace_put_return);
531+
netfs_put_request(rreq, netfs_rreq_trace_put_return);
534532
return ret < 0 ? ret : 0;
535533

536534
discard:
537-
netfs_put_request(rreq, false, netfs_rreq_trace_put_discard);
535+
netfs_put_request(rreq, netfs_rreq_trace_put_discard);
538536
alloc_error:
539537
folio_unlock(folio);
540538
return ret;
@@ -685,11 +683,11 @@ int netfs_write_begin(struct netfs_inode *ctx,
685683
if (ret < 0)
686684
goto error_put;
687685

688-
netfs_read_to_pagecache(rreq);
686+
netfs_read_to_pagecache(rreq, NULL);
689687
ret = netfs_wait_for_read(rreq);
690688
if (ret < 0)
691689
goto error;
692-
netfs_put_request(rreq, false, netfs_rreq_trace_put_return);
690+
netfs_put_request(rreq, netfs_rreq_trace_put_return);
693691

694692
have_folio:
695693
ret = folio_wait_private_2_killable(folio);
@@ -701,7 +699,7 @@ int netfs_write_begin(struct netfs_inode *ctx,
701699
return 0;
702700

703701
error_put:
704-
netfs_put_request(rreq, false, netfs_rreq_trace_put_failed);
702+
netfs_put_request(rreq, netfs_rreq_trace_put_failed);
705703
error:
706704
if (folio) {
707705
folio_unlock(folio);
@@ -750,13 +748,13 @@ int netfs_prefetch_for_write(struct file *file, struct folio *folio,
750748
if (ret < 0)
751749
goto error_put;
752750

753-
netfs_read_to_pagecache(rreq);
751+
netfs_read_to_pagecache(rreq, NULL);
754752
ret = netfs_wait_for_read(rreq);
755-
netfs_put_request(rreq, false, netfs_rreq_trace_put_return);
753+
netfs_put_request(rreq, netfs_rreq_trace_put_return);
756754
return ret < 0 ? ret : 0;
757755

758756
error_put:
759-
netfs_put_request(rreq, false, netfs_rreq_trace_put_discard);
757+
netfs_put_request(rreq, netfs_rreq_trace_put_discard);
760758
error:
761759
_leave(" = %d", ret);
762760
return ret;

0 commit comments

Comments
 (0)