Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33710784 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "fuse: make sure reclaim doesn't write the inode"

parents 156f8ff5 40c4f6fd
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -705,11 +705,19 @@ static int fuse_symlink(struct inode *dir, struct dentry *entry,
	return create_new_entry(fc, &args, dir, entry, S_IFLNK);
}

void fuse_flush_time_update(struct inode *inode)
{
	int err = sync_inode_metadata(inode, 1);

	mapping_set_error(inode->i_mapping, err);
}

void fuse_update_ctime(struct inode *inode)
{
	if (!IS_NOCMTIME(inode)) {
		inode->i_ctime = current_time(inode);
		mark_inode_dirty_sync(inode);
		fuse_flush_time_update(inode);
	}
}

+13 −0
Original line number Diff line number Diff line
@@ -1621,6 +1621,17 @@ int fuse_write_inode(struct inode *inode, struct writeback_control *wbc)
	struct fuse_file *ff;
	int err;

	/*
	 * Inode is always written before the last reference is dropped and
	 * hence this should not be reached from reclaim.
	 *
	 * Writing back the inode from reclaim can deadlock if the request
	 * processing itself needs an allocation.  Allocations triggering
	 * reclaim while serving a request can't be prevented, because it can
	 * involve any number of unrelated userspace processes.
	 */
	WARN_ON(wbc->for_reclaim);

	ff = __fuse_write_file_get(fc, fi);
	err = fuse_flush_times(inode, ff);
	if (ff)
@@ -3035,6 +3046,8 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
	if (lock_inode)
		inode_unlock(inode);

	fuse_flush_time_update(inode);

	return err;
}

+1 −0
Original line number Diff line number Diff line
@@ -924,6 +924,7 @@ int fuse_allow_current_process(struct fuse_conn *fc);

u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id);

void fuse_flush_time_update(struct inode *inode);
void fuse_update_ctime(struct inode *inode);

int fuse_update_attributes(struct inode *inode, struct file *file);
+3 −0
Original line number Diff line number Diff line
@@ -128,6 +128,9 @@ static void fuse_destroy_inode(struct inode *inode)

static void fuse_evict_inode(struct inode *inode)
{
	/* Will write inode on close/munmap and in all other dirtiers */
	WARN_ON(inode->i_state & I_DIRTY_INODE);

	truncate_inode_pages_final(&inode->i_data);
	clear_inode(inode);
	if (inode->i_sb->s_flags & SB_ACTIVE) {