mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: fuse: llseek fix race fuse: fix llseek bug fuse: fix fuse_retrieve
This commit is contained in:
commit
30aaca4582
@ -1512,7 +1512,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
|
||||
else if (outarg->offset + num > file_size)
|
||||
num = file_size - outarg->offset;
|
||||
|
||||
while (num) {
|
||||
while (num && req->num_pages < FUSE_MAX_PAGES_PER_REQ) {
|
||||
struct page *page;
|
||||
unsigned int this_num;
|
||||
|
||||
@ -1526,6 +1526,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
|
||||
|
||||
num -= this_num;
|
||||
total_len += this_num;
|
||||
index++;
|
||||
}
|
||||
req->misc.retrieve_in.offset = outarg->offset;
|
||||
req->misc.retrieve_in.size = total_len;
|
||||
|
@ -1556,7 +1556,7 @@ static loff_t fuse_file_llseek(struct file *file, loff_t offset, int origin)
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
if (origin != SEEK_CUR || origin != SEEK_SET) {
|
||||
if (origin != SEEK_CUR && origin != SEEK_SET) {
|
||||
retval = fuse_update_attributes(inode, NULL, file, NULL);
|
||||
if (retval)
|
||||
goto exit;
|
||||
@ -1567,6 +1567,10 @@ static loff_t fuse_file_llseek(struct file *file, loff_t offset, int origin)
|
||||
offset += i_size_read(inode);
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
if (offset == 0) {
|
||||
retval = file->f_pos;
|
||||
goto exit;
|
||||
}
|
||||
offset += file->f_pos;
|
||||
break;
|
||||
case SEEK_DATA:
|
||||
|
Loading…
Reference in New Issue
Block a user