Explorar o código

ceph: writepage grabs and releases inode

Fixes a deadlock that is triggered due to kswapd,
while the page was locked and the iput couldn't tear
down the address space.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Yehuda Sadeh %!s(int64=16) %!d(string=hai) anos
pai
achega
dbd646a851
Modificáronse 1 ficheiros con 6 adicións e 1 borrados
  1. 6 1
      fs/ceph/addr.c

+ 6 - 1
fs/ceph/addr.c

@@ -448,8 +448,13 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
 
 
 static int ceph_writepage(struct page *page, struct writeback_control *wbc)
 static int ceph_writepage(struct page *page, struct writeback_control *wbc)
 {
 {
-	int err = writepage_nounlock(page, wbc);
+	int err;
+	struct inode *inode = page->mapping->host;
+	BUG_ON(!inode);
+	igrab(inode);
+	err = writepage_nounlock(page, wbc);
 	unlock_page(page);
 	unlock_page(page);
+	iput(inode);
 	return err;
 	return err;
 }
 }