Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b36c31ba authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds
Browse files

[PATCH] fuse: don't update file times



Don't change mtime/ctime/atime to local time on read/write.  Rather invalidate
file attributes, so next stat() will force a GETATTR call.  Bug reported by
Ben Grimm.

Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 45323fb7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -552,6 +552,7 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
				    filldir);

	__free_page(page);
	fuse_invalidate_attr(inode); /* atime changed */
	return err;
}

@@ -585,6 +586,7 @@ static char *read_link(struct dentry *dentry)
		link[req->out.args[0].size] = '\0';
 out:
	fuse_put_request(fc, req);
	fuse_invalidate_attr(inode); /* atime changed */
	return link;
}

+6 −4
Original line number Diff line number Diff line
@@ -244,6 +244,7 @@ static int fuse_readpage(struct file *file, struct page *page)
	fuse_put_request(fc, req);
	if (!err)
		SetPageUptodate(page);
	fuse_invalidate_attr(inode); /* atime changed */
 out:
	unlock_page(page);
	return err;
@@ -312,6 +313,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping,
	if (!err && data.req->num_pages)
		err = fuse_send_readpages(data.req, file, inode);
	fuse_put_request(fc, data.req);
	fuse_invalidate_attr(inode); /* atime changed */
	return err;
}

@@ -380,7 +382,7 @@ static int fuse_commit_write(struct file *file, struct page *page,
			clear_page_dirty(page);
			SetPageUptodate(page);
		}
	} else if (err == -EINTR || err == -EIO)
	}
	fuse_invalidate_attr(inode);
	return err;
}
@@ -473,7 +475,7 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
		if (write && pos > i_size_read(inode))
			i_size_write(inode, pos);
		*ppos = pos;
	} else if (write && (res == -EINTR || res == -EIO))
	}
	fuse_invalidate_attr(inode);

	return res;
+1 −0
Original line number Diff line number Diff line
@@ -173,6 +173,7 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
		return NULL;

	if ((inode->i_state & I_NEW)) {
		inode->i_flags |= S_NOATIME|S_NOCMTIME;
		inode->i_generation = generation;
		inode->i_data.backing_dev_info = &fc->bdi;
		fuse_init_inode(inode, attr);