From 015fe70bf7d18f10231fcdb48bd6da7708b83aed Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Mon, 12 Jul 2004 11:52:24 +0000 Subject: [PATCH] fixes --- ChangeLog | 11 +++++++++++ kernel/dir.c | 23 ++++++++++++++++++++++- kernel/file.c | 5 ++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 302b8de..cd48862 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-07-08 Miklos Szeredi + + * When performing create or remove operation, refresh the parent's + attributes on next revalidate, as i_nlink (and maybe size/time) + could be inacurate. + + * Use redirty_page_for_writepage() in fuse_writepage() for skipped + pages (2.6 only) + + * Set set_page_dirty address space operation (2.6 only) + 2004-07-06 Miklos Szeredi * Minor fix in read: print debug info even if read size is zero diff --git a/kernel/dir.c b/kernel/dir.c index 3e41f19..519e044 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -191,6 +191,18 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry, return 0; } +static void uncache_dir(struct inode *dir) +{ + struct dentry *entry = d_find_alias(dir); + if (!entry) + dir->i_nlink = 0; + else { + /* FIXME: this should reset the _attribute_ timeout */ + entry->d_time = jiffies - 1; + dput(entry); + } +} + static int lookup_new_entry(struct fuse_conn *fc, struct fuse_req *req, struct inode *dir, struct dentry *entry, struct fuse_entry_out *outarg, int version, @@ -216,6 +228,7 @@ static int lookup_new_entry(struct fuse_conn *fc, struct fuse_req *req, outarg->entry_valid_nsec); d_instantiate(entry, inode); + uncache_dir(dir); return 0; } @@ -352,6 +365,7 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry) discovered at the next lookup/getattr */ /* FIXME: mark inode "not uptodate" */ entry->d_inode->i_nlink = 0; + uncache_dir(dir); } fuse_put_request(fc, req); return err; @@ -373,8 +387,10 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry) req->in.args[0].value = entry->d_name.name; request_send(fc, req); err = req->out.h.error; - if (!err) + if (!err) { entry->d_inode->i_nlink = 0; + uncache_dir(dir); + } fuse_put_request(fc, req); return err; } @@ -404,6 +420,11 @@ static int fuse_rename(struct inode *olddir, struct dentry *oldent, request_send(fc, req); err = req->out.h.error; fuse_put_request(fc, req); + if (!err) { + uncache_dir(olddir); + if (olddir != newdir) + uncache_dir(newdir); + } return err; } diff --git a/kernel/file.c b/kernel/file.c index a443e6b..215d9b5 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -544,7 +544,7 @@ static int fuse_writepage(struct page *page, struct writeback_control *wbc) if (err) ClearPageWriteback(page); if (err == -EWOULDBLOCK) { - __set_page_dirty_nobuffers(page); + redirty_page_for_writepage(wbc, page); err = 0; } } else @@ -681,6 +681,9 @@ static struct address_space_operations fuse_file_aops = { .writepage = fuse_writepage, .prepare_write = fuse_prepare_write, .commit_write = fuse_commit_write, +#ifdef KERNEL_2_6 + .set_page_dirty = __set_page_dirty_nobuffers, +#endif }; void fuse_init_file_inode(struct inode *inode) -- 2.30.2