mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 13:06:59 +02:00
vfs-6.14-rc7.fixes
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCZ9Ke9AAKCRCRxhvAZXjc ojQQAQC8JuVU5KbdbARMd/gylAEd7YrSHQv/KVfLAP3p0CQkNwEAx0t0bERUa+pt V5+7YS+HY2hcvFW6GbO/MJvfiSuXxA0= =9aCX -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
8f7617f450
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user