Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit e4c07ec

Browse files
committed
Merge tag 'vfs-6.10-rc2.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull vfs fixes from Christian Brauner: - Fix io_uring based write-through after converting cifs to use the netfs library - Fix aio error handling when doing write-through via netfs library - Fix performance regression in iomap when used with non-large folio mappings - Fix signalfd error code - Remove obsolete comment in signalfd code - Fix async request indication in netfs_perform_write() by raising BDP_ASYNC when IOCB_NOWAIT is set - Yield swap device immediately to prevent spurious EBUSY errors - Don't cross a .backup mountpoint from backup volumes in afs to avoid infinite loops - Fix a race between umount and async request completion in 9p after 9p was converted to use the netfs library * tag 'vfs-6.10-rc2.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: netfs, 9p: Fix race between umount and async request completion afs: Don't cross .backup mountpoint from backup volume swap: yield device immediately netfs: Fix setting of BDP_ASYNC from iocb flags signalfd: drop an obsolete comment signalfd: fix error return code iomap: fault in smaller chunks for non-large folio mappings filemap: add helper mapping_max_folio_size() netfs: Fix AIO error handling when doing write-through netfs: Fix io_uring based write-through
2 parents 1613e60 + f89ea63 commit e4c07ec

File tree

14 files changed

+68
-27
lines changed

14 files changed

+68
-27
lines changed

fs/9p/vfs_inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ void v9fs_evict_inode(struct inode *inode)
348348
__le32 __maybe_unused version;
349349

350350
if (!is_bad_inode(inode)) {
351+
netfs_wait_for_outstanding_io(inode);
351352
truncate_inode_pages_final(&inode->i_data);
352353

353354
version = cpu_to_le32(v9inode->qid.version);

fs/afs/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ void afs_evict_inode(struct inode *inode)
648648

649649
ASSERTCMP(inode->i_ino, ==, vnode->fid.vnode);
650650

651+
netfs_wait_for_outstanding_io(inode);
651652
truncate_inode_pages_final(&inode->i_data);
652653

653654
afs_set_cache_aux(vnode, &aux);

fs/afs/mntpt.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ static int afs_mntpt_set_params(struct fs_context *fc, struct dentry *mntpt)
140140
put_page(page);
141141
if (ret < 0)
142142
return ret;
143+
144+
/* Don't cross a backup volume mountpoint from a backup volume */
145+
if (src_as->volume && src_as->volume->type == AFSVL_BACKVOL &&
146+
ctx->type == AFSVL_BACKVOL)
147+
return -ENODEV;
143148
}
144149

145150
return 0;

fs/iomap/buffered-io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,11 +898,11 @@ static bool iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
898898
static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
899899
{
900900
loff_t length = iomap_length(iter);
901-
size_t chunk = PAGE_SIZE << MAX_PAGECACHE_ORDER;
902901
loff_t pos = iter->pos;
903902
ssize_t total_written = 0;
904903
long status = 0;
905904
struct address_space *mapping = iter->inode->i_mapping;
905+
size_t chunk = mapping_max_folio_size(mapping);
906906
unsigned int bdp_flags = (iter->flags & IOMAP_NOWAIT) ? BDP_ASYNC : 0;
907907

908908
do {

fs/netfs/buffered_write.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
181181
struct folio *folio, *writethrough = NULL;
182182
enum netfs_how_to_modify howto;
183183
enum netfs_folio_trace trace;
184-
unsigned int bdp_flags = (iocb->ki_flags & IOCB_SYNC) ? 0: BDP_ASYNC;
184+
unsigned int bdp_flags = (iocb->ki_flags & IOCB_NOWAIT) ? BDP_ASYNC : 0;
185185
ssize_t written = 0, ret, ret2;
186186
loff_t i_size, pos = iocb->ki_pos, from, to;
187187
size_t max_chunk = PAGE_SIZE << MAX_PAGECACHE_ORDER;

fs/netfs/direct_write.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
static void netfs_cleanup_dio_write(struct netfs_io_request *wreq)
1313
{
1414
struct inode *inode = wreq->inode;
15-
unsigned long long end = wreq->start + wreq->len;
15+
unsigned long long end = wreq->start + wreq->transferred;
1616

1717
if (!wreq->error &&
1818
i_size_read(inode) < end) {

fs/netfs/objects.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
7272
}
7373
}
7474

75+
atomic_inc(&ctx->io_count);
7576
trace_netfs_rreq_ref(rreq->debug_id, 1, netfs_rreq_trace_new);
7677
netfs_proc_add_rreq(rreq);
7778
netfs_stat(&netfs_n_rh_rreq);
@@ -124,6 +125,7 @@ static void netfs_free_request(struct work_struct *work)
124125
{
125126
struct netfs_io_request *rreq =
126127
container_of(work, struct netfs_io_request, work);
128+
struct netfs_inode *ictx = netfs_inode(rreq->inode);
127129
unsigned int i;
128130

129131
trace_netfs_rreq(rreq, netfs_rreq_trace_free);
@@ -142,6 +144,9 @@ static void netfs_free_request(struct work_struct *work)
142144
}
143145
kvfree(rreq->direct_bv);
144146
}
147+
148+
if (atomic_dec_and_test(&ictx->io_count))
149+
wake_up_var(&ictx->io_count);
145150
call_rcu(&rreq->rcu, netfs_free_request_rcu);
146151
}
147152

