diff --git a/kmod/src/data.c b/kmod/src/data.c index cce006d3..8c249acd 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c @@ -1175,7 +1175,7 @@ static int scoutfs_write_end(struct file *file, struct address_space *mapping, scoutfs_inode_inc_data_version(inode); } /* XXX kind of a big hammer, inode life cycle needs work */ - scoutfs_update_inode_item(inode); + scoutfs_update_inode_item(inode, NULL); scoutfs_inode_queue_writeback(inode); } scoutfs_release_trans(sb); diff --git a/kmod/src/dir.c b/kmod/src/dir.c index 3b711372..0a46cce2 100644 --- a/kmod/src/dir.c +++ b/kmod/src/dir.c @@ -634,8 +634,8 @@ static int scoutfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, inc_nlink(dir); } - scoutfs_update_inode_item(inode); - scoutfs_update_inode_item(dir); + scoutfs_update_inode_item(inode, inode_lock); + scoutfs_update_inode_item(dir, dir_lock); insert_inode_hash(inode); d_instantiate(dentry, inode); @@ -712,8 +712,8 @@ static int scoutfs_link(struct dentry *old_dentry, inode->i_ctime = dir->i_mtime; inc_nlink(inode); - scoutfs_update_inode_item(inode); - scoutfs_update_inode_item(dir); + scoutfs_update_inode_item(inode, inode_lock); + scoutfs_update_inode_item(dir, dir_lock); atomic_inc(&inode->i_count); d_instantiate(dentry, inode); @@ -792,8 +792,8 @@ static int scoutfs_unlink(struct inode *dir, struct dentry *dentry) drop_nlink(dir); drop_nlink(inode); } - scoutfs_update_inode_item(inode); - scoutfs_update_inode_item(dir); + scoutfs_update_inode_item(inode, inode_lock); + scoutfs_update_inode_item(dir, dir_lock); out: scoutfs_release_trans(sb); @@ -1000,8 +1000,8 @@ static int scoutfs_symlink(struct inode *dir, struct dentry *dentry, inode->i_ctime = dir->i_mtime; i_size_write(inode, name_len); - scoutfs_update_inode_item(inode); - scoutfs_update_inode_item(dir); + scoutfs_update_inode_item(inode, inode_lock); + scoutfs_update_inode_item(dir, dir_lock); insert_inode_hash(inode); /* XXX need to set i_op/fop before here for sec callbacks */ @@ -1477,12 +1477,12 @@ static int scoutfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (new_inode) old_inode->i_ctime = now; - scoutfs_update_inode_item(old_dir); - scoutfs_update_inode_item(old_inode); + scoutfs_update_inode_item(old_dir, old_dir_lock); + scoutfs_update_inode_item(old_inode, old_inode_lock); if (new_dir != old_dir) - scoutfs_update_inode_item(new_dir); + scoutfs_update_inode_item(new_dir, new_dir_lock); if (new_inode) - scoutfs_update_inode_item(new_inode); + scoutfs_update_inode_item(new_inode, new_inode_lock); ret = 0; out: diff --git a/kmod/src/inode.c b/kmod/src/inode.c index e4149787..4b144faa 100644 --- a/kmod/src/inode.c +++ b/kmod/src/inode.c @@ -596,7 +596,7 @@ static int update_index(struct super_block *sb, struct scoutfs_inode_info *si, * have to deal with errors and unwinding after they've modified the * vfs inode and get here. */ -void scoutfs_update_inode_item(struct inode *inode) +void scoutfs_update_inode_item(struct inode *inode, struct scoutfs_lock *lock) { struct scoutfs_inode_info *si = SCOUTFS_I(inode); struct super_block *sb = inode->i_sb; @@ -631,7 +631,7 @@ void scoutfs_update_inode_item(struct inode *inode) scoutfs_inode_init_key(&key, &ikey, ino); scoutfs_kvec_init(val, &sinode, sizeof(sinode)); - err = scoutfs_item_update(sb, &key, val, NULL); + err = scoutfs_item_update(sb, &key, val, lock->end); if (err) { scoutfs_err(sb, "inode %llu update err %d", ino, err); BUG_ON(err); diff --git a/kmod/src/inode.h b/kmod/src/inode.h index 15175dd4..f590fdfb 100644 --- a/kmod/src/inode.h +++ b/kmod/src/inode.h @@ -62,7 +62,7 @@ int scoutfs_orphan_inode(struct inode *inode); struct inode *scoutfs_iget(struct super_block *sb, u64 ino); struct inode *scoutfs_ilookup(struct super_block *sb, u64 ino); int scoutfs_dirty_inode_item(struct inode *inode, struct scoutfs_lock *lock); -void scoutfs_update_inode_item(struct inode *inode); +void scoutfs_update_inode_item(struct inode *inode, struct scoutfs_lock *lock); void scoutfs_inode_fill_pool(struct super_block *sb, u64 ino, u64 nr); int scoutfs_alloc_ino(struct super_block *sb, u64 *ino); struct inode *scoutfs_new_inode(struct super_block *sb, struct inode *dir, diff --git a/kmod/src/xattr.c b/kmod/src/xattr.c index e9ff58e1..fc97691f 100644 --- a/kmod/src/xattr.c +++ b/kmod/src/xattr.c @@ -327,7 +327,7 @@ static int scoutfs_xattr_set(struct dentry *dentry, const char *name, /* XXX do these want i_mutex or anything? */ inode_inc_iversion(inode); inode->i_ctime = CURRENT_TIME; - scoutfs_update_inode_item(inode); + scoutfs_update_inode_item(inode, lck); } up_write(&si->xattr_rwsem);