From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Lqotr-0001eh-AI for mharc-grub-devel@gnu.org; Mon, 06 Apr 2009 09:30:07 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lqoto-0001dj-TL for grub-devel@gnu.org; Mon, 06 Apr 2009 09:30:04 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lqotk-0001bq-6Y for grub-devel@gnu.org; Mon, 06 Apr 2009 09:30:04 -0400 Received: from [199.232.76.173] (port=52958 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lqotj-0001bj-Oh for grub-devel@gnu.org; Mon, 06 Apr 2009 09:29:59 -0400 Received: from mail-fx0-f166.google.com ([209.85.220.166]:58109) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Lqotj-0005XL-6E for grub-devel@gnu.org; Mon, 06 Apr 2009 09:29:59 -0400 Received: by fxm10 with SMTP id 10so2119992fxm.42 for ; Mon, 06 Apr 2009 06:29:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:content-type; bh=pzHJeamnpjrZGD7mYxdKkq/QRx1fnU3ND2FiT/wk3vw=; b=ofsaVpqgHUs+u5kckjRK6v5ZeZRJANqJ5kJL0mjZF3m2InoJ34GaSTru2/pMp+3TZo 8Vp3xmKa1oF6iu0gTNaROsdEjTw+W5vhG3blDRqtaJmgc+giD4AKiwD3Njw6q6yMuuWn fgy68X3t0BIZKxm5+hISwYLzvLKN9YMKurQO4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; b=f1b+EPfx6Hu6vmLdC94rWIC+0mcXtpq7O9TWQiK1ic8O3kLCghr+OKJnRYepmfnYNW T0zi5+9w6Nak5V/3cf+NMWxHwAHRddofwppNWjqtQ1hZ6cX89SZo2ImnNf7LAWL7KPfV WyeFYklaYYM9CgQbEJ3rSai8q6bBf527qIGL0= Received: by 10.86.89.20 with SMTP id m20mr3220923fgb.52.1239024596648; Mon, 06 Apr 2009 06:29:56 -0700 (PDT) Received: from ?82.130.80.49? (hg-public-dock-49-dhcp.ethz.ch [82.130.80.49]) by mx.google.com with ESMTPS id l19sm12208030fgb.21.2009.04.06.06.29.56 (version=SSLv3 cipher=RC4-MD5); Mon, 06 Apr 2009 06:29:56 -0700 (PDT) Message-ID: <49DA03D6.2020909@gmail.com> Date: Mon, 06 Apr 2009 15:29:58 +0200 From: phcoder User-Agent: Thunderbird 2.0.0.21 (X11/20090318) MIME-Version: 1.0 To: The development of GRUB 2 Content-Type: multipart/mixed; boundary="------------020905070704070804000309" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: UFS fixes X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Apr 2009 13:30:05 -0000 This is a multi-part message in MIME format. --------------020905070704070804000309 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Here are the fixes for UFS. Basically it's a resubmit of my previous patch. It works fine with both solaris UFS and recent BSD UFS2. Does it break anything for anyone with ufs? 2009-04-06 Vladimir Serbinenko 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 -- Regards Vladimir 'phcoder' Serbinenko --------------020905070704070804000309 Content-Type: text/x-diff; name="ufs.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ufs.diff" diff --git a/fs/ufs.c b/fs/ufs.c index e6eacd3..b799449 100644 --- a/fs/ufs.c +++ b/fs/ufs.c @@ -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 @@ struct grub_ufs_dirent { 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 @@ grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk) 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 @@ grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino) 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 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path) do { struct grub_ufs_dirent dirent; + int namelen; if (grub_strlen (name) == 0) return GRUB_ERR_NONE; @@ -454,15 +464,18 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path) 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 @@ grub_ufs_dir (grub_device_t device, const char *path, 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; --------------020905070704070804000309--