]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/fs-writeback.c
writeback: fix race that cause writeback hung
[karo-tx-linux.git] / fs / fs-writeback.c
index 54b3c31c2f0dc0d2267ae134f0fccfc7c267996a..30f6f27d5a59a51a4c89334b457b227318e860d7 100644 (file)
@@ -1171,6 +1171,8 @@ void __mark_inode_dirty(struct inode *inode, int flags)
                        bool wakeup_bdi = false;
                        bdi = inode_to_bdi(inode);
 
+                       spin_unlock(&inode->i_lock);
+                       spin_lock(&bdi->wb.list_lock);
                        if (bdi_cap_writeback_dirty(bdi)) {
                                WARN(!test_bit(BDI_registered, &bdi->state),
                                     "bdi-%s not registered\n", bdi->name);
@@ -1185,8 +1187,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
                                        wakeup_bdi = true;
                        }
 
-                       spin_unlock(&inode->i_lock);
-                       spin_lock(&bdi->wb.list_lock);
                        inode->dirtied_when = jiffies;
                        list_move(&inode->i_wb_list, &bdi->wb.b_dirty);
                        spin_unlock(&bdi->wb.list_lock);