From: Brian F. <bf...@re...> - 2012-10-04 18:45:16
|
On 10/04/2012 11:49 AM, Maxim V. Patlasov wrote: > Hi, > >> @@ -204,13 +205,16 @@ void fuse_change_attributes(struct inode *inode, >> struct fuse_attr *attr, >> return; >> } >> + old_mtime = inode->i_mtime; >> fuse_change_attributes_common(inode, attr, attr_valid); >> oldsize = inode->i_size; >> i_size_write(inode, attr->size); >> spin_unlock(&fc->lock); >> - if (S_ISREG(inode->i_mode) && oldsize != attr->size) { >> + /* Auto inval mode also checks and invalidates if mtime has >> changed. */ >> + if (S_ISREG(inode->i_mode) && ((oldsize != attr->size) || >> + (fc->auto_inval_data && !timespec_equal(&old_mtime, >> &inode->i_mtime)))) { >> truncate_pagecache(inode, oldsize, attr->size); >> invalidate_inode_pages2(inode->i_mapping); >> } > > Any write will bump mtime on storage, keeping local inode->i_mtime > stale. Consequently any subsequent stat(2) will invalidate all pages > (because attr->mtime will bear new fresh value coming from the storage). > Looks as a bug :) > Hi Maxim, Hmm, that is indeed an unintended consequence. ;) I don't have a clear fix off the top of my head. Perhaps we allow a client fs to bundle post-operation attributes in a request response (a la NFS)? That's certainly not a trivial change. I'll have to think about it some more. Thanks for pointing this out! Brian > Thanks, > Maxim |