|
@@ -41,7 +41,19 @@ static inline int unsigned_offsets(struct file *file)
|
|
|
return file->f_mode & FMODE_UNSIGNED_OFFSET;
|
|
|
}
|
|
|
|
|
|
-static loff_t lseek_execute(struct file *file, loff_t offset, loff_t maxsize)
|
|
|
+/**
|
|
|
+ * vfs_setpos - update the file offset for lseek
|
|
|
+ * @file: file structure in question
|
|
|
+ * @offset: file offset to seek to
|
|
|
+ * @maxsize: maximum file size
|
|
|
+ *
|
|
|
+ * This is a low-level filesystem helper for updating the file offset to
|
|
|
+ * the value specified by @offset if the given offset is valid and it is
|
|
|
+ * not equal to the current file offset.
|
|
|
+ *
|
|
|
+ * Return the specified offset on success and -EINVAL on invalid offset.
|
|
|
+ */
|
|
|
+loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize)
|
|
|
{
|
|
|
if (offset < 0 && !unsigned_offsets(file))
|
|
|
return -EINVAL;
|
|
@@ -54,6 +66,7 @@ static loff_t lseek_execute(struct file *file, loff_t offset, loff_t maxsize)
|
|
|
}
|
|
|
return offset;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(vfs_setpos);
|
|
|
|
|
|
/**
|
|
|
* generic_file_llseek_size - generic llseek implementation for regular files
|
|
@@ -94,7 +107,7 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
|
|
|
* like SEEK_SET.
|
|
|
*/
|
|
|
spin_lock(&file->f_lock);
|
|
|
- offset = lseek_execute(file, file->f_pos + offset, maxsize);
|
|
|
+ offset = vfs_setpos(file, file->f_pos + offset, maxsize);
|
|
|
spin_unlock(&file->f_lock);
|
|
|
return offset;
|
|
|
case SEEK_DATA:
|
|
@@ -116,7 +129,7 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- return lseek_execute(file, offset, maxsize);
|
|
|
+ return vfs_setpos(file, offset, maxsize);
|
|
|
}
|
|
|
EXPORT_SYMBOL(generic_file_llseek_size);
|
|
|
|