>> It's better to split fixes from the new features. Attached patches >> >> I don't have afs images around. It would be great if you test all new >> functionality with valgrind. It's very good at finding mistakes in the >> code. >> > I will do. I use the publically-available image from > http://web.syllable.org/pages/get-Syllable.html#emulate >> -- >> Regards, >> Pavel Roskin >> >> >> _______________________________________________ >> Grub-devel mailing list >> Grub-devel@gnu.org >> http://lists.gnu.org/mailman/listinfo/grub-devel >> > > > > -- > Regards > Vladimir 'phcoder' Serbinenko > > Personal git repository: http://repo.or.cz/w/grub2/phcoder.git >
-- Regards Vladimir 'phcoder' Serbinenko Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog index bfceb23..443e67e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2009-07-17 Vladimir Serbinenko <phco...@gmail.com> + + Fix AtheFS support. + + * fs/afs.c: Fix comments style. + (grub_afs_blockrun): Declare as packed. + (grub_afs_datastream): Likewise. + (grub_afs_bnode): Likewise. + (grub_afs_btree): Likewise. + (grub_afs_sblock): Likewise. + Declare `name' as char. + (grub_afs_inode): Declare as packed. + Change void *vnode to grub_uint32_t unused. + (grub_afs_iterate_dir): Check that key_size is positive. + (grub_afs_mount): Don't read superblock twice. + (grub_afs_dir): Don't free node in case of errorx + grub_fshelp_find_file already handles this. + (grub_afs_open): Likewise. + 2009-07-19 Vladimir Serbinenko <phco...@gmail.com> * disk/usbms.c (grub_usbms_transfer): Fix double semicolon. diff --git a/fs/afs.c b/fs/afs.c index 832a95c..41aebb4 100644 --- a/fs/afs.c +++ b/fs/afs.c @@ -1,7 +1,7 @@ /* afs.c - The native AtheOS file-system. */ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2008 Free Software Foundation, Inc. + * Copyright (C) 2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ #define GRUB_AFS_DIRECT_BLOCK_COUNT 12 #define GRUB_AFS_BLOCKS_PER_DI_RUN 4 -#define GRUB_AFS_SBLOCK_MAGIC1 0x41465331 /* AFS1 */ +#define GRUB_AFS_SBLOCK_MAGIC1 0x41465331 /* AFS1. */ #define GRUB_AFS_SBLOCK_MAGIC2 0xdd121031 #define GRUB_AFS_SBLOCK_MAGIC3 0x15b6830e @@ -81,7 +81,7 @@ struct grub_afs_blockrun grub_uint32_t group; grub_uint16_t start; grub_uint16_t len; -}; +} __attribute__ ((packed)); struct grub_afs_datastream { @@ -92,7 +92,7 @@ struct grub_afs_datastream struct grub_afs_blockrun double_indirect; grub_afs_off_t max_double_indirect_range; grub_afs_off_t size; -}; +} __attribute__ ((packed)); struct grub_afs_bnode { @@ -102,7 +102,7 @@ struct grub_afs_bnode grub_uint32_t key_count; grub_uint32_t key_size; char key_data[0]; -}; +} __attribute__ ((packed)); struct grub_afs_btree { @@ -111,7 +111,7 @@ struct grub_afs_btree grub_uint32_t tree_depth; grub_afs_bvalue_t last_node; grub_afs_bvalue_t first_free; -} ; +} __attribute__ ((packed)); struct grub_afs_sblock { @@ -124,8 +124,10 @@ struct grub_afs_sblock grub_afs_off_t used_blocks; grub_uint32_t inode_size; grub_uint32_t magic2; - grub_uint32_t block_per_group; // Number of blocks per allocation group (Max 65536) - grub_uint32_t alloc_group_shift; // Number of bits to shift a group number to get a byte address. + grub_uint32_t block_per_group; /* Number of blocks per allocation + group. (Max 65536) */ + grub_uint32_t alloc_group_shift; /* Number of bits to shift a group + number to get a byte address. */ grub_uint32_t alloc_group_count; grub_uint32_t flags; struct grub_afs_blockrun log_block; @@ -133,12 +135,13 @@ struct grub_afs_sblock grub_uint32_t valid_log_blocks; grub_uint32_t log_size; grub_uint32_t magic3; - struct grub_afs_blockrun root_dir; // Root dir inode. - struct grub_afs_blockrun deleted_files; // Directory containing files scheduled for deletion. - struct grub_afs_blockrun index_dir; // Directory of index files. + struct grub_afs_blockrun root_dir; /* Root dir inode. */ + struct grub_afs_blockrun deleted_files; /* Directory containing files + scheduled for deletion. */ + struct grub_afs_blockrun index_dir; /* Directory of index files. */ grub_uint32_t boot_loader_size; grub_uint32_t pad[7]; -}; +} __attribute__ ((packed)); struct grub_afs_inode { @@ -153,13 +156,13 @@ struct grub_afs_inode grub_afs_bigtime modified_time; struct grub_afs_blockrun parent; struct grub_afs_blockrun attrib_dir; - grub_uint32_t index_type; /* Key data-key only used for index files */ + grub_uint32_t index_type; /* Key data-key only used for index files. */ grub_uint32_t inode_size; - void* vnode; + grub_uint32_t unused; struct grub_afs_datastream stream; grub_uint32_t pad[4]; grub_uint32_t small_data[1]; -}; +} __attribute__ ((packed)); struct grub_fshelp_node { @@ -307,8 +310,8 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, struct grub_afs_sblock *sb = &dir->data->sblock; int i; - if ((! dir->inode.stream.size) || - ((U32 (sb, dir->inode.mode) & GRUB_AFS_S_IFMT) != GRUB_AFS_S_IFDIR)) + if ((dir->inode.stream.size == 0) + || ((U32 (sb, dir->inode.mode) & GRUB_AFS_S_IFMT) != GRUB_AFS_S_IFDIR)) return 0; grub_afs_read_file (dir, 0, 0, sizeof (head), (char *) &head); @@ -343,7 +346,7 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, key_start = U16 (sb, (cur_key > 0) ? index[cur_key - 1] : 0); key_size = U16 (sb, index[cur_key]) - key_start; - if (key_size) + if (key_size > 0) { char filename [key_size + 1]; struct grub_fshelp_node *fdiro; @@ -470,14 +473,7 @@ grub_afs_mount (grub_disk_t disk) goto fail; if (! grub_afs_validate_sblock (&data->sblock)) - { - if (grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_afs_sblock), - &data->sblock)) - goto fail; - - if (! grub_afs_validate_sblock (&data->sblock)) - goto fail; - } + goto fail; data->diropen.data = data; data->inode = &data->diropen.inode; @@ -524,8 +520,6 @@ grub_afs_open (struct grub_file *file, const char *name) return 0; fail: - if (fdiro != &data->diropen) - grub_free (fdiro); grub_free (data); grub_dl_unref (my_mod); @@ -588,9 +582,10 @@ grub_afs_dir (grub_device_t device, const char *path, grub_afs_iterate_dir (fdiro, iterate); - fail: if (fdiro != &data->diropen) grub_free (fdiro); + + fail: grub_free (data); grub_dl_unref (my_mod);
diff --git a/ChangeLog b/ChangeLog index 443e67e..f69e332 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2009-07-17 Vladimir Serbinenko <phco...@gmail.com> + Add symlink, mtime and label support to AtheFS. + + * fs/afs.c (grub_afs_sblock): Declare `name' as char. + (grub_afs_iterate_dir): Handle symlinks. + (grub_afs_open): Use grub_afs_read_symlink. + (grub_afs_dir): Likewise. + Pass mtime. + (grub_afs_label): New function. + (grub_afs_fs): Add grub_afs_label. + (grub_afs_read_symlink): New function. + +2009-07-17 Vladimir Serbinenko <phco...@gmail.com> + Fix AtheFS support. * fs/afs.c: Fix comments style. diff --git a/fs/afs.c b/fs/afs.c index 41aebb4..a036cd3 100644 --- a/fs/afs.c +++ b/fs/afs.c @@ -115,7 +115,7 @@ struct grub_afs_btree struct grub_afs_sblock { - grub_uint8_t name[32]; + char name[32]; grub_uint32_t magic1; grub_uint32_t byte_order; grub_uint32_t block_size; @@ -297,6 +297,30 @@ grub_afs_read_file (grub_fshelp_node_t node, - GRUB_DISK_SECTOR_BITS); } +static char * +grub_afs_read_symlink (grub_fshelp_node_t node) +{ + char *ret; + struct grub_afs_sblock *sb = &node->data->sblock; + grub_afs_off_t size = U64 (sb, node->inode.stream.size); + + if (size == 0) + { + size = sizeof (node->inode.stream); + ret = grub_zalloc (size + 1); + if (! ret) + return 0; + grub_memcpy (ret, (char *) &(node->inode.stream), + sizeof (node->inode.stream)); + return ret; + } + ret = grub_zalloc (size + 1); + if (! ret) + return 0; + grub_afs_read_file (node, 0, 0, size, ret); + return ret; +} + static int grub_afs_iterate_dir (grub_fshelp_node_t dir, int NESTED_FUNC_ATTR @@ -370,6 +394,8 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, type = GRUB_FSHELP_DIR; else if (mode == GRUB_AFS_S_IFREG) type = GRUB_FSHELP_REG; + else if (mode == GRUB_AFS_S_IFLNK) + type = GRUB_FSHELP_SYMLINK; else type = GRUB_FSHELP_UNKNOWN; @@ -506,7 +532,7 @@ grub_afs_open (struct grub_file *file, const char *name) goto fail; grub_fshelp_find_file (name, &data->diropen, &fdiro, grub_afs_iterate_dir, - 0, GRUB_FSHELP_REG); + grub_afs_read_symlink, GRUB_FSHELP_REG); if (grub_errno) goto fail; @@ -565,6 +591,9 @@ grub_afs_dir (grub_device_t device, const char *path, struct grub_dirhook_info info; grub_memset (&info, 0, sizeof (info)); info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); + info.mtimeset = 1; + info.mtime = grub_divmod64 (U64 (&data->sblock, + node->inode.modified_time), 1000000, 0); grub_free (node); return hook (filename, &info); } @@ -576,7 +605,7 @@ grub_afs_dir (grub_device_t device, const char *path, goto fail; grub_fshelp_find_file (path, &data->diropen, &fdiro, grub_afs_iterate_dir, - 0, GRUB_FSHELP_DIR); + grub_afs_read_symlink, GRUB_FSHELP_DIR); if (grub_errno) goto fail; @@ -593,13 +622,35 @@ grub_afs_dir (grub_device_t device, const char *path, return grub_errno; } +static grub_err_t +grub_afs_label (grub_device_t device, char **label) +{ + struct grub_afs_data *data; + grub_disk_t disk = device->disk; + + grub_dl_ref (my_mod); + + data = grub_afs_mount (disk); + if (data) + *label = grub_strndup (data->sblock.name, sizeof (data->sblock.name)); + else + *label = NULL; + + grub_dl_unref (my_mod); + + grub_free (data); + + return grub_errno; +} + + static struct grub_fs grub_afs_fs = { .name = "afs", .dir = grub_afs_dir, .open = grub_afs_open, .read = grub_afs_read, .close = grub_afs_close, - .label = 0, + .label = grub_afs_label, .next = 0 };
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel