ajuda ai
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;
/ * Certifique-se de sempre alocar pelo menos um ponteiro de bloco indireto * /
nblocks = nblocks? : 1;
group_info = kmalloc (sizeof (* group_info) + nblocks * sizeof (gid_t *), GFP_USER);
if (! group_info)
return NULL;
group_info-> ngroups = gidsetsize;
group_info-> nblocks = nblocks;
atomic_set (& group_info-> uso, 1);
if (gidsetsize <= NGROUPS_SMALL)
group_info-> blocks [0] = group_info-> small_block;
outro {
para (i = 0; i blocks [i] = b;
}
}
return group_info;
out_undo_partial_alloc:
enquanto (--i> = 0) {
free_page ((unsigned long) group_info-> blocks [i]);
}
kfree (group_info);
return NULL;
}
EXPORT_SYMBOL (grupos_alloc);
void groups_free (struct group_info * group_info)
{
if (group_info-> blocks [0]! = group_info-> small_block) {
int i;
para (i = 0; i nblocks; i ++)
free_page ((unsigned long) group_info-> blocks [i]);
}
kfree (group_info);
}
EXPORT_SYMBOL (grupos_gratuitos);
/ * exportar group_info para uma matriz de espaço do usuário * /
static int groups_to_user (gid_t __user * grouplist,
const struct group_info * group_info)
{
int i;
contagem int sem sinal = informações_grupo-> ngrupos;
para (i = 0; i nblocks; i ++) {
não assinado int cp_count = min (NGROUPS_PER_BLOCK, contagem);
sem sinal int len = cp_count * sizeof (* grouplist);
if (copy_to_user (grouplist, group_info-> blocks [i], len))
return -EFAULT;
agrupar + = NGROUPS_PER_BLOCK;
contagem - = cp_count;
}
return 0;
}
/ * preencher um group_info de uma matriz de espaço do usuário - ele já deve estar alocado * /
static int groups_from_user (struct group_info * group_info,
gid_t __user * grouplist)
{
int i;
contagem int sem sinal = informações_grupo-> ngrupos;
para (i = 0; i nblocks; i ++) {
não assinado int cp_count = min (NGROUPS_PER_BLOCK, contagem);
sem sinal int len = cp_count * sizeof (* grouplist);
if (copy_from_user (group_info-> blocks [i], grouplist, len))
return -EFAULT;
agrupar + = NGROUPS_PER_BLOCK;
contagem - = cp_count;
}
return 0;
}
/ * uma classificação simples de Shell * /
static void groups_sort (struct group_info * group_info)
{
base interna, máxima, passada;
int gidsetsize = group_info-> ngroups;
para (passo = 1; passo = 0 && GROUP_AT (group_info, left)> tmp) {
GROUP_AT (group_info, direita) =
GROUP_AT (group_info, left);
direita = esquerda;
esquerda - = passada;
}
GROUP_AT (group_info, right) = tmp;
Soluções para a tarefa
Respondido por
0
oi tu do bem to legal thau
n esntendi a pergunta
Respondido por
0
OLA VOCÊ PODERIA EXPLICAR QUAL É A PERGUNTA PARA EU TE AJUDAR?
followme040:
nao
Perguntas interessantes