Commit e9dfc0b2bc42761410e8db6c252c6c5889e178b8

Authored by Mark Fasheh
1 parent 1c1ee4c3e7

ocfs2: trylock in ocfs2_readpage()

Similarly to the page lock / cluster lock inversion in ocfs2_readpage, we
can deadlock on ip_alloc_sem. We can down_read_trylock() instead and just
return AOP_TRUNCATED_PAGE if the operation fails.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>

Showing 1 changed file with 5 additions and 1 deletions Side-by-side Diff

... ... @@ -222,7 +222,10 @@
222 222 goto out;
223 223 }
224 224  
225   - down_read(&OCFS2_I(inode)->ip_alloc_sem);
  225 + if (down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem) == 0) {
  226 + ret = AOP_TRUNCATED_PAGE;
  227 + goto out_meta_unlock;
  228 + }
226 229  
227 230 /*
228 231 * i_size might have just been updated as we grabed the meta lock. We
... ... @@ -258,6 +261,7 @@
258 261 ocfs2_data_unlock(inode, 0);
259 262 out_alloc:
260 263 up_read(&OCFS2_I(inode)->ip_alloc_sem);
  264 +out_meta_unlock:
261 265 ocfs2_meta_unlock(inode, 0);
262 266 out:
263 267 if (unlock)