return ret;
 }
 
-static struct shrinker nfsd_file_shrinker = {
-       .scan_objects = nfsd_file_lru_scan,
-       .count_objects = nfsd_file_lru_count,
-       .seeks = 1,
-};
+static struct shrinker *nfsd_file_shrinker;
 
 /**
  * nfsd_file_cond_queue - conditionally unhash and queue a nfsd_file
                goto out_err;
        }
 
-       ret = register_shrinker(&nfsd_file_shrinker, "nfsd-filecache");
-       if (ret) {
-               pr_err("nfsd: failed to register nfsd_file_shrinker: %d\n", ret);
+       nfsd_file_shrinker = shrinker_alloc(0, "nfsd-filecache");
+       if (!nfsd_file_shrinker) {
+               ret = -ENOMEM;
+               pr_err("nfsd: failed to allocate nfsd_file_shrinker\n");
                goto out_lru;
        }
 
+       nfsd_file_shrinker->count_objects = nfsd_file_lru_count;
+       nfsd_file_shrinker->scan_objects = nfsd_file_lru_scan;
+       nfsd_file_shrinker->seeks = 1;
+
+       shrinker_register(nfsd_file_shrinker);
+
        ret = lease_register_notifier(&nfsd_file_lease_notifier);
        if (ret) {
                pr_err("nfsd: unable to register lease notifier: %d\n", ret);
 out_notifier:
        lease_unregister_notifier(&nfsd_file_lease_notifier);
 out_shrinker:
-       unregister_shrinker(&nfsd_file_shrinker);
+       shrinker_free(nfsd_file_shrinker);
 out_lru:
        list_lru_destroy(&nfsd_file_lru);
 out_err:
                return;
 
        lease_unregister_notifier(&nfsd_file_lease_notifier);
-       unregister_shrinker(&nfsd_file_shrinker);
+       shrinker_free(nfsd_file_shrinker);
        /*
         * make sure all callers of nfsd_file_lru_cb are done before
         * calling nfsd_file_cache_purge