ext4: replace cut'n'pasted llseek code with generic_file_llseek_size
authorAndi Kleen <ak@linux.intel.com>
Thu, 15 Sep 2011 23:06:51 +0000 (16:06 -0700)
committerroot <root@serles.lst.de>
Fri, 28 Oct 2011 12:58:59 +0000 (14:58 +0200)
This gives ext4 the benefits of unlocked llseek.

Cc: tytso@mit.edu
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/ext4/file.c

index e4095e9..b9548f4 100644 (file)
@@ -224,53 +224,8 @@ loff_t ext4_llseek(struct file *file, loff_t offset, int origin)
                maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes;
        else
                maxbytes = inode->i_sb->s_maxbytes;
-       mutex_lock(&inode->i_mutex);
-       switch (origin) {
-       case SEEK_END:
-               offset += inode->i_size;
-               break;
-       case SEEK_CUR:
-               if (offset == 0) {
-                       mutex_unlock(&inode->i_mutex);
-                       return file->f_pos;
-               }
-               offset += file->f_pos;
-               break;
-       case SEEK_DATA:
-               /*
-                * In the generic case the entire file is data, so as long as
-                * offset isn't at the end of the file then the offset is data.
-                */
-               if (offset >= inode->i_size) {
-                       mutex_unlock(&inode->i_mutex);
-                       return -ENXIO;
-               }
-               break;
-       case SEEK_HOLE:
-               /*
-                * There is a virtual hole at the end of the file, so as long as
-                * offset isn't i_size or larger, return i_size.
-                */
-               if (offset >= inode->i_size) {
-                       mutex_unlock(&inode->i_mutex);
-                       return -ENXIO;
-               }
-               offset = inode->i_size;
-               break;
-       }
-
-       if (offset < 0 || offset > maxbytes) {
-               mutex_unlock(&inode->i_mutex);
-               return -EINVAL;
-       }
-
-       if (offset != file->f_pos) {
-               file->f_pos = offset;
-               file->f_version = 0;
-       }
-       mutex_unlock(&inode->i_mutex);
 
-       return offset;
+       return generic_file_llseek_size(file, offset, origin, maxbytes);
 }
 
 const struct file_operations ext4_file_operations = {