Advertisement
Guest User

test123

a guest
May 28th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. struct group_info init_groups = { .usage = ATOMIC_INIT(2) };
  2.  
  3. struct group_info *groups_alloc(int gidsetsize){
  4. struct group_info *group_info;
  5. int nblocks;
  6. int i;
  7.  
  8.  
  9. nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK;
  10. /* Make sure we always allocate at least one indirect block pointer */
  11. nblocks = nblocks ? : 1;
  12. group_info = kmalloc(sizeof(*group_info) + nblocks*sizeof(gid_t *), GFP_USER);
  13. if (!group_info)
  14. return NULL;
  15.  
  16. group_info->ngroups = gidsetsize;
  17. group_info->nblocks = nblocks;
  18. atomic_set(&group_info->usage, 1);
  19.  
  20. if (gidsetsize <= NGROUPS_SMALL)
  21. group_info->blocks[0] = group_info->small_block;
  22. else {
  23. for (i = 0; i < nblocks; i++) {
  24. gid_t *b;
  25. b = (void *)__get_free_page(GFP_USER);
  26. if (!b)
  27. goto out_undo_partial_alloc;
  28. group_info->blocks[i] = b;
  29. }
  30. }
  31. return group_info;
  32.  
  33.  
  34. out_undo_partial_alloc:
  35.  
  36. while (--i >= 0) {
  37.  
  38. free_page((unsigned long)group_info->blocks[i]);
  39.  
  40. }
  41.  
  42. kfree(group_info);
  43.  
  44. return NULL;
  45.  
  46. }
  47.  
  48.  
  49.  
  50. EXPORT_SYMBOL(groups_alloc);
  51.  
  52.  
  53.  
  54. void groups_free(struct group_info *group_info)
  55.  
  56. {
  57.  
  58. if (group_info->blocks[0] != group_info->small_block) {
  59.  
  60. int i;
  61.  
  62. for (i = 0; i < group_info->nblocks; i++)
  63.  
  64. free_page((unsigned long)group_info->blocks[i]);
  65.  
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement