Don't need the i_mutex for those cases, only for SEEK_HOLE/DATA. Really-From: Andi Kleen <ak@xxxxxxxxxxxxxxx> Signed-off-by: Andi Kleen <ak@xxxxxxxxxxxxxxx> Signed-off-by: Andres Freund <andres@xxxxxxxxxxx> --- fs/btrfs/file.c | 27 +++++++++++---------------- 1 files changed, 11 insertions(+), 16 deletions(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 7a13337..5bc7116 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1809,24 +1809,19 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin) struct inode *inode = file->f_mapping->host; int ret; + if (origin != SEEK_DATA && origin != SEEK_HOLE) + return generic_file_llseek(file, offset, origin); + mutex_lock(&inode->i_mutex); - switch (origin) { - case SEEK_END: - case SEEK_CUR: - offset = generic_file_llseek(file, offset, origin); - goto out; - case SEEK_DATA: - case SEEK_HOLE: - if (offset >= i_size_read(inode)) { - mutex_unlock(&inode->i_mutex); - return -ENXIO; - } + if (offset >= i_size_read(inode)) { + mutex_unlock(&inode->i_mutex); + return -ENXIO; + } - ret = find_desired_extent(inode, &offset, origin); - if (ret) { - mutex_unlock(&inode->i_mutex); - return ret; - } + ret = find_desired_extent(inode, &offset, origin); + if (ret) { + mutex_unlock(&inode->i_mutex); + return ret; } if (offset < 0 && !(file->f_mode & FMODE_UNSIGNED_OFFSET)) { -- 1.7.6.409.ge7a85.dirty -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html