aboutsummaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2017-05-29 16:38:16 -0700
committerMister Oyster <oysterized@gmail.com>2017-05-31 03:21:24 +0200
commitb9ba4642b6ee483ecd1d67eb117e1915d47f258f (patch)
treea36a85e9514ab3ceb463798c61ca24e373f07a1c /fs
parent64663bc51906e7624c617158741b28d1fbce26ff (diff)
ANDROID: mnt: Fix next_descendent
next_descendent did not properly handle the case where the initial mount had no slaves. In this case, we would look for the next slave, but since don't have a master, the check for wrapping around to the start of the list will always fail. Instead, we check for this case, and ensure that we end the iteration when we come back to the root. Signed-off-by: Daniel Rosenberg <drosen@google.com> Bug: 62094374 Change-Id: I43dfcee041aa3730cb4b9a1161418974ef84812e
Diffstat (limited to 'fs')
-rw-r--r--fs/pnode.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/pnode.c b/fs/pnode.c
index 3846761a1..e8d7d680f 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -410,9 +410,14 @@ static struct mount *next_descendent(struct mount *root, struct mount *cur)
if (!IS_MNT_NEW(cur) && !list_empty(&cur->mnt_slave_list))
return first_slave(cur);
do {
- if (cur->mnt_slave.next != &cur->mnt_master->mnt_slave_list)
- return next_slave(cur);
- cur = cur->mnt_master;
+ struct mount *master = cur->mnt_master;
+
+ if (!master || cur->mnt_slave.next != &master->mnt_slave_list) {
+ struct mount *next = next_slave(cur);
+
+ return (next == root) ? NULL : next;
+ }
+ cur = master;
} while (cur != root);
return NULL;
}