Fix various issues with force_restat: -Use time_before to protect against jiffies wrap-around -Clear force_restat on successful stat in sf_inode_revalidate -In sf_lookup() clear force_restat on the new sf_inode_info, rather then leaving force_restat on the new sf_inode_info to whatever kmalloc gave us (so uninitialized) and wrongly clearing it on the parent directory inode -In sf_read_super() explictly initialize force_restat to 0, rather then leaving force_restat on the new sf_inode_info to whatever kmalloc gave us
Signed-off-by: Hans de Goede <[email protected]> --- fs/vboxsf/dirops.c | 2 +- fs/vboxsf/utils.c | 3 ++- fs/vboxsf/vfsmod.c | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/vboxsf/dirops.c b/fs/vboxsf/dirops.c index aebb31975d5b..b6c49a089cc7 100644 --- a/fs/vboxsf/dirops.c +++ b/fs/vboxsf/dirops.c @@ -313,6 +313,7 @@ static struct dentry *sf_lookup(struct inode *parent, struct dentry *dentry, goto fail; } sf_new_i->handle = SHFL_HANDLE_NIL; + sf_new_i->force_restat = 0; sf_new_i->force_reread = 0; ino = iunique(parent->i_sb, 1); @@ -329,7 +330,6 @@ static struct dentry *sf_lookup(struct inode *parent, struct dentry *dentry, unlock_new_inode(inode); } - sf_i->force_restat = 0; dentry->d_time = jiffies; d_set_d_op(dentry, &sf_dentry_ops); d_add(dentry, inode); diff --git a/fs/vboxsf/utils.c b/fs/vboxsf/utils.c index cc270457c3f7..5f91b2faa437 100644 --- a/fs/vboxsf/utils.c +++ b/fs/vboxsf/utils.c @@ -157,7 +157,7 @@ int sf_inode_revalidate(struct dentry *dentry) sf_i = GET_INODE_INFO(dentry->d_inode); if (!sf_i->force_restat) { - if (jiffies - dentry->d_time < sf_g->ttl) + if (time_before(jiffies, dentry->d_time + sf_g->ttl)) return 0; } @@ -166,6 +166,7 @@ int sf_inode_revalidate(struct dentry *dentry) return err; dentry->d_time = jiffies; + sf_i->force_restat = 0; sf_init_inode(sf_g, dentry->d_inode, &info); return 0; } diff --git a/fs/vboxsf/vfsmod.c b/fs/vboxsf/vfsmod.c index 9b3838b11365..1f3b4182bc0a 100644 --- a/fs/vboxsf/vfsmod.c +++ b/fs/vboxsf/vfsmod.c @@ -180,6 +180,7 @@ static int sf_read_super(struct super_block *sb, void *data, int flags) sf_i->path->size = 2; sf_i->path->string.utf8[0] = '/'; sf_i->path->string.utf8[1] = 0; + sf_i->force_restat = 0; sf_i->force_reread = 0; err = sf_stat(__func__, sf_g, sf_i->path, &fsinfo, 0); -- 2.14.3 _______________________________________________ vbox-dev mailing list [email protected] https://www.virtualbox.org/mailman/listinfo/vbox-dev
