提交 9efcc4a1 编写于 作者: D David Howells 提交者: Linus Torvalds

afs: Fix unpinned address list during probing

When it's probing all of a fileserver's interfaces to find which one is
best to use, afs_do_probe_fileserver() takes a lock on the server record
and notes the pointer to the address list.

It doesn't, however, pin the address list, so as soon as it drops the
lock, there's nothing to stop the address list from being freed under
us.

Fix this by taking a ref on the address list inside the locked section
and dropping it at the end of the function.

Fixes: 3bf0fb6f ("afs: Probe multiple fileservers simultaneously")
Signed-off-by: NDavid Howells <dhowells@redhat.com>
Reviewed-by: NMarc Dionne <marc.dionne@auristor.com>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 60268940
...@@ -145,6 +145,7 @@ static int afs_do_probe_fileserver(struct afs_net *net, ...@@ -145,6 +145,7 @@ static int afs_do_probe_fileserver(struct afs_net *net,
read_lock(&server->fs_lock); read_lock(&server->fs_lock);
ac.alist = rcu_dereference_protected(server->addresses, ac.alist = rcu_dereference_protected(server->addresses,
lockdep_is_held(&server->fs_lock)); lockdep_is_held(&server->fs_lock));
afs_get_addrlist(ac.alist);
read_unlock(&server->fs_lock); read_unlock(&server->fs_lock);
atomic_set(&server->probe_outstanding, ac.alist->nr_addrs); atomic_set(&server->probe_outstanding, ac.alist->nr_addrs);
...@@ -163,6 +164,7 @@ static int afs_do_probe_fileserver(struct afs_net *net, ...@@ -163,6 +164,7 @@ static int afs_do_probe_fileserver(struct afs_net *net,
if (!in_progress) if (!in_progress)
afs_fs_probe_done(server); afs_fs_probe_done(server);
afs_put_addrlist(ac.alist);
return in_progress; return in_progress;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册