Replace it with the blockdev inode's i_sem. And we only really need that for atomic access to file->f_pos. fs/block_dev.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff -puN fs/block_dev.c~block_llseek-no-lock_kernel fs/block_dev.c --- 25/fs/block_dev.c~block_llseek-no-lock_kernel 2003-06-28 02:18:23.000000000 -0700 +++ 25-akpm/fs/block_dev.c 2003-06-28 02:21:58.000000000 -0700 @@ -155,11 +155,13 @@ static int blkdev_commit_write(struct fi */ static loff_t block_llseek(struct file *file, loff_t offset, int origin) { - /* ewww */ - loff_t size = file->f_dentry->d_inode->i_bdev->bd_inode->i_size; + struct inode *bd_inode; + loff_t size; loff_t retval; - lock_kernel(); + bd_inode = file->f_dentry->d_inode->i_bdev->bd_inode; + down(&bd_inode->i_sem); + size = bd_inode->i_size; switch (origin) { case 2: @@ -175,7 +177,7 @@ static loff_t block_llseek(struct file * } retval = offset; } - unlock_kernel(); + up(&bd_inode->i_sem); return retval; } _