fs/netfs/write_collect.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ static void netfs_collect_write_results(struct netfs_io_request *wreq)
510510
* stream has a gap that can be jumped.
511511
*/
512512
if (notes & SOME_EMPTY) {
513-
unsigned long long jump_to = wreq->start + wreq->len;
513+
unsigned long long jump_to = wreq->start + READ_ONCE(wreq->submitted);
514514

515515
for (s = 0; s < NR_IO_STREAMS; s++) {
516516
stream = &wreq->io_streams[s];
@@ -690,10 +690,11 @@ void netfs_write_collection_worker(struct work_struct *work)
690690
wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS);
691691

692692
if (wreq->iocb) {
693-
wreq->iocb->ki_pos += wreq->transferred;
693+
size_t written = min(wreq->transferred, wreq->len);
694+
wreq->iocb->ki_pos += written;
694695
if (wreq->iocb->ki_complete)
695696
wreq->iocb->ki_complete(
696-
wreq->iocb, wreq->error ? wreq->error : wreq->transferred);
697+
wreq->iocb, wreq->error ? wreq->error : written);
697698
wreq->iocb = VFS_PTR_POISON;
698699
}
699700

fs/netfs/write_issue.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static void netfs_issue_write(struct netfs_io_request *wreq,
254254
stream->construct = NULL;
255255

256256
if (subreq->start + subreq->len > wreq->start + wreq->submitted)
257-
wreq->len = wreq->submitted = subreq->start + subreq->len - wreq->start;
257+
WRITE_ONCE(wreq->submitted, subreq->start + subreq->len - wreq->start);
258258
netfs_do_issue_write(stream, subreq);
259259
}
260260

@@ -636,7 +636,12 @@ int netfs_end_writethrough(struct netfs_io_request *wreq, struct writeback_contr
636636

637637
mutex_unlock(&ictx->wb_lock);
638638

639-
ret = wreq->error;
639+
if (wreq->iocb) {
640+
ret = -EIOCBQUEUED;
641+
} else {
642+
wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS, TASK_UNINTERRUPTIBLE);
643+
ret = wreq->error;
644+
}
640645
netfs_put_request(wreq, false, netfs_rreq_trace_put_return);
641646
return ret;
642647
}

fs/signalfd.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,10 @@ static int do_signalfd4(int ufd, sigset_t *mask, int flags)
282282
if (IS_ERR(file)) {
283283
put_unused_fd(ufd);
284284
kfree(ctx);
285-
return ufd;
285+
return PTR_ERR(file);
286286
}
287287
file->f_mode |= FMODE_NOWAIT;
288288

289-
/*
290-
* When we call this, the initialization must be complete, since
291-
* anon_inode_getfd() will install the fd.
292-
*/
293289
fd_install(ufd, file);
294290
} else {
295291
struct fd f = fdget(ufd);

0 commit comments

Comments
 (0)