@@ -371,9 +371,13 @@ static struct kmem_cache *cifs_inode_cachep;
371
371
static struct kmem_cache * cifs_req_cachep ;
372
372
static struct kmem_cache * cifs_mid_cachep ;
373
373
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 ;
374
376
mempool_t * cifs_sm_req_poolp ;
375
377
mempool_t * cifs_req_poolp ;
376
378
mempool_t * cifs_mid_poolp ;
379
+ mempool_t cifs_io_request_pool ;
380
+ mempool_t cifs_io_subrequest_pool ;
377
381
378
382
static struct inode *
379
383
cifs_alloc_inode (struct super_block * sb )
@@ -986,61 +990,6 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
986
990
return root ;
987
991
}
988
992
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
-
1044
993
static loff_t cifs_llseek (struct file * file , loff_t offset , int whence )
1045
994
{
1046
995
struct cifsFileInfo * cfile = file -> private_data ;
@@ -1342,6 +1291,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
1342
1291
rc = cifs_flush_folio (target_inode , destend , & fstart , & fend , false);
1343
1292
if (rc )
1344
1293
goto unlock ;
1294
+ if (fend > target_cifsi -> netfs .zero_point )
1295
+ target_cifsi -> netfs .zero_point = fend + 1 ;
1345
1296
1346
1297
/* Discard all the folios that overlap the destination region. */
1347
1298
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,
1360
1311
fscache_resize_cookie (cifs_inode_cookie (target_inode ),
1361
1312
new_size );
1362
1313
}
1314
+ if (rc == 0 && new_size > target_cifsi -> netfs .zero_point )
1315
+ target_cifsi -> netfs .zero_point = new_size ;
1363
1316
}
1364
1317
1365
1318
/* force revalidate of size and timestamps of target file now
@@ -1451,6 +1404,8 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
1451
1404
rc = cifs_flush_folio (target_inode , destend , & fstart , & fend , false);
1452
1405
if (rc )
1453
1406
goto unlock ;
1407
+ if (fend > target_cifsi -> netfs .zero_point )
1408
+ target_cifsi -> netfs .zero_point = fend + 1 ;
1454
1409
1455
1410
/* Discard all the folios that overlap the destination region. */
1456
1411
truncate_inode_pages_range (& target_inode -> i_data , fstart , fend );
@@ -1567,8 +1522,8 @@ const struct file_operations cifs_file_strict_ops = {
1567
1522
};
1568
1523
1569
1524
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 ,
1572
1527
.open = cifs_open ,
1573
1528
.release = cifs_close ,
1574
1529
.lock = cifs_lock ,
@@ -1623,8 +1578,8 @@ const struct file_operations cifs_file_strict_nobrl_ops = {
1623
1578
};
1624
1579
1625
1580
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 ,
1628
1583
.open = cifs_open ,
1629
1584
.release = cifs_close ,
1630
1585
.fsync = cifs_fsync ,
@@ -1799,6 +1754,48 @@ static void destroy_mids(void)
1799
1754
kmem_cache_destroy (cifs_mid_cachep );
1800
1755
}
1801
1756
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
+
1802
1799
static int __init
1803
1800
init_cifs (void )
1804
1801
{
@@ -1903,10 +1900,14 @@ init_cifs(void)
1903
1900
if (rc )
1904
1901
goto out_destroy_deferredclose_wq ;
1905
1902
1906
- rc = init_mids ();
1903
+ rc = cifs_init_netfs ();
1907
1904
if (rc )
1908
1905
goto out_destroy_inodecache ;
1909
1906
1907
+ rc = init_mids ();
1908
+ if (rc )
1909
+ goto out_destroy_netfs ;
1910
+
1910
1911
rc = cifs_init_request_bufs ();
1911
1912
if (rc )
1912
1913
goto out_destroy_mids ;
@@ -1961,6 +1962,8 @@ init_cifs(void)
1961
1962
cifs_destroy_request_bufs ();
1962
1963
out_destroy_mids :
1963
1964
destroy_mids ();
1965
+ out_destroy_netfs :
1966
+ cifs_destroy_netfs ();
1964
1967
out_destroy_inodecache :
1965
1968
cifs_destroy_inodecache ();
1966
1969
out_destroy_deferredclose_wq :
@@ -1999,6 +2002,7 @@ exit_cifs(void)
1999
2002
#endif
2000
2003
cifs_destroy_request_bufs ();
2001
2004
destroy_mids ();
2005
+ cifs_destroy_netfs ();
2002
2006
cifs_destroy_inodecache ();
2003
2007
destroy_workqueue (deferredclose_wq );
2004
2008
destroy_workqueue (cifsoplockd_wq );
0 commit comments