gen_lists.h File Reference

#include <linux/init.h>
#include <rsbac/rkmem.h>
#include <rsbac/lists.h>
#include <rsbac/repl_lists.h>

Go to the source code of this file.

Defines

#define RSBAC_LIST_DISK_VERSION   10003
#define RSBAC_LIST_DISK_OLD_VERSION   10002
#define RSBAC_LIST_NONAME   "(no name)"
#define RSBAC_LIST_PROC_NAME   "gen_lists"
#define RSBAC_LIST_TA_KEY   0xface99

Typedefs

typedef __u32 rsbac_list_count_t

Functions

int __init rsbac_list_init (void)
int rsbac_list_mount (kdev_t kdev)
int rsbac_list_umount (kdev_t kdev)
int rsbac_check_lists (int correct)


Define Documentation

#define RSBAC_LIST_DISK_OLD_VERSION   10002
 

Definition at line 17 of file gen_lists.h.

Referenced by read_list(), and read_lol_list().

#define RSBAC_LIST_DISK_VERSION   10003
 

Definition at line 16 of file gen_lists.h.

Referenced by fill_buffer(), fill_lol_buffer(), read_list(), and read_lol_list().

#define RSBAC_LIST_NONAME   "(no name)"
 

Definition at line 18 of file gen_lists.h.

Referenced by create_lol_reg(), and create_reg().

#define RSBAC_LIST_PROC_NAME   "gen_lists"
 

Definition at line 19 of file gen_lists.h.

Referenced by rsbac_list_init().

#define RSBAC_LIST_TA_KEY   0xface99
 

Definition at line 21 of file gen_lists.h.

Referenced by rsbac_list_init().


Typedef Documentation

typedef __u32 rsbac_list_count_t
 

Definition at line 73 of file gen_lists.h.


Function Documentation

int rsbac_check_lists int  correct  ) 
 

Definition at line 5429 of file gen_lists.c.

References rsbac_list_lol_reg_item_t::count, rsbac_list_lol_item_t::count, rsbac_list_reg_item_t::count, rsbac_list_lol_info_t::data_size, rsbac_list_info_t::data_size, rsbac_list_lol_reg_item_t::def_data, rsbac_list_reg_item_t::def_data, rsbac_list_lol_reg_item_t::def_subdata, rsbac_list_lol_info_t::desc_size, rsbac_list_info_t::desc_size, rsbac_list_lol_reg_item_t::device, rsbac_list_reg_item_t::device, rsbac_list_lol_reg_item_t::dirty, rsbac_list_reg_item_t::dirty, do_remove_item(), do_remove_lol_item(), do_remove_lol_subitem(), rsbac_list_lol_reg_item_t::flags, rsbac_list_reg_item_t::flags, rsbac_list_lol_reg_item_t::head, rsbac_list_lol_reg_head_t::head, rsbac_list_reg_item_t::head, rsbac_list_reg_head_t::head, rsbac_list_lol_reg_item_t::info, rsbac_list_reg_item_t::info, list_initialized, rsbac_list_lol_reg_item_t::lock, rsbac_list_lol_reg_head_t::lock, rsbac_list_reg_item_t::lock, rsbac_list_reg_head_t::lock, rsbac_list_lol_item_t::max_age, rsbac_list_item_t::max_age, rsbac_list_lol_reg_item_t::name, rsbac_list_reg_item_t::name, rsbac_list_lol_reg_item_t::next, rsbac_list_lol_item_t::next, rsbac_list_reg_item_t::next, rsbac_list_item_t::next, RSBAC_ENOTINITIALIZED, RSBAC_LIST_DEF_DATA, RSBAC_LIST_PERSIST, rsbac_printk(), rsbac_list_lol_info_t::subdata_size, and rsbac_list_lol_info_t::subdesc_size.

Referenced by rsbac_do_init(), and sys_rsbac_check().

