Commit 8f7617f4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'vfs-6.14-rc7.fixes' of gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs

Pull vfs fixes from Christian Brauner:

 - Bring in an RCU pathwalk fix for afs. This is brought in as a merge
   from the vfs-6.15.shared.afs branch that needs this commit and other
   trees already depend on it.

 - Fix vboxfs unterminated string handling.

* tag 'vfs-6.14-rc7.fixes' of gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs:
  vboxsf: Add __nonstring annotations for unterminated strings
  afs: Fix afs_atcell_get_link() to handle RCU pathwalk
parents b7f94fcf 986a6f5e
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -64,7 +64,8 @@ static struct afs_cell *afs_find_cell_locked(struct afs_net *net,
		return ERR_PTR(-ENAMETOOLONG);

	if (!name) {
		cell = net->ws_cell;
		cell = rcu_dereference_protected(net->ws_cell,
						 lockdep_is_held(&net->cells_lock));
		if (!cell)
			return ERR_PTR(-EDESTADDRREQ);
		goto found;
@@ -388,8 +389,8 @@ int afs_cell_init(struct afs_net *net, const char *rootcell)
	/* install the new cell */
	down_write(&net->cells_lock);
	afs_see_cell(new_root, afs_cell_trace_see_ws);
	old_root = net->ws_cell;
	net->ws_cell = new_root;
	old_root = rcu_replace_pointer(net->ws_cell, new_root,
				       lockdep_is_held(&net->cells_lock));
	up_write(&net->cells_lock);

	afs_unuse_cell(net, old_root, afs_cell_trace_unuse_ws);
@@ -945,8 +946,8 @@ void afs_cell_purge(struct afs_net *net)
	_enter("");

	down_write(&net->cells_lock);
	ws = net->ws_cell;
	net->ws_cell = NULL;
	ws = rcu_replace_pointer(net->ws_cell, NULL,
				 lockdep_is_held(&net->cells_lock));
	up_write(&net->cells_lock);
	afs_unuse_cell(net, ws, afs_cell_trace_unuse_ws);

+13 −2
Original line number Diff line number Diff line
@@ -314,12 +314,23 @@ static const char *afs_atcell_get_link(struct dentry *dentry, struct inode *inod
	const char *name;
	bool dotted = vnode->fid.vnode == 3;

	if (!net->ws_cell)
	if (!dentry) {
		/* We're in RCU-pathwalk. */
		cell = rcu_dereference(net->ws_cell);
		if (dotted)
			name = cell->name - 1;
		else
			name = cell->name;
		/* Shouldn't need to set a delayed call. */
		return name;
	}

	if (!rcu_access_pointer(net->ws_cell))
		return ERR_PTR(-ENOENT);

	down_read(&net->cells_lock);

	cell = net->ws_cell;
	cell = rcu_dereference_protected(net->ws_cell, lockdep_is_held(&net->cells_lock));
	if (dotted)
		name = cell->name - 1;
	else
+1 −1
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ struct afs_net {

	/* Cell database */
	struct rb_root		cells;
	struct afs_cell		*ws_cell;
	struct afs_cell __rcu	*ws_cell;
	struct work_struct	cells_manager;
	struct timer_list	cells_timer;
	atomic_t		cells_outstanding;
+2 −2
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ static int afs_proc_rootcell_show(struct seq_file *m, void *v)

	net = afs_seq2net_single(m);
	down_read(&net->cells_lock);
	cell = net->ws_cell;
	cell = rcu_dereference_protected(net->ws_cell, lockdep_is_held(&net->cells_lock));
	if (cell)
		seq_printf(m, "%s\n", cell->name);
	up_read(&net->cells_lock);
@@ -242,7 +242,7 @@ static int afs_proc_rootcell_write(struct file *file, char *buf, size_t size)

	ret = -EEXIST;
	inode_lock(file_inode(file));
	if (!net->ws_cell)
	if (!rcu_access_pointer(net->ws_cell))
		ret = afs_cell_init(net, buf);
	else
		printk("busy\n");
+1 −2
Original line number Diff line number Diff line
@@ -21,8 +21,7 @@

#define VBOXSF_SUPER_MAGIC 0x786f4256 /* 'VBox' little endian */

static const unsigned char VBSF_MOUNT_SIGNATURE[4] = { '\000', '\377', '\376',
						       '\375' };
static const unsigned char VBSF_MOUNT_SIGNATURE[4] __nonstring = "\000\377\376\375";

static int follow_symlinks;
module_param(follow_symlinks, int, 0444);