Преглед на файлове

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>
Mark Fasheh преди 18 години
родител
ревизия
e9dfc0b2bc
променени са 1 файла, в които са добавени 5 реда и са изтрити 1 реда
  1. 5 1
      fs/ocfs2/aops.c

+ 5 - 1
fs/ocfs2/aops.c

@@ -222,7 +222,10 @@ static int ocfs2_readpage(struct file *file, struct page *page)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	down_read(&OCFS2_I(inode)->ip_alloc_sem);
+	if (down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem) == 0) {
+		ret = AOP_TRUNCATED_PAGE;
+		goto out_meta_unlock;
+	}
 
 
 	/*
 	/*
 	 * i_size might have just been updated as we grabed the meta lock.  We
 	 * i_size might have just been updated as we grabed the meta lock.  We
@@ -258,6 +261,7 @@ static int ocfs2_readpage(struct file *file, struct page *page)
 	ocfs2_data_unlock(inode, 0);
 	ocfs2_data_unlock(inode, 0);
 out_alloc:
 out_alloc:
 	up_read(&OCFS2_I(inode)->ip_alloc_sem);
 	up_read(&OCFS2_I(inode)->ip_alloc_sem);
+out_meta_unlock:
 	ocfs2_meta_unlock(inode, 0);
 	ocfs2_meta_unlock(inode, 0);
 out:
 out:
 	if (unlock)
 	if (unlock)