Commit e9dfc0b2bc42761410e8db6c252c6c5889e178b8
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
fs/ocfs2/aops.c
... | ... | @@ -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) |