@@ -1549,82 +1549,94 @@ EXPORT_SYMBOL(p9_client_unlinkat);
1549
1549
int
1550
1550
p9_client_read (struct p9_fid * fid , u64 offset , struct iov_iter * to , int * err )
1551
1551
{
1552
- struct p9_client * clnt = fid -> clnt ;
1553
- struct p9_req_t * req ;
1554
1552
int total = 0 ;
1555
1553
* err = 0 ;
1556
1554
1555
+ while (iov_iter_count (to )) {
1556
+ int count ;
1557
+
1558
+ count = p9_client_read_once (fid , offset , to , err );
1559
+ if (!count || * err )
1560
+ break ;
1561
+ offset += count ;
1562
+ total += count ;
1563
+ }
1564
+ return total ;
1565
+ }
1566
+ EXPORT_SYMBOL (p9_client_read );
1567
+
1568
+ int
1569
+ p9_client_read_once (struct p9_fid * fid , u64 offset , struct iov_iter * to ,
1570
+ int * err )
1571
+ {
1572
+ struct p9_client * clnt = fid -> clnt ;
1573
+ struct p9_req_t * req ;
1574
+ int count = iov_iter_count (to );
1575
+ int rsize , non_zc = 0 ;
1576
+ char * dataptr ;
1577
+
1578
+ * err = 0 ;
1557
1579
p9_debug (P9_DEBUG_9P , ">>> TREAD fid %d offset %llu %d\n" ,
1558
1580
fid -> fid , (unsigned long long ) offset , (int )iov_iter_count (to ));
1559
1581
1560
- while (iov_iter_count (to )) {
1561
- int count = iov_iter_count (to );
1562
- int rsize , non_zc = 0 ;
1563
- char * dataptr ;
1582
+ rsize = fid -> iounit ;
1583
+ if (!rsize || rsize > clnt -> msize - P9_IOHDRSZ )
1584
+ rsize = clnt -> msize - P9_IOHDRSZ ;
1564
1585
1565
- rsize = fid -> iounit ;
1566
- if (!rsize || rsize > clnt -> msize - P9_IOHDRSZ )
1567
- rsize = clnt -> msize - P9_IOHDRSZ ;
1586
+ if (count < rsize )
1587
+ rsize = count ;
1568
1588
1569
- if (count < rsize )
1570
- rsize = count ;
1589
+ /* Don't bother zerocopy for small IO (< 1024) */
1590
+ if (clnt -> trans_mod -> zc_request && rsize > 1024 ) {
1591
+ /* response header len is 11
1592
+ * PDU Header(7) + IO Size (4)
1593
+ */
1594
+ req = p9_client_zc_rpc (clnt , P9_TREAD , to , NULL , rsize ,
1595
+ 0 , 11 , "dqd" , fid -> fid ,
1596
+ offset , rsize );
1597
+ } else {
1598
+ non_zc = 1 ;
1599
+ req = p9_client_rpc (clnt , P9_TREAD , "dqd" , fid -> fid , offset ,
1600
+ rsize );
1601
+ }
1602
+ if (IS_ERR (req )) {
1603
+ * err = PTR_ERR (req );
1604
+ return 0 ;
1605
+ }
1571
1606
1572
- /* Don't bother zerocopy for small IO (< 1024) */
1573
- if (clnt -> trans_mod -> zc_request && rsize > 1024 ) {
1574
- /*
1575
- * response header len is 11
1576
- * PDU Header(7) + IO Size (4)
1577
- */
1578
- req = p9_client_zc_rpc (clnt , P9_TREAD , to , NULL , rsize ,
1579
- 0 , 11 , "dqd" , fid -> fid ,
1580
- offset , rsize );
1581
- } else {
1582
- non_zc = 1 ;
1583
- req = p9_client_rpc (clnt , P9_TREAD , "dqd" , fid -> fid , offset ,
1584
- rsize );
1585
- }
1586
- if (IS_ERR (req )) {
1587
- * err = PTR_ERR (req );
1588
- break ;
1589
- }
1607
+ * err = p9pdu_readf (& req -> rc , clnt -> proto_version ,
1608
+ "D" , & count , & dataptr );
1609
+ if (* err ) {
1610
+ trace_9p_protocol_dump (clnt , & req -> rc );
1611
+ p9_tag_remove (clnt , req );
1612
+ return 0 ;
1613
+ }
1614
+ if (rsize < count ) {
1615
+ pr_err ("bogus RREAD count (%d > %d)\n" , count , rsize );
1616
+ count = rsize ;
1617
+ }
1590
1618
1591
- * err = p9pdu_readf (& req -> rc , clnt -> proto_version ,
1592
- "D" , & count , & dataptr );
1593
- if (* err ) {
1594
- trace_9p_protocol_dump (clnt , & req -> rc );
1595
- p9_tag_remove (clnt , req );
1596
- break ;
1597
- }
1598
- if (rsize < count ) {
1599
- pr_err ("bogus RREAD count (%d > %d)\n" , count , rsize );
1600
- count = rsize ;
1601
- }
1619
+ p9_debug (P9_DEBUG_9P , "<<< RREAD count %d\n" , count );
1620
+ if (!count ) {
1621
+ p9_tag_remove (clnt , req );
1622
+ return 0 ;
1623
+ }
1602
1624
1603
- p9_debug (P9_DEBUG_9P , "<<< RREAD count %d\n" , count );
1604
- if (!count ) {
1605
- p9_tag_remove (clnt , req );
1606
- break ;
1607
- }
1625
+ if (non_zc ) {
1626
+ int n = copy_to_iter (dataptr , count , to );
1608
1627
1609
- if (non_zc ) {
1610
- int n = copy_to_iter (dataptr , count , to );
1611
- total += n ;
1612
- offset += n ;
1613
- if (n != count ) {
1614
- * err = - EFAULT ;
1615
- p9_tag_remove (clnt , req );
1616
- break ;
1617
- }
1618
- } else {
1619
- iov_iter_advance (to , count );
1620
- total += count ;
1621
- offset += count ;
1628
+ if (n != count ) {
1629
+ * err = - EFAULT ;
1630
+ p9_tag_remove (clnt , req );
1631
+ return n ;
1622
1632
}
1623
- p9_tag_remove (clnt , req );
1633
+ } else {
1634
+ iov_iter_advance (to , count );
1624
1635
}
1625
- return total ;
1636
+ p9_tag_remove (clnt , req );
1637
+ return count ;
1626
1638
}
1627
- EXPORT_SYMBOL (p9_client_read );
1639
+ EXPORT_SYMBOL (p9_client_read_once );
1628
1640
1629
1641
int
1630
1642
p9_client_write (struct p9_fid * fid , u64 offset , struct iov_iter * from , int * err )
0 commit comments