05430   {
05431     struct rsbac_list_reg_item_t     * list;
05432     struct rsbac_list_lol_reg_item_t * lol_list;
05433     struct rsbac_list_item_t         * item_p;
05434     struct rsbac_list_item_t         * next_item_p;
05435     struct rsbac_list_lol_item_t     * lol_item_p;
05436     struct rsbac_list_lol_item_t     * next_lol_item_p;
05437     struct rsbac_list_item_t         * lol_subitem_p;
05438     struct rsbac_list_item_t         * next_lol_subitem_p;
05439            u_long                      lock_flags, rlock_flags;
05440            u_long                      tmp_count;
05441            u_long                      tmp_subcount;
05442            u_long                      subitem_count;
05443            u_long                      dirty = 0;
05444 
05445 #ifdef CONFIG_RSBAC_DEBUG
05446     if(rsbac_debug_lists)
05447       {
05448         rsbac_printk(KERN_DEBUG "rsbac_check_lists() called.\n");
05449       }
05450 #endif
05451     if(!list_initialized)
05452       return -RSBAC_ENOTINITIALIZED;
05453     rsbac_read_lock(&reg_head.lock, &rlock_flags);
05454     list = reg_head.head;
05455     while(list)
05456       {
05457         /* check list */
05458         rsbac_write_lock(&list->lock, &lock_flags);
05459         tmp_count = 0;
05460         item_p = list->head;
05461         while(item_p)
05462           {
05463             if(   (   item_p->max_age
05464                    && (item_p->max_age <= RSBAC_CURRENT_TIME)
05465                   )
05466                || (   list->def_data
05467                    && !memcmp(((char *) item_p) + sizeof(*item_p) + list->info.desc_size,
05468                               list->def_data,
05469                               list->info.data_size)
05470                   )
05471               )
05472               {
05473                 next_item_p = item_p->next;
05474                 do_remove_item(list, item_p);
05475                 item_p = next_item_p;
05476               }
05477             else
05478               {
05479                 tmp_count++;
05480                 item_p = item_p->next;
05481               }
05482           }
05483         if(tmp_count != list->count)
05484           {
05485             if(correct)
05486               {
05487                 rsbac_printk(KERN_WARNING
05488                        "rsbac_check_lists(): correcting count mismatch for list %s on device %02u:%02u - was %u, counted %lu!\n",
05489                        list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count, tmp_count);
05490                 list->count = tmp_count;
05491               }
05492             else
05493               {
05494                 rsbac_printk(KERN_WARNING
05495                        "rsbac_check_lists(): count mismatch for list %s on device %02u:%02u - is %u, counted %lu!\n",
05496                        list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count, tmp_count);
05497               }
05498           }
05499         rsbac_write_unlock(&list->lock, &lock_flags);
05500         if(list->dirty && (list->flags & RSBAC_LIST_PERSIST))
05501           {
05502             dirty++;
05503 #ifdef CONFIG_RSBAC_DEBUG
05504             if(rsbac_debug_lists)
05505               {
05506                 rsbac_printk(KERN_DEBUG
05507                        "rsbac_check_lists(): %s on %02u:%02u has %u items (list is dirty)\n",
05508                        list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count);
05509               }
05510 #endif
05511           }
05512 #ifdef CONFIG_RSBAC_DEBUG
05513         else
05514           {
05515             if(rsbac_debug_lists)
05516               {
05517                 rsbac_printk(KERN_DEBUG
05518                        "rsbac_check_lists(): %s on %02u:%02u has %u items\n",
05519                        list->name, RSBAC_MAJOR(list->device), RSBAC_MINOR(list->device), list->count);
05520               }
05521           }
05522 #endif
05523         list = list->next;
05524       }
05525     rsbac_read_unlock(&reg_head.lock, &rlock_flags);
05526 
05527     rsbac_read_lock(&lol_reg_head.lock, &rlock_flags);
05528     lol_list = lol_reg_head.head;
05529     while(lol_list)
05530       {
05531         /* check list */
05532         rsbac_write_lock(&lol_list->lock, &lock_flags);
05533         tmp_count = 0;
05534         subitem_count = 0;
05535         lol_item_p = lol_list->head;
05536         while(lol_item_p)
05537           {
05538             if(   (   lol_item_p->max_age
05539                    && (lol_item_p->max_age <= RSBAC_CURRENT_TIME)
05540                   )
05541                || (   lol_list->def_data
05542                    && !lol_item_p->count
05543                    && !memcmp(((char *) lol_item_p) + sizeof(*lol_item_p) + lol_list->info.desc_size,
05544                               lol_list->def_data,
05545                               lol_list->info.data_size)
05546                   )
05547                || (   !lol_list->info.data_size
05548                    && (lol_list->flags & RSBAC_LIST_DEF_DATA)
05549                    && !lol_item_p->count
05550                   )
05551               )
05552               {
05553                 next_lol_item_p = lol_item_p->next;
05554                 do_remove_lol_item(lol_list, lol_item_p);
05555                 lol_item_p = next_lol_item_p;
05556               }
05557             else
05558               {
05559                 tmp_count++;
05560                 tmp_subcount = 0;
05561                 lol_subitem_p = lol_item_p->head;
05562                 while(lol_subitem_p)
05563                   {
05564                     if(   (   lol_subitem_p->max_age
05565                            && (lol_subitem_p->max_age <= RSBAC_CURRENT_TIME)
05566                           )
05567                        || (   lol_list->def_subdata
05568                            && !memcmp(((char *) lol_subitem_p) + sizeof(*lol_subitem_p) + lol_list->info.subdesc_size,
05569                                       lol_list->def_subdata,
05570                                       lol_list->info.subdata_size)
05571                           )
05572                       )
05573                       {
05574                         next_lol_subitem_p = lol_subitem_p->next;
05575                         do_remove_lol_subitem(lol_item_p, lol_subitem_p);
05576                         lol_subitem_p = next_lol_subitem_p;
05577                       }
05578                     else
05579                       {
05580                         tmp_subcount++;
05581                         lol_subitem_p = lol_subitem_p->next;
05582                       }
05583                   }
05584                 if(tmp_subcount != lol_item_p->count)
05585                   {
05586                     if(correct)
05587                       {
05588                         rsbac_printk(KERN_WARNING
05589                                "rsbac_check_lists(): correcting count mismatch for list of lists %s sublist on %02u:%02u - was %lu, counted %lu!\n",
05590                                lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_item_p->count, tmp_subcount);
05591                         lol_item_p->count = tmp_subcount;
05592                       }
05593                     else
05594                       {
05595                         rsbac_printk(KERN_WARNING
05596                                "rsbac_check_lists(): count mismatch for list of lists %s sublist on %02u:%02u - is %lu, counted %lu!\n",
05597                                lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_item_p->count, tmp_subcount);
05598                       }
05599                   }
05600                 subitem_count += lol_item_p->count;
05601                 lol_item_p = lol_item_p->next;
05602               }
05603           }
05604         if(tmp_count != lol_list->count)
05605           {
05606             if(correct)
05607               {
05608                 rsbac_printk(KERN_WARNING
05609                        "rsbac_check_lists(): correcting count mismatch for list of lists %s on %02u:%02u - was %u, counted %lu!\n",
05610                        lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, tmp_count);
05611                 lol_list->count = tmp_count;
05612               }
05613             else
05614               {
05615                 rsbac_printk(KERN_WARNING
05616                        "rsbac_check_lists(): count mismatch for list of lists %s on %02u:%02u - is %u, counted %lu!\n",
05617                        lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, tmp_count);
05618               }
05619           }
05620         rsbac_write_unlock(&lol_list->lock, &lock_flags);
05621         if(lol_list->dirty && (lol_list->flags & RSBAC_LIST_PERSIST))
05622           {
05623             dirty++;
05624 #ifdef CONFIG_RSBAC_DEBUG
05625             if(rsbac_debug_lists)
05626               {
05627                 rsbac_printk(KERN_DEBUG
05628                        "rsbac_check_lists(): %s on %02u:%02u has %u items and %lu subitems (list is dirty)\n",
05629                        lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, subitem_count);
05630               }
05631 #endif
05632           }
05633 #ifdef CONFIG_RSBAC_DEBUG
05634         else
05635           {
05636             if(rsbac_debug_lists)
05637               {
05638                 rsbac_printk(KERN_DEBUG
05639                        "rsbac_check_lists(): %s on %02u:%02u has %u items and %lu subitems\n",
05640                        lol_list->name, RSBAC_MAJOR(lol_list->device), RSBAC_MINOR(lol_list->device), lol_list->count, subitem_count);
05641               }
05642           }
05643 #endif
05644         lol_list = lol_list->next;
05645       }
05646     rsbac_read_unlock(&lol_reg_head.lock, &rlock_flags);
05647     return 0;
05648   }

