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

Commit cc673757 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull final vfs updates from Al Viro:

 - The ->i_mutex wrappers (with small prereq in lustre)

 - a fix for too early freeing of symlink bodies on shmem (they need to
   be RCU-delayed) (-stable fodder)

 - followup to dedupe stuff merged this cycle

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  vfs: abort dedupe loop if fatal signals are pending
  make sure that freeing shmem fast symlinks is RCU-delayed
  wrappers for ->i_mutex access
  lustre: remove unused declaration
parents fa7d9a1d e62e560f
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1799,9 +1799,9 @@ static int spufs_mfc_fsync(struct file *file, loff_t start, loff_t end, int data
	struct inode *inode = file_inode(file);
	struct inode *inode = file_inode(file);
	int err = filemap_write_and_wait_range(inode->i_mapping, start, end);
	int err = filemap_write_and_wait_range(inode->i_mapping, start, end);
	if (!err) {
	if (!err) {
		mutex_lock(&inode->i_mutex);
		inode_lock(inode);
		err = spufs_mfc_flush(file, NULL);
		err = spufs_mfc_flush(file, NULL);
		mutex_unlock(&inode->i_mutex);
		inode_unlock(inode);
	}
	}
	return err;
	return err;
}
}
+6 −6
Original line number Original line Diff line number Diff line
@@ -163,7 +163,7 @@ static void spufs_prune_dir(struct dentry *dir)
{
{
	struct dentry *dentry, *tmp;
	struct dentry *dentry, *tmp;


	mutex_lock(&d_inode(dir)->i_mutex);
	inode_lock(d_inode(dir));
	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
		spin_lock(&dentry->d_lock);
		spin_lock(&dentry->d_lock);
		if (simple_positive(dentry)) {
		if (simple_positive(dentry)) {
@@ -180,7 +180,7 @@ static void spufs_prune_dir(struct dentry *dir)
		}
		}
	}
	}
	shrink_dcache_parent(dir);
	shrink_dcache_parent(dir);
	mutex_unlock(&d_inode(dir)->i_mutex);
	inode_unlock(d_inode(dir));
}
}


/* Caller must hold parent->i_mutex */
/* Caller must hold parent->i_mutex */
@@ -225,9 +225,9 @@ static int spufs_dir_close(struct inode *inode, struct file *file)
	parent = d_inode(dir->d_parent);
	parent = d_inode(dir->d_parent);
	ctx = SPUFS_I(d_inode(dir))->i_ctx;
	ctx = SPUFS_I(d_inode(dir))->i_ctx;


	mutex_lock_nested(&parent->i_mutex, I_MUTEX_PARENT);
	inode_lock_nested(parent, I_MUTEX_PARENT);
	ret = spufs_rmdir(parent, dir);
	ret = spufs_rmdir(parent, dir);
	mutex_unlock(&parent->i_mutex);
	inode_unlock(parent);
	WARN_ON(ret);
	WARN_ON(ret);


	return dcache_dir_close(inode, file);
	return dcache_dir_close(inode, file);
@@ -270,7 +270,7 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,
	inode->i_op = &simple_dir_inode_operations;
	inode->i_op = &simple_dir_inode_operations;
	inode->i_fop = &simple_dir_operations;
	inode->i_fop = &simple_dir_operations;


	mutex_lock(&inode->i_mutex);
	inode_lock(inode);


	dget(dentry);
	dget(dentry);
	inc_nlink(dir);
	inc_nlink(dir);
@@ -291,7 +291,7 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,
	if (ret)
	if (ret)
		spufs_rmdir(dir, dentry);
		spufs_rmdir(dir, dentry);


	mutex_unlock(&inode->i_mutex);
	inode_unlock(inode);


	return ret;
	return ret;
}
}
+4 −4
Original line number Original line Diff line number Diff line
@@ -67,7 +67,7 @@ static void hypfs_remove(struct dentry *dentry)
	struct dentry *parent;
	struct dentry *parent;


	parent = dentry->d_parent;
	parent = dentry->d_parent;
	mutex_lock(&d_inode(parent)->i_mutex);
	inode_lock(d_inode(parent));
	if (simple_positive(dentry)) {
	if (simple_positive(dentry)) {
		if (d_is_dir(dentry))
		if (d_is_dir(dentry))
			simple_rmdir(d_inode(parent), dentry);
			simple_rmdir(d_inode(parent), dentry);
@@ -76,7 +76,7 @@ static void hypfs_remove(struct dentry *dentry)
	}
	}
	d_delete(dentry);
	d_delete(dentry);
	dput(dentry);
	dput(dentry);
	mutex_unlock(&d_inode(parent)->i_mutex);
	inode_unlock(d_inode(parent));
}
}


