Changeset 635 for trunk/kernel/libk/user_dir.c
- Timestamp:
- Jun 26, 2019, 11:42:37 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/libk/user_dir.c
r633 r635 93 93 uint32_t attr; // attributes for all GPT entries 94 94 uint32_t dirents_per_page; // number of dirent descriptors per page 95 xptr_t page_xp; // extended pointer on page descriptor96 95 page_t * page; // local pointer on page descriptor 97 xptr_t base_xp; // extended pointer on physical page base98 96 struct dirent * base; // local pointer on physical page base 99 97 uint32_t total_dirents; // total number of dirents in dirent array … … 126 124 127 125 // check dirent size 128 assert( ( sizeof(struct dirent) == 64), "sizeof(dirent) !=64\n");126 assert( ( sizeof(struct dirent) == 64), "sizeof(dirent) must be 64\n"); 129 127 130 128 // compute number of dirent per page … … 135 133 136 134 // allocate memory for a local user_dir descriptor 137 req.type = KMEM_DIR; 138 req.flags = AF_ZERO; 135 req.type = KMEM_KCM; 136 req.order = bits_log2( sizeof(user_dir_t) ); 137 req.flags = AF_ZERO | AF_KERNEL; 139 138 dir = kmem_alloc( &req ); 140 139 … … 146 145 } 147 146 148 // Build an initialize the dirent array as a list of p hysical pages.147 // Build an initialize the dirent array as a list of pages. 149 148 // For each iteration in this while loop: 150 149 // - allocate one physical 4 Kbytes (64 dirent slots) … … 163 162 { 164 163 // allocate one physical page 165 req.type = KMEM_P AGE;166 req. size= 0;164 req.type = KMEM_PPM; 165 req.order = 0; 167 166 req.flags = AF_ZERO; 168 page = kmem_alloc( &req );169 170 if( page == NULL )167 base = kmem_alloc( &req ); 168 169 if( base == NULL ) 171 170 { 172 171 printk("\n[ERROR] in %s : cannot allocate page in cluster %x\n", … … 174 173 goto user_dir_create_failure; 175 174 } 176 177 // get pointer on page base (array of dirents)178 page_xp = XPTR( local_cxy , page );179 base_xp = ppm_page2base( page_xp );180 base = GET_PTR( base_xp );181 175 182 176 // call the relevant FS specific function to copy up to 64 dirents in page … … 198 192 total_dirents += entries; 199 193 194 // get page descriptor pointer from base 195 page = GET_PTR( ppm_base2page( XPTR( local_cxy , base ) ) ); 196 200 197 // register page in temporary list 201 198 list_add_last( &root , &page->list ); … … 303 300 304 301 // release the user_dir descriptor 305 req.type = KMEM_ DIR;302 req.type = KMEM_KCM; 306 303 req.ptr = dir; 307 304 kmem_free( &req ); … … 364 361 365 362 // release local user_dir_t structure 366 req.type = KMEM_ DIR;363 req.type = KMEM_KCM; 367 364 req.ptr = dir; 368 365 kmem_free( &req ); … … 372 369 { 373 370 page = LIST_FIRST( &root , page_t , list ); 374 req.type = KMEM_PAGE; 375 req.ptr = page; 371 372 // get base from page descriptor pointer 373 base = GET_PTR( ppm_page2base( XPTR( local_cxy , page ) ) ); 374 375 req.type = KMEM_PPM; 376 req.ptr = base; 376 377 kmem_free( &req ); 377 378 } … … 492 493 // release local user_dir_t structure 493 494 kmem_req_t req; 494 req.type = KMEM_ DIR;495 req.type = KMEM_KCM; 495 496 req.ptr = dir; 496 497 kmem_free( &req );
Note: See TracChangeset
for help on using the changeset viewer.