@@ -1554,6 +1554,11 @@ static noinline u64 find_delalloc_range(struct extent_io_tree *tree,
1554
1554
return found ;
1555
1555
}
1556
1556
1557
+ static int __process_pages_contig (struct address_space * mapping ,
1558
+ struct page * locked_page ,
1559
+ pgoff_t start_index , pgoff_t end_index ,
1560
+ unsigned long page_ops , pgoff_t * index_ret );
1561
+
1557
1562
static noinline void __unlock_for_delalloc (struct inode * inode ,
1558
1563
struct page * locked_page ,
1559
1564
u64 start , u64 end )
@@ -1731,31 +1736,47 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode,
1731
1736
return found ;
1732
1737
}
1733
1738
1734
- static void __process_pages_contig (struct address_space * mapping ,
1735
- struct page * locked_page ,
1736
- pgoff_t start_index , pgoff_t end_index ,
1737
- unsigned long page_ops )
1739
+ static int __process_pages_contig (struct address_space * mapping ,
1740
+ struct page * locked_page ,
1741
+ pgoff_t start_index , pgoff_t end_index ,
1742
+ unsigned long page_ops , pgoff_t * index_ret )
1738
1743
{
1739
1744
unsigned long nr_pages = end_index - start_index + 1 ;
1745
+ unsigned long pages_locked = 0 ;
1740
1746
pgoff_t index = start_index ;
1741
1747
struct page * pages [16 ];
1742
1748
unsigned ret ;
1749
+ int err = 0 ;
1743
1750
int i ;
1744
1751
1752
+ if (page_ops & PAGE_LOCK ) {
1753
+ ASSERT (page_ops == PAGE_LOCK );
1754
+ ASSERT (index_ret && * index_ret == start_index );
1755
+ }
1756
+
1745
1757
if ((page_ops & PAGE_SET_ERROR ) && nr_pages > 0 )
1746
1758
mapping_set_error (mapping , - EIO );
1747
1759
1748
1760
while (nr_pages > 0 ) {
1749
1761
ret = find_get_pages_contig (mapping , index ,
1750
1762
min_t (unsigned long ,
1751
1763
nr_pages , ARRAY_SIZE (pages )), pages );
1752
- for (i = 0 ; i < ret ; i ++ ) {
1764
+ if (ret == 0 ) {
1765
+ /*
1766
+ * Only if we're going to lock these pages,
1767
+ * can we find nothing at @index.
1768
+ */
1769
+ ASSERT (page_ops & PAGE_LOCK );
1770
+ return ret ;
1771
+ }
1753
1772
1773
+ for (i = 0 ; i < ret ; i ++ ) {
1754
1774
if (page_ops & PAGE_SET_PRIVATE2 )
1755
1775
SetPagePrivate2 (pages [i ]);
1756
1776
1757
1777
if (pages [i ] == locked_page ) {
1758
1778
put_page (pages [i ]);
1779
+ pages_locked ++ ;
1759
1780
continue ;
1760
1781
}
1761
1782
if (page_ops & PAGE_CLEAR_DIRTY )
@@ -1768,12 +1789,27 @@ static void __process_pages_contig(struct address_space *mapping,
1768
1789
end_page_writeback (pages [i ]);
1769
1790
if (page_ops & PAGE_UNLOCK )
1770
1791
unlock_page (pages [i ]);
1792
+ if (page_ops & PAGE_LOCK ) {
1793
+ lock_page (pages [i ]);
1794
+ if (!PageDirty (pages [i ]) ||
1795
+ pages [i ]-> mapping != mapping ) {
1796
+ unlock_page (pages [i ]);
1797
+ put_page (pages [i ]);
1798
+ err = - EAGAIN ;
1799
+ goto out ;
1800
+ }
1801
+ }
1771
1802
put_page (pages [i ]);
1803
+ pages_locked ++ ;
1772
1804
}
1773
1805
nr_pages -= ret ;
1774
1806
index += ret ;
1775
1807
cond_resched ();
1776
1808
}
1809
+ out :
1810
+ if (err && index_ret )
1811
+ * index_ret = start_index + pages_locked - 1 ;
1812
+ return err ;
1777
1813
}
1778
1814
1779
1815
void extent_clear_unlock_delalloc (struct inode * inode , u64 start , u64 end ,
@@ -1786,7 +1822,7 @@ void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
1786
1822
1787
1823
__process_pages_contig (inode -> i_mapping , locked_page ,
1788
1824
start >> PAGE_SHIFT , end >> PAGE_SHIFT ,
1789
- page_ops );
1825
+ page_ops , NULL );
1790
1826
}
1791
1827
1792
1828
/*
0 commit comments