652 |
ccs_free_element(ptr); |
ccs_free_element(ptr); |
653 |
} |
} |
654 |
|
|
655 |
|
/** |
656 |
|
* ccs_put_condition - Delete memory for "struct ccs_condition_list". |
657 |
|
* |
658 |
|
* @cond: Pointer to "struct ccs_condition_list". |
659 |
|
*/ |
660 |
|
void ccs_put_condition(struct ccs_condition_list *cond) |
661 |
|
{ |
662 |
|
const unsigned long *ptr; |
663 |
|
const struct ccs_argv_entry *argv; |
664 |
|
const struct ccs_envp_entry *envp; |
665 |
|
const struct ccs_symlinkp_entry *symlinkp; |
666 |
|
u16 condc; |
667 |
|
u16 argc; |
668 |
|
u16 envc; |
669 |
|
u16 symlinkc; |
670 |
|
u16 i; |
671 |
|
bool can_delete = false; |
672 |
|
if (!cond) |
673 |
|
return; |
674 |
|
/***** WRITER SECTION START *****/ |
675 |
|
down_write(&ccs_policy_lock); |
676 |
|
if (atomic_dec_and_test(&cond->users)) { |
677 |
|
list_del(&cond->list); |
678 |
|
can_delete = true; |
679 |
|
} |
680 |
|
up_write(&ccs_policy_lock); |
681 |
|
/***** WRITER SECTION END *****/ |
682 |
|
if (!can_delete) |
683 |
|
return; |
684 |
|
condc = cond->head.condc; |
685 |
|
argc = cond->head.argc; |
686 |
|
envc = cond->head.envc; |
687 |
|
symlinkc = cond->head.symlinkc; |
688 |
|
ptr = (const unsigned long *) (cond + 1); |
689 |
|
argv = (const struct ccs_argv_entry *) (ptr + condc); |
690 |
|
envp = (const struct ccs_envp_entry *) (argv + argc); |
691 |
|
symlinkp = (const struct ccs_symlinkp_entry *) (envp + envc); |
692 |
|
for (i = 0; i < argc; argv++, i++) |
693 |
|
ccs_put_name(argv->value); |
694 |
|
for (i = 0; i < envc; envp++, i++) { |
695 |
|
ccs_put_name(envp->name); |
696 |
|
ccs_put_name(envp->value); |
697 |
|
} |
698 |
|
for (i = 0; i < symlinkc; symlinkp++, i++) |
699 |
|
ccs_put_name(symlinkp->value); |
700 |
|
ccs_free_element(cond); |
701 |
|
} |
702 |
|
|
703 |
static unsigned int ccs_allocated_memory_for_savename; |
static unsigned int ccs_allocated_memory_for_savename; |
704 |
static unsigned int ccs_quota_for_savename; |
static unsigned int ccs_quota_for_savename; |
705 |
|
|
1423 |
up_write(&ccs_policy_lock); |
up_write(&ccs_policy_lock); |
1424 |
/***** WRITER SECTION END *****/ |
/***** WRITER SECTION END *****/ |
1425 |
list_for_each_entry_safe(acl, next_acl, &q_acl, list) { |
list_for_each_entry_safe(acl, next_acl, &q_acl, list) { |
1426 |
|
ccs_put_condition(acl->cond); |
1427 |
switch (ccs_acl_type1(acl)) { |
switch (ccs_acl_type1(acl)) { |
1428 |
struct ccs_single_path_acl_record *acl1; |
struct ccs_single_path_acl_record *acl1; |
1429 |
struct ccs_double_path_acl_record *acl2; |
struct ccs_double_path_acl_record *acl2; |