static void hypfs_delete_tree(struct dentry *root)
static void hypfs_delete_tree(struct dentry *root)
@@ -331,7 +331,7 @@ static struct dentry *hypfs_create_file(struct dentry *parent, const char *name,
	struct dentry *dentry;
	struct dentry *dentry;
	struct inode *inode;
	struct inode *inode;


	mutex_lock(&d_inode(parent)->i_mutex);
	inode_lock(d_inode(parent));
	dentry = lookup_one_len(name, parent, strlen(name));
	dentry = lookup_one_len(name, parent, strlen(name));
	if (IS_ERR(dentry)) {
	if (IS_ERR(dentry)) {
		dentry = ERR_PTR(-ENOMEM);
		dentry = ERR_PTR(-ENOMEM);
@@ -359,7 +359,7 @@ static struct dentry *hypfs_create_file(struct dentry *parent, const char *name,
	d_instantiate(dentry, inode);
	d_instantiate(dentry, inode);
	dget(dentry);
	dget(dentry);
fail:
fail:
	mutex_unlock(&d_inode(parent)->i_mutex);
	inode_unlock(d_inode(parent));
	return dentry;
	return dentry;
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -455,12 +455,12 @@ static int blkdev_daxset(struct block_device *bdev, unsigned long argp)
	if (arg && !blkdev_dax_capable(bdev))
	if (arg && !blkdev_dax_capable(bdev))
		return -ENOTTY;
		return -ENOTTY;


	mutex_lock(&bdev->bd_inode->i_mutex);
	inode_lock(bdev->bd_inode);
	if (bdev->bd_map_count == 0)
	if (bdev->bd_map_count == 0)
		inode_set_flags(bdev->bd_inode, arg, S_DAX);
		inode_set_flags(bdev->bd_inode, arg, S_DAX);
	else
	else
		rc = -EBUSY;
		rc = -EBUSY;
	mutex_unlock(&bdev->bd_inode->i_mutex);
	inode_unlock(bdev->bd_inode);
	return rc;
	return rc;
}
}
#else
#else
+6 −6
Original line number Original line Diff line number Diff line
@@ -215,9 +215,9 @@ static int handle_create(const char *nodename, umode_t mode, kuid_t uid,
		newattrs.ia_uid = uid;
		newattrs.ia_uid = uid;
		newattrs.ia_gid = gid;
		newattrs.ia_gid = gid;
		newattrs.ia_valid = ATTR_MODE|ATTR_UID|ATTR_GID;
		newattrs.ia_valid = ATTR_MODE|ATTR_UID|ATTR_GID;
		mutex_lock(&d_inode(dentry)->i_mutex);
		inode_lock(d_inode(dentry));
		notify_change(dentry, &newattrs, NULL);
		notify_change(dentry, &newattrs, NULL);
		mutex_unlock(&d_inode(dentry)->i_mutex);
		inode_unlock(d_inode(dentry));


		/* mark as kernel-created inode */
		/* mark as kernel-created inode */
		d_inode(dentry)->i_private = &thread;
		d_inode(dentry)->i_private = &thread;
@@ -244,7 +244,7 @@ static int dev_rmdir(const char *name)
		err = -ENOENT;
		err = -ENOENT;
	}
	}
	dput(dentry);
	dput(dentry);
	mutex_unlock(&d_inode(parent.dentry)->i_mutex);
	inode_unlock(d_inode(parent.dentry));
	path_put(&parent);
	path_put(&parent);
	return err;
	return err;
}
}
@@ -321,9 +321,9 @@ static int handle_remove(const char *nodename, struct device *dev)
			newattrs.ia_mode = stat.mode & ~0777;
			newattrs.ia_mode = stat.mode & ~0777;
			newattrs.ia_valid =
			newattrs.ia_valid =
				ATTR_UID|ATTR_GID|ATTR_MODE;
				ATTR_UID|ATTR_GID|ATTR_MODE;
			mutex_lock(&d_inode(dentry)->i_mutex);
			inode_lock(d_inode(dentry));
			notify_change(dentry, &newattrs, NULL);
			notify_change(dentry, &newattrs, NULL);
			mutex_unlock(&d_inode(dentry)->i_mutex);
			inode_unlock(d_inode(dentry));
			err = vfs_unlink(d_inode(parent.dentry), dentry, NULL);
			err = vfs_unlink(d_inode(parent.dentry), dentry, NULL);
			if (!err || err == -ENOENT)
			if (!err || err == -ENOENT)
				deleted = 1;
				deleted = 1;
@@ -332,7 +332,7 @@ static int handle_remove(const char *nodename, struct device *dev)
		err = -ENOENT;
		err = -ENOENT;
	}
	}
	dput(dentry);
	dput(dentry);
	mutex_unlock(&d_inode(parent.dentry)->i_mutex);
	inode_unlock(d_inode(parent.dentry));


	path_put(&parent);
	path_put(&parent);
	if (deleted && strchr(nodename, '/'))
	if (deleted && strchr(nodename, '/'))
Loading