[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[2075] 2009-04-10 Vladimir Serbinenko <address@hidden>
From: |
Vladimir Serbinenko |
Subject: |
[2075] 2009-04-10 Vladimir Serbinenko <address@hidden> |
Date: |
Fri, 10 Apr 2009 21:47:08 +0000 |
Revision: 2075
http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2075
Author: phcoder
Date: 2009-04-10 21:47:08 +0000 (Fri, 10 Apr 2009)
Log Message:
-----------
2009-04-10 Vladimir Serbinenko <address@hidden>
UFS improvements
* fs/ufs.c (INODE_NBLOCKS): new definition
(struct grub_ufs_dirent): added fields for non-BSD dirents
(grub_ufs_get_file_block): fixed double indirect handling
(grub_ufs_lookup_symlink): use more robust way to determine whether
symlink is inline
(grub_ufs_find_file): support for non-BSD dirents
(grub_ufs_dir): support for non-BSD dirents
Modified Paths:
--------------
trunk/grub2/ChangeLog
trunk/grub2/fs/ufs.c
Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog 2009-04-10 15:33:34 UTC (rev 2074)
+++ trunk/grub2/ChangeLog 2009-04-10 21:47:08 UTC (rev 2075)
@@ -1,3 +1,15 @@
+2009-04-10 Vladimir Serbinenko <address@hidden>
+
+ UFS improvements
+
+ * fs/ufs.c (INODE_NBLOCKS): new definition
+ (struct grub_ufs_dirent): added fields for non-BSD dirents
+ (grub_ufs_get_file_block): fixed double indirect handling
+ (grub_ufs_lookup_symlink): use more robust way to determine whether
+ symlink is inline
+ (grub_ufs_find_file): support for non-BSD dirents
+ (grub_ufs_dir): support for non-BSD dirents
+
2009-04-10 Bean <address@hidden>
* include/grub/efi/api.h (grub_efi_configuration_table): Add packed
Modified: trunk/grub2/fs/ufs.c
===================================================================
--- trunk/grub2/fs/ufs.c 2009-04-10 15:33:34 UTC (rev 2074)
+++ trunk/grub2/fs/ufs.c 2009-04-10 21:47:08 UTC (rev 2075)
@@ -54,6 +54,8 @@
grub_le_to_cpu##bits1 (data->inode.field) : \
grub_le_to_cpu##bits2 (data->inode2.field))
#define INODE_SIZE(data) INODE_ENDIAN (data,size,32,64)
+#define INODE_NBLOCKS(data) INODE_ENDIAN (data,nblocks,32,64)
+
#define INODE_MODE(data) INODE_ENDIAN (data,mode,16,16)
#define INODE_BLKSZ(data) (data->ufs_type == UFS1 ? 4 : 8)
#define INODE_DIRBLOCKS(data,blk) INODE_ENDIAN \
@@ -174,8 +176,15 @@
{
grub_uint32_t ino;
grub_uint16_t direntlen;
- grub_uint8_t filetype;
- grub_uint8_t namelen;
+ union
+ {
+ grub_uint16_t namelen;
+ struct
+ {
+ grub_uint8_t filetype_bsd;
+ grub_uint8_t namelen_bsd;
+ };
+ };
} __attribute__ ((packed));
/* Information about a "mounted" ufs filesystem. */
@@ -234,15 +243,16 @@
blk -= indirsz;
/* Double indirect block. */
- if (blk < UFS_BLKSZ (sblock) / indirsz)
+ if (blk < indirsz * indirsz)
{
grub_uint32_t indir[UFS_BLKSZ (sblock) >> 2];
grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 1) << log2_blksz,
0, sizeof (indir), (char *) indir);
grub_disk_read (data->disk,
- (data->ufs_type == UFS1) ?
- indir[blk / indirsz] : indir [(blk / indirsz) << 1],
+ ((data->ufs_type == UFS1) ?
+ indir[blk / indirsz] : indir [(blk / indirsz) << 1])
+ << log2_blksz,
0, sizeof (indir), (char *) indir);
return (data->ufs_type == UFS1) ?
@@ -387,8 +397,7 @@
if (++data->linknest > GRUB_UFS_MAX_SYMLNK_CNT)
return grub_error (GRUB_ERR_SYMLINK_LOOP, "too deep nesting of symlinks");
- if (INODE_SIZE (data) < (GRUB_UFS_DIRBLKS + GRUB_UFS_INDIRBLKS
- * INODE_BLKSZ (data)))
+ if (INODE_NBLOCKS (data) == 0)
grub_strcpy (symlink, (char *) INODE (data, symlink));
else
{
@@ -447,6 +456,7 @@
do
{
struct grub_ufs_dirent dirent;
+ int namelen;
if (grub_strlen (name) == 0)
return GRUB_ERR_NONE;
@@ -454,15 +464,18 @@
if (grub_ufs_read_file (data, 0, pos, sizeof (dirent),
(char *) &dirent) < 0)
return grub_errno;
+
+ namelen = (data->ufs_type == UFS2)
+ ? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
{
- char filename[dirent.namelen + 1];
+ char filename[namelen + 1];
if (grub_ufs_read_file (data, 0, pos + sizeof (dirent),
- dirent.namelen, filename) < 0)
+ namelen, filename) < 0)
return grub_errno;
- filename[dirent.namelen] = '\0';
+ filename[namelen] = '\0';
if (!grub_strcmp (name, filename))
{
@@ -595,21 +608,25 @@
while (pos < INODE_SIZE (data))
{
struct grub_ufs_dirent dirent;
+ int namelen;
if (grub_ufs_read_file (data, 0, pos, sizeof (dirent),
(char *) &dirent) < 0)
break;
+
+ namelen = (data->ufs_type == UFS2)
+ ? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
{
- char filename[dirent.namelen + 1];
+ char filename[namelen + 1];
struct grub_dirhook_info info;
grub_memset (&info, 0, sizeof (info));
if (grub_ufs_read_file (data, 0, pos + sizeof (dirent),
- dirent.namelen, filename) < 0)
+ namelen, filename) < 0)
break;
- filename[dirent.namelen] = '\0';
+ filename[namelen] = '\0';
if (data->ufs_type == UFS1)
{
struct grub_ufs_inode inode;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [2075] 2009-04-10 Vladimir Serbinenko <address@hidden>,
Vladimir Serbinenko <=