*      should not be free'd after registration. So it should not be
  *      used on stack. It can either be a global or dynamically allocated
  *      by the caller and free'd later after sysctl unregistration.
+ * @table_size : The number of elements in table
  *
  * Register a sysctl table hierarchy. @table should be a filled in ctl_table
  * array. A completely 0 filled entry terminates the table.
  */
 struct ctl_table_header *__register_sysctl_table(
        struct ctl_table_set *set,
-       const char *path, struct ctl_table *table)
+       const char *path, struct ctl_table *table, size_t table_size)
 {
        struct ctl_table_root *root = set->dir.header.root;
        struct ctl_table_header *header;
-       struct ctl_table_header h_tmp;
        struct ctl_dir *dir;
-       struct ctl_table *entry;
        struct ctl_node *node;
-       int nr_entries = 0;
-
-       h_tmp.ctl_table = table;
-       list_for_each_table_entry(entry, (&h_tmp))
-               nr_entries++;
 
        header = kzalloc(sizeof(struct ctl_table_header) +
-                        sizeof(struct ctl_node)*nr_entries, GFP_KERNEL_ACCOUNT);
+                        sizeof(struct ctl_node)*table_size, GFP_KERNEL_ACCOUNT);
        if (!header)
                return NULL;
 
        node = (struct ctl_node *)(header + 1);
-       init_header(header, root, set, node, table, nr_entries);
+       init_header(header, root, set, node, table, table_size);
        if (sysctl_check_table(path, header))
                goto fail;
 
  */
 struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table)
 {
+       int count = 0;
+       struct ctl_table *entry;
+       struct ctl_table_header t_hdr;
+
+       t_hdr.ctl_table = table;
+       list_for_each_table_entry(entry, (&t_hdr))
+               count++;
        return __register_sysctl_table(&sysctl_table_root.default_set,
-                                       path, table);
+                                       path, table, count);
 }
 EXPORT_SYMBOL(register_sysctl);
 
 
 
 struct ctl_table_header *__register_sysctl_table(
        struct ctl_table_set *set,
-       const char *path, struct ctl_table *table);
+       const char *path, struct ctl_table *table, size_t table_size);
 struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table);
 void unregister_sysctl_table(struct ctl_table_header * table);
 
 
                for (i = 0; i < UCOUNT_COUNTS; i++) {
                        tbl[i].data = &ns->ucount_max[i];
                }
-               ns->sysctls = __register_sysctl_table(&ns->set, "user", tbl);
+               ns->sysctls = __register_sysctl_table(&ns->set, "user", tbl,
+                                                     ARRAY_SIZE(user_table));
        }
        if (!ns->sysctls) {
                kfree(tbl);
 
 struct ctl_table_header *register_net_sysctl(struct net *net,
        const char *path, struct ctl_table *table)
 {
+       int count = 0;
+       struct ctl_table *entry;
+
        if (!net_eq(net, &init_net))
                ensure_safe_net_sysctl(net, path, table);
 
-       return __register_sysctl_table(&net->sysctls, path, table);
+       for (entry = table; entry->procname; entry++)
+               count++;
+
+       return __register_sysctl_table(&net->sysctls, path, table, count);
 }
 EXPORT_SYMBOL_GPL(register_net_sysctl);