@@ -1740,16 +1740,16 @@ static bool pnfs_within_mdsthreshold(struct nfs_open_context *ctx,
1740
1740
return ret ;
1741
1741
}
1742
1742
1743
- static bool pnfs_prepare_to_retry_layoutget (struct pnfs_layout_hdr * lo )
1743
+ static int pnfs_prepare_to_retry_layoutget (struct pnfs_layout_hdr * lo )
1744
1744
{
1745
1745
/*
1746
1746
* send layoutcommit as it can hold up layoutreturn due to lseg
1747
1747
* reference
1748
1748
*/
1749
1749
pnfs_layoutcommit_inode (lo -> plh_inode , false);
1750
- return ! wait_on_bit_action (& lo -> plh_flags , NFS_LAYOUT_RETURN ,
1750
+ return wait_on_bit_action (& lo -> plh_flags , NFS_LAYOUT_RETURN ,
1751
1751
nfs_wait_bit_killable ,
1752
- TASK_UNINTERRUPTIBLE );
1752
+ TASK_KILLABLE );
1753
1753
}
1754
1754
1755
1755
static void nfs_layoutget_begin (struct pnfs_layout_hdr * lo )
@@ -1830,7 +1830,9 @@ pnfs_update_layout(struct inode *ino,
1830
1830
}
1831
1831
1832
1832
lookup_again :
1833
- nfs4_client_recover_expired_lease (clp );
1833
+ lseg = ERR_PTR (nfs4_client_recover_expired_lease (clp ));
1834
+ if (IS_ERR (lseg ))
1835
+ goto out ;
1834
1836
first = false;
1835
1837
spin_lock (& ino -> i_lock );
1836
1838
lo = pnfs_find_alloc_layout (ino , ctx , gfp_flags );
@@ -1863,9 +1865,9 @@ pnfs_update_layout(struct inode *ino,
1863
1865
if (list_empty (& lo -> plh_segs ) &&
1864
1866
atomic_read (& lo -> plh_outstanding ) != 0 ) {
1865
1867
spin_unlock (& ino -> i_lock );
1866
- if (wait_var_event_killable (& lo -> plh_outstanding ,
1867
- atomic_read (& lo -> plh_outstanding ) == 0
1868
- || !list_empty (& lo -> plh_segs ) ))
1868
+ lseg = ERR_PTR (wait_var_event_killable (& lo -> plh_outstanding ,
1869
+ atomic_read (& lo -> plh_outstanding )));
1870
+ if ( IS_ERR ( lseg ) || !list_empty (& lo -> plh_segs ))
1869
1871
goto out_put_layout_hdr ;
1870
1872
pnfs_put_layout_hdr (lo );
1871
1873
goto lookup_again ;
@@ -1898,8 +1900,11 @@ pnfs_update_layout(struct inode *ino,
1898
1900
if (test_and_set_bit (NFS_LAYOUT_FIRST_LAYOUTGET ,
1899
1901
& lo -> plh_flags )) {
1900
1902
spin_unlock (& ino -> i_lock );
1901
- wait_on_bit (& lo -> plh_flags , NFS_LAYOUT_FIRST_LAYOUTGET ,
1902
- TASK_UNINTERRUPTIBLE );
1903
+ lseg = ERR_PTR (wait_on_bit (& lo -> plh_flags ,
1904
+ NFS_LAYOUT_FIRST_LAYOUTGET ,
1905
+ TASK_KILLABLE ));
1906
+ if (IS_ERR (lseg ))
1907
+ goto out_put_layout_hdr ;
1903
1908
pnfs_put_layout_hdr (lo );
1904
1909
dprintk ("%s retrying\n" , __func__ );
1905
1910
goto lookup_again ;
@@ -1925,7 +1930,8 @@ pnfs_update_layout(struct inode *ino,
1925
1930
if (test_bit (NFS_LAYOUT_RETURN , & lo -> plh_flags )) {
1926
1931
spin_unlock (& ino -> i_lock );
1927
1932
dprintk ("%s wait for layoutreturn\n" , __func__ );
1928
- if (pnfs_prepare_to_retry_layoutget (lo )) {
1933
+ lseg = ERR_PTR (pnfs_prepare_to_retry_layoutget (lo ));
1934
+ if (!IS_ERR (lseg )) {
1929
1935
if (first )
1930
1936
pnfs_clear_first_layoutget (lo );
1931
1937
pnfs_put_layout_hdr (lo );
0 commit comments