Consider 'all zeroes' shrinker as 'initialized, but not registered', and, thus, don't unregister such a shrinker. This helps to avoid accidental NULL pointer dereferences, when a zeroed shrinker struct is getting passed to unregister_shrinker() in error handing path, for example.
Signed-off-by: Sergey Senozhatsky <sergey.senozhat...@gmail.com> --- mm/vmscan.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm/vmscan.c b/mm/vmscan.c index c8d8282..cadc8a2 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -254,6 +254,12 @@ EXPORT_SYMBOL(register_shrinker); */ void unregister_shrinker(struct shrinker *shrinker) { + /* + * All-zeroes is 'initialized, but not registered' shrinker. + */ + if (unlikely(!shrinker->list.next)) + return; + down_write(&shrinker_rwsem); list_del(&shrinker->list); up_write(&shrinker_rwsem); -- 2.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/