Hello, Mimi and I working on IMA/EVM (security/integrity) and it uses i_version for checking if file content has been changed. extX file systems support i_version updates with mounting file system with "iversion" option or via kernel command line parameter "i_version" It seems iversion option is not recognized when mounting btrfs. I see this patchset deals with i_version update as well.. Can you please give an advice how to use i_version with btrfs? Thanks, Dmitry On Mon, Mar 26, 2012 at 5:10 PM, Josef Bacik <josef@xxxxxxxxxx> wrote: > Btrfs had been doing it's own file_update_time so we could catch ENOSPC > properly, so just update our btrfs_update_time to work with the new stuff and > then we'll be fancy later. Thanks, > > Signed-off-by: Josef Bacik <josef@xxxxxxxxxx> > --- > fs/btrfs/ctree.h | 1 - > fs/btrfs/file.c | 2 +- > fs/btrfs/inode.c | 53 ++++++++++++++--------------------------------------- > 3 files changed, 15 insertions(+), 41 deletions(-) > > diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h > index 9d6f59c..9e4a06e 100644 > --- a/fs/btrfs/ctree.h > +++ b/fs/btrfs/ctree.h > @@ -2887,7 +2887,6 @@ int btrfs_readpage(struct file *file, struct page *page); > void btrfs_evict_inode(struct inode *inode); > int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); > int btrfs_dirty_inode(struct inode *inode); > -int btrfs_update_time(struct file *file); > struct inode *btrfs_alloc_inode(struct super_block *sb); > void btrfs_destroy_inode(struct inode *inode); > int btrfs_drop_inode(struct inode *inode); > diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c > index 859ba2d..50b8cea 100644 > --- a/fs/btrfs/file.c > +++ b/fs/btrfs/file.c > @@ -1389,7 +1389,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, > goto out; > } > > - err = btrfs_update_time(file); > + err = file_update_time(file); > if (err) { > mutex_unlock(&inode->i_mutex); > goto out; > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index c2c44d6..2c7359b 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -4287,46 +4287,18 @@ int btrfs_dirty_inode(struct inode *inode) > * This is a copy of file_update_time. We need this so we can return error on > * ENOSPC for updating the inode in the case of file write and mmap writes. > */ > -int btrfs_update_time(struct file *file) > +static int btrfs_update_time(struct inode *inode, struct timespec *now, > + int flags) > { > - struct inode *inode = file->f_path.dentry->d_inode; > - struct timespec now; > - int ret; > - enum { S_MTIME = 1, S_CTIME = 2, S_VERSION = 4 } sync_it = 0; > - > - /* First try to exhaust all avenues to not sync */ > - if (IS_NOCMTIME(inode)) > - return 0; > - > - now = current_fs_time(inode->i_sb); > - if (!timespec_equal(&inode->i_mtime, &now)) > - sync_it = S_MTIME; > - > - if (!timespec_equal(&inode->i_ctime, &now)) > - sync_it |= S_CTIME; > - > - if (IS_I_VERSION(inode)) > - sync_it |= S_VERSION; > - > - if (!sync_it) > - return 0; > - > - /* Finally allowed to write? Takes lock. */ > - if (mnt_want_write_file(file)) > - return 0; > - > - /* Only change inode inside the lock region */ > - if (sync_it & S_VERSION) > + if (flags & S_VERSION) > inode_inc_iversion(inode); > - if (sync_it & S_CTIME) > - inode->i_ctime = now; > - if (sync_it & S_MTIME) > - inode->i_mtime = now; > - ret = btrfs_dirty_inode(inode); > - if (!ret) > - mark_inode_dirty_sync(inode); > - mnt_drop_write(file->f_path.mnt); > - return ret; > + if (flags & S_CTIME) > + inode->i_ctime = *now; > + if (flags & S_MTIME) > + inode->i_mtime = *now; > + if (flags & S_ATIME) > + inode->i_atime = *now; > + return btrfs_dirty_inode(inode); > } > > /* > @@ -6405,7 +6377,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) > > ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); > if (!ret) > - ret = btrfs_update_time(vma->vm_file); > + ret = file_update_time(vma->vm_file); > if (ret) { > if (ret == -ENOMEM) > ret = VM_FAULT_OOM; > @@ -7451,6 +7423,7 @@ static const struct inode_operations btrfs_file_inode_operations = { > .permission = btrfs_permission, > .fiemap = btrfs_fiemap, > .get_acl = btrfs_get_acl, > + .update_time = btrfs_update_time, > }; > static const struct inode_operations btrfs_special_inode_operations = { > .getattr = btrfs_getattr, > @@ -7461,6 +7434,7 @@ static const struct inode_operations btrfs_special_inode_operations = { > .listxattr = btrfs_listxattr, > .removexattr = btrfs_removexattr, > .get_acl = btrfs_get_acl, > + .update_time = btrfs_update_time, > }; > static const struct inode_operations btrfs_symlink_inode_operations = { > .readlink = generic_readlink, > @@ -7474,6 +7448,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { > .listxattr = btrfs_listxattr, > .removexattr = btrfs_removexattr, > .get_acl = btrfs_get_acl, > + .update_time = btrfs_update_time, > }; > > const struct dentry_operations btrfs_dentry_operations = { > -- > 1.7.5.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html