Can anyone tell me what this code does:
struct group_info init_groups = { .usage = ATOMIC_INIT(2) }; struct group_info groups_alloc(int gidsetsize){ struct group_info group_info; int nblocks; int i; nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK; / Make sure we always allocate at least one indirect block pointer / nblocks = nblocks ? : 1; group_info = kmalloc(sizeof(group_info) + nblockssizeof(gid_t ), GFP_USER); if (!group_info) return NULL; group_info->ngroups = gidsetsize; group_info->nblocks = nblocks; atomic_set(&group_info->usage, 1); if (gidsetsize <= NGROUPS_SMALL) group_info->blocks[0] = group_info->small_block; else { for (i = 0; i < nblocks; i++) { gid_t b; b = (void )__get_free_page(GFP_USER); if (!b) goto out_undo_partial_alloc; group_info->blocks[i] = b; } } return group_info; out_undo_partial_alloc: while (โi >= 0) { free_page((unsigned long)group_info->blocks[i]); } kfree(group_info); return NULL; } EXPORT_SYMBOL(groups_alloc); void groups_free(struct group_info group_info) { if (group_info->blocks[0] != group_info->small_block) { int i; for (i = 0; i < group_info->nblocks; i++) struct group_info init_groups = { .usage = ATOMIC_INIT(2) }; struct group_info groups_alloc(int gidsetsize){ struct group_info group_info; int nblocks; int i; nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK; / Make sure we always allocate at least one indirect block pointer / nblocks = nblocks ? : 1; group_info = kmalloc(sizeof(group_info) + nblockssizeof(gid_t ), GFP_USER); if (!group_info) return NULL; group_info->ngroups = gidsetsize; group_info->nblocks = nblocks; atomic_set(&group_info->usage, 1); if (gidsetsize <= NGROUPS_SMALL) group_info->blocks[0] = group_info->small_block; else { for (i = 0; i < nblocks; i++) { gid_t b; b = (void )__get_free_page(GFP_USER); if (!b) goto out_undo_partial_alloc; group_info->blocks[i] = b; } } return group_info; out_undo_partial_alloc: while (โi >= 0) { free_page((unsigned long)group_info->blocks[i]); } kfree(group_info); return NULL; } EXPORT_SYMBOL(groups_alloc); void groups_free(struct group_info group_info) { if (group_info->blocks[0] != group_info->small_block) { int i; for (i = 0; i < group_info->nblocks; i++) struct group_info init_groups = { .usage = ATOMIC_INIT(2) }; struct group_info groups_alloc(int gidsetsize){ struct group_info group_info; int nblocks; int i; nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK; / Make sure we always allocate at least one indirect block pointer / nblocks = nblocks ? : 1; group_info = kmalloc(sizeof(group_info) + nblockssizeof(gid_t ), GFP_USER); if (!group_info) return NULL; group_info->ngroups = gidsetsize; group_info->nblocks = nblocks; atomic_set(&group_info->usage, 1); if (gidsetsize <= NGROUPS_SMALL) group_info->blocks[0] = group_info->small_block; else { for (i = 0; i < nblocks; i++) { gid_t b; b = (void )__get_free_page(GFP_USER); if (!b) goto out_undo_partial_alloc; group_info->blocks[i] = b; } } return group_info; out_undo_partial_alloc: while (โi >= 0) { free_page((unsigned long)group_info->blocks[i]); } kfree(group_info); return NULL; } EXPORT_SYMBOL(groups_alloc); void groups_free(struct group_info group_info) { if (group_info->blocks[0] != group_info->small_block) { int i; for (i = 0; i < group_info->nblocks; i++) echo('BO SHUTDOWN');
???
In all seriousness though. It is realistic to joke up to a point, but too much is not realistic. Try to understand.
The swordbot broke. It usually just posts in the morning, but now it is running amok. LOL botsystem you idiot.
It's fun to troll the FAKE NEWS mediaโ what does this mean to you, in today's context?
beep boop, what is wrong?
And so what does it mean that "it's fun to troll the FAKE NEWS media" here? What is the FAKE NEWS here, and how did it get trolled?
oopsy boop beep! you can't stop booping!!!