From: Ingo Molnar here are a couple of might_sleep() additions that i've been using for the preemption patch but which i believe are generally useful too. Perhaps the mmap.c one is unjustified? Ingo Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/fs/dcache.c | 2 ++ 25-akpm/fs/file_table.c | 1 + 25-akpm/fs/fs-writeback.c | 1 + 25-akpm/include/linux/buffer_head.h | 1 + 25-akpm/mm/mmap.c | 1 + 5 files changed, 6 insertions(+) diff -puN fs/dcache.c~even-more-might_sleep-checks fs/dcache.c --- 25/fs/dcache.c~even-more-might_sleep-checks Wed Aug 4 14:55:01 2004 +++ 25-akpm/fs/dcache.c Wed Aug 4 14:55:01 2004 @@ -144,6 +144,8 @@ void dput(struct dentry *dentry) return; repeat: + if (atomic_read(&dentry->d_count) == 1) + might_sleep(); if (!atomic_dec_and_lock(&dentry->d_count, &dcache_lock)) return; diff -puN fs/file_table.c~even-more-might_sleep-checks fs/file_table.c --- 25/fs/file_table.c~even-more-might_sleep-checks Wed Aug 4 14:55:01 2004 +++ 25-akpm/fs/file_table.c Wed Aug 4 14:55:01 2004 @@ -169,6 +169,7 @@ void fastcall __fput(struct file *file) struct vfsmount *mnt = file->f_vfsmnt; struct inode *inode = dentry->d_inode; + might_sleep(); /* * The function eventpoll_release() should be the first called * in the file cleanup chain. diff -puN fs/fs-writeback.c~even-more-might_sleep-checks fs/fs-writeback.c --- 25/fs/fs-writeback.c~even-more-might_sleep-checks Wed Aug 4 14:55:01 2004 +++ 25-akpm/fs/fs-writeback.c Wed Aug 4 14:55:01 2004 @@ -554,6 +554,7 @@ void write_inode_now(struct inode *inode if (inode->i_mapping->backing_dev_info->memory_backed) return; + might_sleep(); spin_lock(&inode_lock); __writeback_single_inode(inode, &wbc); spin_unlock(&inode_lock); diff -puN include/linux/buffer_head.h~even-more-might_sleep-checks include/linux/buffer_head.h --- 25/include/linux/buffer_head.h~even-more-might_sleep-checks Wed Aug 4 14:55:01 2004 +++ 25-akpm/include/linux/buffer_head.h Wed Aug 4 14:55:01 2004 @@ -285,6 +285,7 @@ static inline void wait_on_buffer(struct static inline void lock_buffer(struct buffer_head *bh) { + might_sleep(); if (test_set_buffer_locked(bh)) __lock_buffer(bh); } diff -puN mm/mmap.c~even-more-might_sleep-checks mm/mmap.c --- 25/mm/mmap.c~even-more-might_sleep-checks Wed Aug 4 14:55:01 2004 +++ 25-akpm/mm/mmap.c Wed Aug 4 14:55:01 2004 @@ -90,6 +90,7 @@ static void remove_vm_struct(struct vm_a { struct file *file = vma->vm_file; + might_sleep(); if (file) { struct address_space *mapping = file->f_mapping; spin_lock(&mapping->i_mmap_lock); _