int __init rsbac_list_init void   ) 
 

Definition at line 5065 of file gen_lists.c.

References rsbac_list_lol_reg_head_t::count, rsbac_list_reg_head_t::count, rsbac_list_lol_reg_head_t::curr, rsbac_list_reg_head_t::curr, get_error_name(), rsbac_list_lol_reg_head_t::head, rsbac_list_reg_head_t::head, list_initialized, rsbac_list_lol_reg_head_t::lock, rsbac_list_reg_head_t::lock, rsbac_nanotime_t::nsec, NULL, proc_rsbac_root_p, rsbac_list_compare_u32(), RSBAC_LIST_PERSIST, RSBAC_LIST_PROC_NAME, rsbac_list_register(), RSBAC_LIST_REPL_PARTNER_FILENAME, RSBAC_LIST_REPL_PARTNER_KEY, RSBAC_LIST_REPL_PARTNER_VERSION, RSBAC_LIST_REPL_PROC_NAME, RSBAC_LIST_TA_KEY, RSBAC_LIST_VERSION, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_nanotime_t::sec, rsbac_list_lol_reg_head_t::tail, rsbac_list_reg_head_t::tail, and TRUE.

Referenced by rsbac_do_init().

05067   {
05068     #ifdef CONFIG_RSBAC_LIST_TRANS
05069     int err;
05070     struct rsbac_list_info_t * list_info_p;
05071     #endif
05072 
05073     reg_head.head  = NULL;
05074     reg_head.tail  = NULL;
05075     reg_head.curr  = NULL;
05076     reg_head.lock  = RW_LOCK_UNLOCKED;
05077     reg_head.count = 0;
05078 
05079     lol_reg_head.head  = NULL;
05080     lol_reg_head.tail  = NULL;
05081     lol_reg_head.curr  = NULL;
05082     lol_reg_head.lock  = RW_LOCK_UNLOCKED;
05083     lol_reg_head.count = 0;
05084 
05085     list_initialized = TRUE;
05086 
05087     #ifdef CONFIG_RSBAC_LIST_REPL
05088     repl_last.sec = 0;
05089     repl_last.nsec = 0;
05090     #endif
05091 
05092     /* init proc entry */
05093     #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS)
05094     {
05095       struct proc_dir_entry * tmp_entry_p;
05096 
05097       tmp_entry_p = create_proc_entry(RSBAC_LIST_PROC_NAME,
05098                                       S_IFREG | S_IRUGO,
05099                                       proc_rsbac_root_p);
05100       if(tmp_entry_p)
05101         {
05102           tmp_entry_p->get_info = lists_proc_info;
05103         }
05104       #if defined(CONFIG_RSBAC_LIST_REPL)
05105       tmp_entry_p = create_proc_entry(RSBAC_LIST_REPL_PROC_NAME,
05106                                       S_IFREG | S_IRUGO,
05107                                       proc_rsbac_root_p);
05108       if(tmp_entry_p)
05109         {
05110           tmp_entry_p->get_info = repl_lists_proc_info;
05111         }
05112       #endif
05113     }
05114     #endif
05115 
05116     #ifdef CONFIG_RSBAC_LIST_TRANS
05117     rsbac_printk(KERN_INFO
05118                  "rsbac_list_init(): Registering transaction list.\n");
05119     list_info_p = kmalloc(sizeof(*list_info_p), GFP_KERNEL);
05120     if(!list_info_p)
05121       {
05122         return -ENOMEM;
05123       }
05124     list_info_p->version = 1;
05125     list_info_p->key = RSBAC_LIST_TA_KEY;
05126     list_info_p->desc_size = sizeof(rsbac_list_ta_number_t);
05127     list_info_p->data_size = sizeof(struct rsbac_list_ta_data_t);
05128     list_info_p->max_age = 0;
05129     err = rsbac_list_register(RSBAC_LIST_VERSION,
05130                               (void **) &ta_handle,
05131                               list_info_p,
05132                               0,
05133                               rsbac_list_compare_u32,
05134                               NULL,
05135                               NULL,
05136                               "transactions",
05137                               RSBAC_AUTO_DEV);
05138     if(err)
05139       {
05140         char * tmp = kmalloc(RSBAC_MAXNAMELEN, GFP_KERNEL);
05141 
05142         if(tmp)
05143           {
05144             rsbac_printk(KERN_WARNING
05145                    "rsbac_list_init(): Registering transaction list failed with error %s\n",
05146                    get_error_name(tmp, err));
05147             kfree(tmp);
05148           }
05149       }
05150     kfree(list_info_p);
05151     #endif
05152 
05153     #ifdef CONFIG_RSBAC_LIST_REPL
05154     rsbac_printk(KERN_INFO
05155                  "rsbac_list_init(): Registering replication partner list.\n");
05156     list_info_p = kmalloc(sizeof(*list_info_p), GFP_KERNEL);
05157     if(!list_info_p)
05158       {
05159         return -ENOMEM;
05160       }
05161     list_info_p->version = RSBAC_LIST_REPL_PARTNER_VERSION;
05162     list_info_p->key = RSBAC_LIST_REPL_PARTNER_KEY;
05163     list_info_p->desc_size = sizeof(rsbac_list_repl_partner_number_t);
05164     list_info_p->data_size = sizeof(struct rsbac_list_repl_partner_entry_t);
05165     list_info_p->max_age = 0;
05166     err = rsbac_list_register(RSBAC_LIST_VERSION,
05167                               (void **) &repl_partner_handle,
05168                               list_info_p,
05169                               RSBAC_LIST_PERSIST,
05170                               NULL,
05171                               NULL,
05172                               NULL,
05173                               RSBAC_LIST_REPL_PARTNER_FILENAME,
05174                               RSBAC_AUTO_DEV);
05175     if(err)
05176       {
05177         char * tmp = kmalloc(RSBAC_MAXNAMELEN, GFP_KERNEL);
05178 
05179         if(tmp)
05180           {
05181             rsbac_printk(KERN_WARNING
05182                    "rsbac_list_init(): Registering replication partner list failed with error %s\n",
05183                    get_error_name(tmp, err));
05184             kfree(tmp);
05185           }
05186       }
05187     kfree(list_info_p);
05188     #endif
05189 
05190     return 0;
05191   }

int rsbac_list_mount kdev_t  kdev  ) 
 

Definition at line 5193 of file gen_lists.c.

Referenced by rsbac_mount().

05194   {
05195     return 0;
05196   }

int rsbac_list_umount kdev_t  kdev  ) 
 

Definition at line 5198 of file gen_lists.c.

Referenced by rsbac_umount().

05199   {
05200     return 0;
05201   }


Generated on Sun May 21 14:30:57 2006 for RSBAC by  doxygen 1.4.2