|
@@ -1494,7 +1494,7 @@ static void check_and_drop(void *_data)
|
|
{
|
|
{
|
|
struct detach_data *data = _data;
|
|
struct detach_data *data = _data;
|
|
|
|
|
|
- if (!data->mountpoint && !data->select.found)
|
|
|
|
|
|
+ if (!data->mountpoint && list_empty(&data->select.dispose))
|
|
__d_drop(data->select.start);
|
|
__d_drop(data->select.start);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1536,17 +1536,15 @@ void d_invalidate(struct dentry *dentry)
|
|
|
|
|
|
d_walk(dentry, &data, detach_and_collect, check_and_drop);
|
|
d_walk(dentry, &data, detach_and_collect, check_and_drop);
|
|
|
|
|
|
- if (data.select.found)
|
|
|
|
|
|
+ if (!list_empty(&data.select.dispose))
|
|
shrink_dentry_list(&data.select.dispose);
|
|
shrink_dentry_list(&data.select.dispose);
|
|
|
|
+ else if (!data.mountpoint)
|
|
|
|
+ return;
|
|
|
|
|
|
if (data.mountpoint) {
|
|
if (data.mountpoint) {
|
|
detach_mounts(data.mountpoint);
|
|
detach_mounts(data.mountpoint);
|
|
dput(data.mountpoint);
|
|
dput(data.mountpoint);
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (!data.mountpoint && !data.select.found)
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
cond_resched();
|
|
cond_resched();
|
|
}
|
|
}
|
|
}
|
|
}
|