diff options
Diffstat (limited to 'fs/ext4/file.c')
| -rw-r--r-- | fs/ext4/file.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index ee92b66d4558..5a5c55ddceef 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -130,8 +130,50 @@ static int ext4_file_open(struct inode * inode, struct file * filp) | |||
| 130 | return dquot_file_open(inode, filp); | 130 | return dquot_file_open(inode, filp); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | /* | ||
| 134 | * ext4_llseek() copied from generic_file_llseek() to handle both | ||
| 135 | * block-mapped and extent-mapped maxbytes values. This should | ||
| 136 | * otherwise be identical with generic_file_llseek(). | ||
| 137 | */ | ||
| 138 | loff_t ext4_llseek(struct file *file, loff_t offset, int origin) | ||
| 139 | { | ||
| 140 | struct inode *inode = file->f_mapping->host; | ||
| 141 | loff_t maxbytes; | ||
| 142 | |||
| 143 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) | ||
| 144 | maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; | ||
| 145 | else | ||
| 146 | maxbytes = inode->i_sb->s_maxbytes; | ||
| 147 | mutex_lock(&inode->i_mutex); | ||
| 148 | switch (origin) { | ||
| 149 | case SEEK_END: | ||
| 150 | offset += inode->i_size; | ||
| 151 | break; | ||
| 152 | case SEEK_CUR: | ||
| 153 | if (offset == 0) { | ||
| 154 | mutex_unlock(&inode->i_mutex); | ||
| 155 | return file->f_pos; | ||
| 156 | } | ||
| 157 | offset += file->f_pos; | ||
| 158 | break; | ||
| 159 | } | ||
| 160 | |||
| 161 | if (offset < 0 || offset > maxbytes) { | ||
| 162 | mutex_unlock(&inode->i_mutex); | ||
| 163 | return -EINVAL; | ||
| 164 | } | ||
| 165 | |||
| 166 | if (offset != file->f_pos) { | ||
| 167 | file->f_pos = offset; | ||
| 168 | file->f_version = 0; | ||
| 169 | } | ||
| 170 | mutex_unlock(&inode->i_mutex); | ||
| 171 | |||
| 172 | return offset; | ||
| 173 | } | ||
| 174 | |||
| 133 | const struct file_operations ext4_file_operations = { | 175 | const struct file_operations ext4_file_operations = { |
| 134 | .llseek = generic_file_llseek, | 176 | .llseek = ext4_llseek, |
| 135 | .read = do_sync_read, | 177 | .read = do_sync_read, |
| 136 | .write = do_sync_write, | 178 | .write = do_sync_write, |
| 137 | .aio_read = generic_file_aio_read, | 179 | .aio_read = generic_file_aio_read, |
