diff options
Diffstat (limited to 'fs/read_write.c')
-rw-r--r-- | fs/read_write.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index 672b187def62..dfd125798791 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -51,23 +51,23 @@ static loff_t lseek_execute(struct file *file, struct inode *inode, | |||
51 | } | 51 | } |
52 | 52 | ||
53 | /** | 53 | /** |
54 | * generic_file_llseek - generic llseek implementation for regular files | 54 | * generic_file_llseek_size - generic llseek implementation for regular files |
55 | * @file: file structure to seek on | 55 | * @file: file structure to seek on |
56 | * @offset: file offset to seek to | 56 | * @offset: file offset to seek to |
57 | * @origin: type of seek | 57 | * @origin: type of seek |
58 | * @size: max size of file system | ||
58 | * | 59 | * |
59 | * This is a generic implemenation of ->llseek usable for all normal local | 60 | * This is a variant of generic_file_llseek that allows passing in a custom |
60 | * filesystems. It just updates the file offset to the value specified by | 61 | * file size. |
61 | * @offset and @origin under i_mutex. | ||
62 | * | 62 | * |
63 | * Synchronization: | 63 | * Synchronization: |
64 | * SEEK_SET is unsynchronized (but atomic on 64bit platforms) | 64 | * SEEK_SET and SEEK_END are unsynchronized (but atomic on 64bit platforms) |
65 | * SEEK_CUR is synchronized against other SEEK_CURs, but not read/writes. | 65 | * SEEK_CUR is synchronized against other SEEK_CURs, but not read/writes. |
66 | * read/writes behave like SEEK_SET against seeks. | 66 | * read/writes behave like SEEK_SET against seeks. |
67 | * SEEK_END | ||
68 | */ | 67 | */ |
69 | loff_t | 68 | loff_t |
70 | generic_file_llseek(struct file *file, loff_t offset, int origin) | 69 | generic_file_llseek_size(struct file *file, loff_t offset, int origin, |
70 | loff_t maxsize) | ||
71 | { | 71 | { |
72 | struct inode *inode = file->f_mapping->host; | 72 | struct inode *inode = file->f_mapping->host; |
73 | 73 | ||
@@ -91,7 +91,7 @@ generic_file_llseek(struct file *file, loff_t offset, int origin) | |||
91 | */ | 91 | */ |
92 | spin_lock(&file->f_lock); | 92 | spin_lock(&file->f_lock); |
93 | offset = lseek_execute(file, inode, file->f_pos + offset, | 93 | offset = lseek_execute(file, inode, file->f_pos + offset, |
94 | inode->i_sb->s_maxbytes); | 94 | maxsize); |
95 | spin_unlock(&file->f_lock); | 95 | spin_unlock(&file->f_lock); |
96 | return offset; | 96 | return offset; |
97 | case SEEK_DATA: | 97 | case SEEK_DATA: |
@@ -113,7 +113,26 @@ generic_file_llseek(struct file *file, loff_t offset, int origin) | |||
113 | break; | 113 | break; |
114 | } | 114 | } |
115 | 115 | ||
116 | return lseek_execute(file, inode, offset, inode->i_sb->s_maxbytes); | 116 | return lseek_execute(file, inode, offset, maxsize); |
117 | } | ||
118 | EXPORT_SYMBOL(generic_file_llseek_size); | ||
119 | |||
120 | /** | ||
121 | * generic_file_llseek - generic llseek implementation for regular files | ||
122 | * @file: file structure to seek on | ||
123 | * @offset: file offset to seek to | ||
124 | * @origin: type of seek | ||
125 | * | ||
126 | * This is a generic implemenation of ->llseek useable for all normal local | ||
127 | * filesystems. It just updates the file offset to the value specified by | ||
128 | * @offset and @origin under i_mutex. | ||
129 | */ | ||
130 | loff_t generic_file_llseek(struct file *file, loff_t offset, int origin) | ||
131 | { | ||
132 | struct inode *inode = file->f_mapping->host; | ||
133 | |||
134 | return generic_file_llseek_size(file, offset, origin, | ||
135 | inode->i_sb->s_maxbytes); | ||
117 | } | 136 | } |
118 | EXPORT_SYMBOL(generic_file_llseek); | 137 | EXPORT_SYMBOL(generic_file_llseek); |
119 | 138 | ||