Skip to content

Commit e2bc9f6

Browse files
committed
Merge branch 'cifs-netfs' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
Pull cifs netfs updates from David Howells: This ports cifs over to use the netfs library. * 'cifs-netfs' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: cifs: Enable large folio support cifs: Remove some code that's no longer used, part 3 cifs: Remove some code that's no longer used, part 2 cifs: Remove some code that's no longer used, part 1 cifs: Cut over to using netfslib cifs: Implement netfslib hooks cifs: Make add_credits_and_wake_if() clear deducted credits cifs: Add mempools for cifs_io_request and cifs_io_subrequest structs cifs: Set zero_point in the copy_file_range() and remap_file_range() cifs: Move cifs_loose_read_iter() and cifs_file_write_iter() to file.c cifs: Replace the writedata replay bool with a netfs sreq flag cifs: Make wait_mtu_credits take size_t args cifs: Use more fields from netfs_io_subrequest cifs: Replace cifs_writedata with a wrapper around netfs_io_subrequest cifs: Replace cifs_readdata with a wrapper around netfs_io_subrequest cifs: Use alternative invalidation to using launder_folio Signed-off-by: Christian Brauner <brauner@kernel.org>
2 parents 3931e67 + 7c1ac89 commit e2bc9f6

File tree

19 files changed

+886
-2930
lines changed

19 files changed

+886
-2930
lines changed

fs/netfs/buffered_write.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,9 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
405405
} while (iov_iter_count(iter));
406406

407407
out:
408+
if (likely(written) && ctx->ops->post_modify)
409+
ctx->ops->post_modify(inode);
410+
408411
if (unlikely(wreq)) {
409412
ret2 = netfs_end_writethrough(wreq, &wbc, writethrough);
410413
wbc_detach_inode(&wbc);
@@ -521,6 +524,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr
521524
struct folio *folio = page_folio(vmf->page);
522525
struct file *file = vmf->vma->vm_file;
523526
struct inode *inode = file_inode(file);
527+
struct netfs_inode *ictx = netfs_inode(inode);
524528
vm_fault_t ret = VM_FAULT_RETRY;
525529
int err;
526530

@@ -567,6 +571,8 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr
567571
trace_netfs_folio(folio, netfs_folio_trace_mkwrite);
568572
netfs_set_group(folio, netfs_group);
569573
file_update_time(file);
574+
if (ictx->ops->post_modify)
575+
ictx->ops->post_modify(inode);
570576
ret = VM_FAULT_LOCKED;
571577
out:
572578
sb_end_pagefault(inode->i_sb);

fs/netfs/io.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,13 @@ static void netfs_rreq_assess_dio(struct netfs_io_request *rreq)
213213
unsigned int i;
214214
size_t transferred = 0;
215215

216-
for (i = 0; i < rreq->direct_bv_count; i++)
216+
for (i = 0; i < rreq->direct_bv_count; i++) {
217217
flush_dcache_page(rreq->direct_bv[i].bv_page);
218+
// TODO: cifs marks pages in the destination buffer
219+
// dirty under some circumstances after a read. Do we
220+
// need to do that too?
221+
set_page_dirty(rreq->direct_bv[i].bv_page);
222+
}
218223

219224
list_for_each_entry(subreq, &rreq->subrequests, rreq_link) {
220225
if (subreq->error || subreq->transferred == 0)

fs/smb/client/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
config CIFS
33
tristate "SMB3 and CIFS support (advanced network filesystem)"
44
depends on INET
5+
select NETFS_SUPPORT
56
select NLS
67
select NLS_UCS2_UTILS
78
select CRYPTO

fs/smb/client/cifsfs.c

Lines changed: 64 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,13 @@ static struct kmem_cache *cifs_inode_cachep;
371371
static struct kmem_cache *cifs_req_cachep;
372372
static struct kmem_cache *cifs_mid_cachep;
373373
static struct kmem_cache *cifs_sm_req_cachep;
374+
static struct kmem_cache *cifs_io_request_cachep;
375+
static struct kmem_cache *cifs_io_subrequest_cachep;
374376
mempool_t *cifs_sm_req_poolp;
375377
mempool_t *cifs_req_poolp;
376378
mempool_t *cifs_mid_poolp;
379+
mempool_t cifs_io_request_pool;
380+
mempool_t cifs_io_subrequest_pool;
377381

378382
static struct inode *
379383
cifs_alloc_inode(struct super_block *sb)
@@ -986,61 +990,6 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
986990
return root;
987991
}
988992

989-
990-
static ssize_t
991-
cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
992-
{
993-
ssize_t rc;
994-
struct inode *inode = file_inode(iocb->ki_filp);
995-
996-
if (iocb->ki_flags & IOCB_DIRECT)
997-
return cifs_user_readv(iocb, iter);
998-
999-
rc = cifs_revalidate_mapping(inode);
1000-
if (rc)
1001-
return rc;
1002-
1003-
return generic_file_read_iter(iocb, iter);
1004-
}
1005-
1006-
static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1007-
{
1008-
struct inode *inode = file_inode(iocb->ki_filp);
1009-
struct cifsInodeInfo *cinode = CIFS_I(inode);
1010-
ssize_t written;
1011-
int rc;
1012-
1013-
if (iocb->ki_filp->f_flags & O_DIRECT) {
1014-
written = cifs_user_writev(iocb, from);
1015-
if (written > 0 && CIFS_CACHE_READ(cinode)) {
1016-
cifs_zap_mapping(inode);
1017-
cifs_dbg(FYI,
1018-
"Set no oplock for inode=%p after a write operation\n",
1019-
inode);
1020-
cinode->oplock = 0;
1021-
}
1022-
return written;
1023-
}
1024-
1025-
written = cifs_get_writer(cinode);
1026-
if (written)
1027-
return written;
1028-
1029-
written = generic_file_write_iter(iocb, from);
1030-
1031-
if (CIFS_CACHE_WRITE(CIFS_I(inode)))
1032-
goto out;
1033-
1034-
rc = filemap_fdatawrite(inode->i_mapping);
1035-
if (rc)
1036-
cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
1037-
rc, inode);
1038-
1039-
out:
1040-
cifs_put_writer(cinode);
1041-
return written;
1042-
}
1043-
1044993
static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
1045994
{
1046995
struct cifsFileInfo *cfile = file->private_data;
@@ -1342,6 +1291,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
13421291
rc = cifs_flush_folio(target_inode, destend, &fstart, &fend, false);
13431292
if (rc)
13441293
goto unlock;
1294+
if (fend > target_cifsi->netfs.zero_point)
1295+
target_cifsi->netfs.zero_point = fend + 1;
13451296

13461297
/* Discard all the folios that overlap the destination region. */
13471298
cifs_dbg(FYI, "about to discard pages %llx-%llx\n", fstart, fend);
@@ -1360,6 +1311,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
13601311
fscache_resize_cookie(cifs_inode_cookie(target_inode),
13611312
new_size);
13621313
}
1314+
if (rc == 0 && new_size > target_cifsi->netfs.zero_point)
1315+
target_cifsi->netfs.zero_point = new_size;
13631316
}
13641317

