2008-01-26 Bean <bean123ch@gmail.com>
* fs/reiserfs.c (grub_fshelp_node): New member next_offset.
        (grub_reiserfs_get_item): Save offset of the next item.
        (grub_reiserfs_iterate_dir): Use next_offset to find next item.
			
			
This commit is contained in:
		
							parent
							
								
									2a9525e6c3
								
							
						
					
					
						commit
						22da1f6f0f
					
				
					 2 changed files with 17 additions and 4 deletions
				
			
		|  | @ -1,3 +1,9 @@ | ||||||
|  | 2008-01-26  Bean  <bean123ch@gmail.com> | ||||||
|  | 
 | ||||||
|  | 	* fs/reiserfs.c (grub_fshelp_node): New member next_offset. | ||||||
|  | 	(grub_reiserfs_get_item): Save offset of the next item. | ||||||
|  | 	(grub_reiserfs_iterate_dir): Use next_offset to find next item. | ||||||
|  | 
 | ||||||
| 2008-01-25  Robert Millan  <rmh@aybabtu.com> | 2008-01-25  Robert Millan  <rmh@aybabtu.com> | ||||||
| 
 | 
 | ||||||
| 	* conf/i386-pc.rmk (grub_setup_SOURCES, grub_emu_SOURCES): Regroup to | 	* conf/i386-pc.rmk (grub_setup_SOURCES, grub_emu_SOURCES): Regroup to | ||||||
|  |  | ||||||
|  | @ -218,6 +218,7 @@ struct grub_fshelp_node | ||||||
|   struct grub_reiserfs_data *data; |   struct grub_reiserfs_data *data; | ||||||
|   grub_uint32_t block_number; /* 0 if node is not found.  */ |   grub_uint32_t block_number; /* 0 if node is not found.  */ | ||||||
|   grub_uint16_t block_position; |   grub_uint16_t block_position; | ||||||
|  |   grub_uint64_t next_offset; | ||||||
|   enum grub_reiserfs_item_type type; /* To know how to read the header.  */ |   enum grub_reiserfs_item_type type; /* To know how to read the header.  */ | ||||||
|   struct grub_reiserfs_item_header header; |   struct grub_reiserfs_item_header header; | ||||||
| }; | }; | ||||||
|  | @ -499,6 +500,7 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data, | ||||||
|   if (! block_header) |   if (! block_header) | ||||||
|     goto fail; |     goto fail; | ||||||
|    |    | ||||||
|  |   item->next_offset = 0; | ||||||
|   do |   do | ||||||
|     { |     { | ||||||
|       grub_disk_read (data->disk, |       grub_disk_read (data->disk, | ||||||
|  | @ -542,6 +544,9 @@ grub_reiserfs_get_item (struct grub_reiserfs_data *data, | ||||||
| #endif | #endif | ||||||
|             } |             } | ||||||
|           block_number = grub_le_to_cpu32 (children[i].block_number); |           block_number = grub_le_to_cpu32 (children[i].block_number); | ||||||
|  | 	  if ((i < item_count) && (key->directory_id == keys[i].directory_id) | ||||||
|  | 	       && (key->object_id == keys[i].object_id)) | ||||||
|  | 	    item->next_offset = grub_reiserfs_get_key_offset(&(keys[i])); | ||||||
| #ifdef GRUB_REISERFS_DEBUG | #ifdef GRUB_REISERFS_DEBUG | ||||||
|           if (i == item_count |           if (i == item_count | ||||||
|               || grub_reiserfs_compare_keys (key, &(keys[i])) == 0) |               || grub_reiserfs_compare_keys (key, &(keys[i])) == 0) | ||||||
|  | @ -711,6 +716,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, | ||||||
|   struct grub_reiserfs_block_header *block_header = 0; |   struct grub_reiserfs_block_header *block_header = 0; | ||||||
|   grub_uint16_t block_size, block_position; |   grub_uint16_t block_size, block_position; | ||||||
|   grub_uint32_t block_number; |   grub_uint32_t block_number; | ||||||
|  |   grub_uint64_t next_offset = item->next_offset; | ||||||
|   int ret = 0; |   int ret = 0; | ||||||
| 
 | 
 | ||||||
|   if (item->type != GRUB_REISERFS_DIRECTORY) |   if (item->type != GRUB_REISERFS_DIRECTORY) | ||||||
|  | @ -732,7 +738,6 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, | ||||||
|       struct grub_fshelp_node directory_item; |       struct grub_fshelp_node directory_item; | ||||||
|       grub_uint16_t entry_count, entry_number; |       grub_uint16_t entry_count, entry_number; | ||||||
|       struct grub_reiserfs_item_header *item_headers; |       struct grub_reiserfs_item_header *item_headers; | ||||||
|       grub_uint64_t key_offset; |  | ||||||
|        |        | ||||||
|       grub_disk_read (data->disk, |       grub_disk_read (data->disk, | ||||||
|                       (((grub_disk_addr_t) block_number * block_size) |                       (((grub_disk_addr_t) block_number * block_size) | ||||||
|  | @ -939,16 +944,18 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, | ||||||
|                                   the current one.  */ |                                   the current one.  */ | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |        | ||||||
|  |       if (next_offset == 0) | ||||||
|  |         break; | ||||||
| 
 | 
 | ||||||
|       key_offset |  | ||||||
|         = grub_reiserfs_get_key_offset (&(item_headers[block_position].key)); |  | ||||||
|       grub_reiserfs_set_key_offset (&(item_headers[block_position].key), |       grub_reiserfs_set_key_offset (&(item_headers[block_position].key), | ||||||
|                                     key_offset + 1); |                                     next_offset); | ||||||
|       if (grub_reiserfs_get_item (data, &(item_headers[block_position].key), |       if (grub_reiserfs_get_item (data, &(item_headers[block_position].key), | ||||||
|                                   &directory_item) != GRUB_ERR_NONE) |                                   &directory_item) != GRUB_ERR_NONE) | ||||||
|         goto fail; |         goto fail; | ||||||
|       block_number = directory_item.block_number; |       block_number = directory_item.block_number; | ||||||
|       block_position = directory_item.block_position; |       block_position = directory_item.block_position; | ||||||
|  |       next_offset = directory_item.next_offset; | ||||||
|     } |     } | ||||||
|   while (block_number); |   while (block_number); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue