@@ -371,9 +371,13 @@ static struct kmem_cache *cifs_inode_cachep;
371371static struct kmem_cache * cifs_req_cachep ;
372372static struct kmem_cache * cifs_mid_cachep ;
373373static 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 ;
374376mempool_t * cifs_sm_req_poolp ;
375377mempool_t * cifs_req_poolp ;
376378mempool_t * cifs_mid_poolp ;
379+ mempool_t cifs_io_request_pool ;
380+ mempool_t cifs_io_subrequest_pool ;
377381
378382static struct inode *
379383cifs_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-
1044993static 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
15691524const 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
16251580const 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+
18021799static int __init
18031800init_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 ();
19621963out_destroy_mids :
19631964 destroy_mids ();
1965+ out_destroy_netfs :
1966+ cifs_destroy_netfs ();
19641967out_destroy_inodecache :
19651968 cifs_destroy_inodecache ();
19661969out_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 );
0 commit comments