13651318
/* force revalidate of size and timestamps of target file now
@@ -1451,6 +1404,8 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
14511404
rc = cifs_flush_folio(target_inode, destend, &fstart, &fend, false);
14521405
if (rc)
14531406
goto unlock;
1407+
if (fend > target_cifsi->netfs.zero_point)
1408+
target_cifsi->netfs.zero_point = fend + 1;
14541409

14551410
/* Discard all the folios that overlap the destination region. */
14561411
truncate_inode_pages_range(&target_inode->i_data, fstart, fend);
@@ -1567,8 +1522,8 @@ const struct file_operations cifs_file_strict_ops = {
15671522
};
15681523

15691524
const struct file_operations cifs_file_direct_ops = {
1570-
.read_iter = cifs_direct_readv,
1571-
.write_iter = cifs_direct_writev,
1525+
.read_iter = netfs_unbuffered_read_iter,
1526+
.write_iter = netfs_file_write_iter,
15721527
.open = cifs_open,
15731528
.release = cifs_close,
15741529
.lock = cifs_lock,
@@ -1623,8 +1578,8 @@ const struct file_operations cifs_file_strict_nobrl_ops = {
16231578
};
16241579

16251580
const struct file_operations cifs_file_direct_nobrl_ops = {
1626-
.read_iter = cifs_direct_readv,
1627-
.write_iter = cifs_direct_writev,
1581+
.read_iter = netfs_unbuffered_read_iter,
1582+
.write_iter = netfs_file_write_iter,
16281583
.open = cifs_open,
16291584
.release = cifs_close,
16301585
.fsync = cifs_fsync,
@@ -1799,6 +1754,48 @@ static void destroy_mids(void)
17991754
kmem_cache_destroy(cifs_mid_cachep);
18001755
}
18011756

1757+
static int cifs_init_netfs(void)
1758+
{
1759+
cifs_io_request_cachep =
1760+
kmem_cache_create("cifs_io_request",
1761+
sizeof(struct cifs_io_request), 0,
1762+
SLAB_HWCACHE_ALIGN, NULL);
1763+
if (!cifs_io_request_cachep)
1764+
goto nomem_req;
1765+
1766+
if (mempool_init_slab_pool(&cifs_io_request_pool, 100, cifs_io_request_cachep) < 0)
1767+
goto nomem_reqpool;
1768+
1769+
cifs_io_subrequest_cachep =
1770+
kmem_cache_create("cifs_io_subrequest",
1771+
sizeof(struct cifs_io_subrequest), 0,
1772+
SLAB_HWCACHE_ALIGN, NULL);
1773+
if (!cifs_io_subrequest_cachep)
1774+
goto nomem_subreq;
1775+
1776+
if (mempool_init_slab_pool(&cifs_io_subrequest_pool, 100, cifs_io_subrequest_cachep) < 0)
1777+
goto nomem_subreqpool;
1778+
1779+
return 0;
1780+
1781+
nomem_subreqpool:
1782+
kmem_cache_destroy(cifs_io_subrequest_cachep);
1783+
nomem_subreq:
1784+
mempool_destroy(&cifs_io_request_pool);
1785+
nomem_reqpool:
1786+
kmem_cache_destroy(cifs_io_request_cachep);
1787+
nomem_req:
1788+
return -ENOMEM;
1789+
}
1790+
1791+
static void cifs_destroy_netfs(void)
1792+
{
1793+
mempool_destroy(&cifs_io_subrequest_pool);
1794+
kmem_cache_destroy(cifs_io_subrequest_cachep);
1795+
mempool_destroy(&cifs_io_request_pool);
1796+
kmem_cache_destroy(cifs_io_request_cachep);
1797+
}
1798+
18021799
static int __init
18031800
init_cifs(void)
18041801
{
@@ -1903,10 +1900,14 @@ init_cifs(void)
19031900
if (rc)
19041901
goto out_destroy_deferredclose_wq;
19051902

1906-
rc = init_mids();
1903+
rc = cifs_init_netfs();
19071904
if (rc)
19081905
goto out_destroy_inodecache;
19091906

1907+
rc = init_mids();
1908+
if (rc)
1909+
goto out_destroy_netfs;
1910+
19101911
rc = cifs_init_request_bufs();
19111912
if (rc)
19121913
goto out_destroy_mids;
@@ -1961,6 +1962,8 @@ init_cifs(void)
19611962
cifs_destroy_request_bufs();
19621963
out_destroy_mids:
19631964
destroy_mids();
1965+
out_destroy_netfs:
1966+
cifs_destroy_netfs();
19641967
out_destroy_inodecache:
19651968
cifs_destroy_inodecache();
19661969
out_destroy_deferredclose_wq:
@@ -1999,6 +2002,7 @@ exit_cifs(void)
19992002
#endif
20002003
cifs_destroy_request_bufs();
20012004
destroy_mids();
2005+
cifs_destroy_netfs();
20022006
cifs_destroy_inodecache();
20032007
destroy_workqueue(deferredclose_wq);
20042008
destroy_workqueue(cifsoplockd_wq);

fs/smb/client/cifsfs.h

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ extern int cifs_revalidate_file_attr(struct file *filp);
6969
extern int cifs_revalidate_dentry_attr(struct dentry *);
7070
extern int cifs_revalidate_file(struct file *filp);
7171
extern int cifs_revalidate_dentry(struct dentry *);
72-
extern int cifs_invalidate_mapping(struct inode *inode);
7372
extern int cifs_revalidate_mapping(struct inode *inode);
7473
extern int cifs_zap_mapping(struct inode *inode);
7574
extern int cifs_getattr(struct mnt_idmap *, const struct path *,
@@ -85,6 +84,7 @@ extern const struct inode_operations cifs_namespace_inode_operations;
8584

8685

8786
/* Functions related to files and directories */
87+
extern const struct netfs_request_ops cifs_req_ops;
8888
extern const struct file_operations cifs_file_ops;
8989
extern const struct file_operations cifs_file_direct_ops; /* if directio mnt */
9090
extern const struct file_operations cifs_file_strict_ops; /* if strictio mnt */
@@ -94,12 +94,10 @@ extern const struct file_operations cifs_file_strict_nobrl_ops;
9494
extern int cifs_open(struct inode *inode, struct file *file);
9595
extern int cifs_close(struct inode *inode, struct file *file);
9696
extern int cifs_closedir(struct inode *inode, struct file *file);
97-
extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to);
98-
extern ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to);
9997
extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to);
100-
extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from);
101-
extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from);
10298
extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from);
99+
ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from);
100+
ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter);
103101
extern int cifs_flock(struct file *pfile, int cmd, struct file_lock *plock);
104102
extern int cifs_lock(struct file *, int, struct file_lock *);
105103
extern int cifs_fsync(struct file *, loff_t, loff_t, int);
@@ -110,9 +108,6 @@ extern int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma);
110108
extern const struct file_operations cifs_dir_ops;
111109
extern int cifs_dir_open(struct inode *inode, struct file *file);
112110
extern int cifs_readdir(struct file *file, struct dir_context *ctx);
113-
extern void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len);
114-
extern void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len);
115-
extern void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len);
116111

117112
/* Functions related to dir entries */
118113
extern const struct dentry_operations cifs_dentry_ops;

0 commit comments

Comments
 (0)