All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Andrei Borzenkov <arvidjaar@gmail.com>
Cc: The development of GNU GRUB <grub-devel@gnu.org>,
	linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH v3] F2FS support
Date: Mon, 14 Dec 2015 16:30:18 -0800	[thread overview]
Message-ID: <20151215003018.GC48918@jaegeuk.local> (raw)
In-Reply-To: <566E7DAA.4010202@gmail.com>

Thank you for the review.

On Mon, Dec 14, 2015 at 11:28:26AM +0300, Andrei Borzenkov wrote:
> 20.11.2015 00:28, Jaegeuk Kim пишет:
> > Hello,
> > 
> > Change log from v2:
> >  o Enhance the code quality suggested by Andrei
> > 
> > Sorry for the long delay.
> > Could you please check this patch?
> > 
> > Thank you so much,
> > 
> 
> Thank you for continuing to work on it!
> 
> ...
> 
> > +
> > +static inline int
> > +grub_generic_test_bit (int nr, const grub_uint32_t *addr)
> > +{
> > +  return 1UL & (addr[nr / 32] >> (nr & 31));
> > +}
> > +
> 
> As already discussed this code is wrong on big-endian platform. On-disk
> bitmap is little-endian and kernel explicitly uses test_bit_le() here.

Got it.

> 
> > +static inline char *
> > +__inline_addr (struct grub_f2fs_inode *inode)
> > +{
> > +  return (char *)&inode->i_addr[1];
> > +}
> > +
> > +static inline grub_uint64_t
> > +grub_f2fs_file_size (struct grub_f2fs_inode *inode)
> > +{
> > +  return grub_le_to_cpu64 (inode->i_size);
> > +}
> > +
> > +static inline grub_uint32_t
> > +__start_cp_addr (struct grub_f2fs_data *data)
> > +{
> > +  struct grub_f2fs_checkpoint *ckpt = &data->ckpt;
> > +  grub_uint64_t ckpt_version = grub_le_to_cpu64 (ckpt->checkpoint_ver);
> > +  grub_uint32_t start_addr = data->cp_blkaddr;
> > +
> > +  if (!(ckpt_version & 1))
> 
> This can use grub_cpu_to_le64_compile_time (1)

Done.

> 
> ...
> 
> > +static inline int
> > +grub_f2fs_test_bit (grub_uint32_t nr, const char *p)
> > +{
> > +  int mask;
> > +
> > +  p += (nr >> 3);
> > +  mask = 1 << (7 - (nr & 0x07));
> > +  return (mask & *p) != 0;
> 
> This is really just "return mask & *p".

Okay.

> 
> > +}
> > +
> > +static int
> > +grub_f2fs_sanity_check_sb (struct grub_f2fs_superblock *sb)
> > +{
> > +  grub_uint32_t log_sectorsize, log_sectors_per_block;
> > +
> > +  if (sb->magic != grub_cpu_to_le32_compile_time (F2FS_SUPER_MAGIC))
> > +    return -1;
> > +
> > +  if (sb->log_blocksize != grub_cpu_to_le32_compile_time (F2FS_BLK_BITS))
> > +    return -1;
> > +
> > +  log_sectorsize = grub_le_to_cpu32 (sb->log_sectorsize);
> > +  log_sectors_per_block = grub_le_to_cpu32 (sb->log_sectors_per_block);
> > +
> > +  if (log_sectorsize > F2FS_MAX_LOG_SECTOR_SIZE)
> > +    return -1;
> > +
> > +  if (log_sectorsize < F2FS_MIN_LOG_SECTOR_SIZE)
> > +    return -1;
> > +
> > +  if (log_sectors_per_block + log_sectorsize != F2FS_MAX_LOG_SECTOR_SIZE)
> 
> This sounds like it should actually be F2FS_BLK_BITS; at least assuming
> that F2FS_MAX_LOG_SECTOR_SIZE may differ from F2FS_BLK_BITS.
> 

Yup. In order to avoid confusion, I removed F2FS_MAX_LOG_SECTOR_SIZE.

> ...
> 
> > +
> > +static grub_ssize_t
> > +grub_f2fs_read_file (grub_fshelp_node_t node,
> > +		grub_disk_read_hook_t read_hook, void *read_hook_data,
> > +		grub_off_t pos, grub_size_t len, char *buf)
> > +{
> > +  struct grub_f2fs_inode *inode = &node->inode.i;
> > +  grub_off_t filesize = grub_f2fs_file_size (inode);
> > +  char *inline_addr = __inline_addr (inode);
> > +
> > +  if (inode->i_inline & F2FS_INLINE_DATA)
> > +    {
> > +      if (pos > filesize || filesize > MAX_INLINE_DATA)
> > +        {
> > +          grub_error (GRUB_ERR_BAD_FS, "corrupted inline_data: need fsck");
> 
> 
> Sorry for confusion, my fault. pos > filesize was OK, but filesize >
> MAX_INLINE_DATA not.

If filesize is over MAX_INLINE_DATA, this file is corrupted as well.
It will cause boundary violation during memcpy below.

> 
> ...
> 
> > +
> > +/* TODO: mkfs.f2fs stores label in a wrong way. Should be fixed. */
> > +static void
> > +grub_f2fs_unicode_to_ascii (grub_uint8_t *out_buf, grub_uint16_t *in_buf)
> > +{
> > +  grub_uint16_t *pchTempPtr = in_buf;
> > +  grub_uint8_t *pwTempPtr = out_buf;
> > +
> > +  while (*pchTempPtr != '\0')
> > +    {
> > +      *pwTempPtr = (grub_uint8_t) *pchTempPtr;
> > +      pchTempPtr++;
> > +      pwTempPtr++;
> > +    }
> > +  *pwTempPtr = '\0';
> > +  return;
> > +}
> 
> Sorry, I do not see how it can work on both big and little endian
> platforms. What byte order is used for on-disk label? Why cannot you use
> grub_utf16_to_utf8 as I asked last time?
> 
> Also please add bundary check, do not rely on correct content.

Got it. I refactored this here and in f2fs-tools as well.
Could you check v4?

Thanks,

> 
> 
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


WARNING: multiple messages have this Message-ID (diff)
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Andrei Borzenkov <arvidjaar@gmail.com>
Cc: The development of GNU GRUB <grub-devel@gnu.org>,
	linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [PATCH v3] F2FS support
Date: Mon, 14 Dec 2015 16:30:18 -0800	[thread overview]
Message-ID: <20151215003018.GC48918@jaegeuk.local> (raw)
In-Reply-To: <566E7DAA.4010202@gmail.com>

Thank you for the review.

On Mon, Dec 14, 2015 at 11:28:26AM +0300, Andrei Borzenkov wrote:
> 20.11.2015 00:28, Jaegeuk Kim пишет:
> > Hello,
> > 
> > Change log from v2:
> >  o Enhance the code quality suggested by Andrei
> > 
> > Sorry for the long delay.
> > Could you please check this patch?
> > 
> > Thank you so much,
> > 
> 
> Thank you for continuing to work on it!
> 
> ...
> 
> > +
> > +static inline int
> > +grub_generic_test_bit (int nr, const grub_uint32_t *addr)
> > +{
> > +  return 1UL & (addr[nr / 32] >> (nr & 31));
> > +}
> > +
> 
> As already discussed this code is wrong on big-endian platform. On-disk
> bitmap is little-endian and kernel explicitly uses test_bit_le() here.

Got it.

> 
> > +static inline char *
> > +__inline_addr (struct grub_f2fs_inode *inode)
> > +{
> > +  return (char *)&inode->i_addr[1];
> > +}
> > +
> > +static inline grub_uint64_t
> > +grub_f2fs_file_size (struct grub_f2fs_inode *inode)
> > +{
> > +  return grub_le_to_cpu64 (inode->i_size);
> > +}
> > +
> > +static inline grub_uint32_t
> > +__start_cp_addr (struct grub_f2fs_data *data)
> > +{
> > +  struct grub_f2fs_checkpoint *ckpt = &data->ckpt;
> > +  grub_uint64_t ckpt_version = grub_le_to_cpu64 (ckpt->checkpoint_ver);
> > +  grub_uint32_t start_addr = data->cp_blkaddr;
> > +
> > +  if (!(ckpt_version & 1))
> 
> This can use grub_cpu_to_le64_compile_time (1)

Done.

> 
> ...
> 
> > +static inline int
> > +grub_f2fs_test_bit (grub_uint32_t nr, const char *p)
> > +{
> > +  int mask;
> > +
> > +  p += (nr >> 3);
> > +  mask = 1 << (7 - (nr & 0x07));
> > +  return (mask & *p) != 0;
> 
> This is really just "return mask & *p".

Okay.

> 
> > +}
> > +
> > +static int
> > +grub_f2fs_sanity_check_sb (struct grub_f2fs_superblock *sb)
> > +{
> > +  grub_uint32_t log_sectorsize, log_sectors_per_block;
> > +
> > +  if (sb->magic != grub_cpu_to_le32_compile_time (F2FS_SUPER_MAGIC))
> > +    return -1;
> > +
> > +  if (sb->log_blocksize != grub_cpu_to_le32_compile_time (F2FS_BLK_BITS))
> > +    return -1;
> > +
> > +  log_sectorsize = grub_le_to_cpu32 (sb->log_sectorsize);
> > +  log_sectors_per_block = grub_le_to_cpu32 (sb->log_sectors_per_block);
> > +
> > +  if (log_sectorsize > F2FS_MAX_LOG_SECTOR_SIZE)
> > +    return -1;
> > +
> > +  if (log_sectorsize < F2FS_MIN_LOG_SECTOR_SIZE)
> > +    return -1;
> > +
> > +  if (log_sectors_per_block + log_sectorsize != F2FS_MAX_LOG_SECTOR_SIZE)
> 
> This sounds like it should actually be F2FS_BLK_BITS; at least assuming
> that F2FS_MAX_LOG_SECTOR_SIZE may differ from F2FS_BLK_BITS.
> 

Yup. In order to avoid confusion, I removed F2FS_MAX_LOG_SECTOR_SIZE.

> ...
> 
> > +
> > +static grub_ssize_t
> > +grub_f2fs_read_file (grub_fshelp_node_t node,
> > +		grub_disk_read_hook_t read_hook, void *read_hook_data,
> > +		grub_off_t pos, grub_size_t len, char *buf)
> > +{
> > +  struct grub_f2fs_inode *inode = &node->inode.i;
> > +  grub_off_t filesize = grub_f2fs_file_size (inode);
> > +  char *inline_addr = __inline_addr (inode);
> > +
> > +  if (inode->i_inline & F2FS_INLINE_DATA)
> > +    {
> > +      if (pos > filesize || filesize > MAX_INLINE_DATA)
> > +        {
> > +          grub_error (GRUB_ERR_BAD_FS, "corrupted inline_data: need fsck");
> 
> 
> Sorry for confusion, my fault. pos > filesize was OK, but filesize >
> MAX_INLINE_DATA not.

If filesize is over MAX_INLINE_DATA, this file is corrupted as well.
It will cause boundary violation during memcpy below.

> 
> ...
> 
> > +
> > +/* TODO: mkfs.f2fs stores label in a wrong way. Should be fixed. */
> > +static void
> > +grub_f2fs_unicode_to_ascii (grub_uint8_t *out_buf, grub_uint16_t *in_buf)
> > +{
> > +  grub_uint16_t *pchTempPtr = in_buf;
> > +  grub_uint8_t *pwTempPtr = out_buf;
> > +
> > +  while (*pchTempPtr != '\0')
> > +    {
> > +      *pwTempPtr = (grub_uint8_t) *pchTempPtr;
> > +      pchTempPtr++;
> > +      pwTempPtr++;
> > +    }
> > +  *pwTempPtr = '\0';
> > +  return;
> > +}
> 
> Sorry, I do not see how it can work on both big and little endian
> platforms. What byte order is used for on-disk label? Why cannot you use
> grub_utf16_to_utf8 as I asked last time?
> 
> Also please add bundary check, do not rely on correct content.

Got it. I refactored this here and in f2fs-tools as well.
Could you check v4?

Thanks,

> 
> 
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

------------------------------------------------------------------------------
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  reply	other threads:[~2015-12-15  0:30 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-24  8:19 [PATCH] F2FS support Jaegeuk Kim
2015-03-24  8:19 ` Jaegeuk Kim
2015-03-28  7:31 ` Andrei Borzenkov
2015-03-28  7:31   ` Andrei Borzenkov
2015-03-28 20:43   ` Jaegeuk Kim
2015-03-28 20:43     ` Jaegeuk Kim
2015-03-28 21:00     ` Andrei Borzenkov
2015-03-28 21:00       ` Andrei Borzenkov
2015-04-03 22:48   ` Jaegeuk Kim
2015-04-03 22:48     ` Jaegeuk Kim
2015-04-03 22:49 ` [PATCH v2] " Jaegeuk Kim
2015-04-03 22:49   ` Jaegeuk Kim
2015-04-29 20:48   ` [f2fs-dev] " Jaegeuk Kim
2015-04-29 20:48     ` Jaegeuk Kim
2015-04-30  3:32     ` Andrei Borzenkov
2015-04-30  3:32       ` Andrei Borzenkov
2015-05-02 17:15   ` Andrei Borzenkov
2015-05-02 17:15     ` Andrei Borzenkov
2015-05-03  6:28     ` Andrei Borzenkov
2015-05-03  6:28       ` Andrei Borzenkov
2015-05-07 14:51     ` Vladimir 'φ-coder/phcoder' Serbinenko
2015-05-07 14:57       ` Andrei Borzenkov
2015-11-19 21:28   ` [PATCH v3] " Jaegeuk Kim
2015-11-19 21:28     ` Jaegeuk Kim
2015-12-14  8:28     ` Andrei Borzenkov
2015-12-14  8:28       ` Andrei Borzenkov
2015-12-15  0:30       ` Jaegeuk Kim [this message]
2015-12-15  0:30         ` Jaegeuk Kim
2015-12-15  0:34       ` [f2fs-dev] [PATCH v4] " Jaegeuk Kim
2015-12-15  0:34         ` Jaegeuk Kim
2015-12-15  8:34         ` [f2fs-dev] " Andrei Borzenkov
2015-12-15  8:34           ` Andrei Borzenkov
2015-12-15 18:08           ` [f2fs-dev] " Jaegeuk Kim
2015-12-15 18:08             ` Jaegeuk Kim
2015-12-15 18:14         ` [f2fs-dev] [PATCH v5] " Jaegeuk Kim
2015-12-15 18:14           ` Jaegeuk Kim
2016-01-07 19:37           ` [f2fs-dev] " Michael Zimmermann
2016-01-07 19:37             ` Michael Zimmermann
2016-01-08 19:41           ` [f2fs-dev] [PATCH v6] " Jaegeuk Kim
2016-01-08 19:41             ` Jaegeuk Kim
2016-02-22  9:25             ` [f2fs-dev] " Andrei Borzenkov
2016-02-22  9:25               ` Andrei Borzenkov
2016-02-22 18:21               ` [f2fs-dev] " Jaegeuk Kim
2016-02-22 18:21                 ` Jaegeuk Kim
2016-02-22 18:25             ` [f2fs-dev] [PATCH v7] " Jaegeuk Kim
2016-02-22 18:25               ` Jaegeuk Kim
2016-03-01 19:52               ` [2.02] Re: [f2fs-dev] " Andrei Borzenkov
2016-03-01 19:52                 ` Andrei Borzenkov
2016-03-02 23:20                 ` Michael Zimmermann
2016-03-02 23:20                   ` Michael Zimmermann
2016-03-03 21:35                   ` Jaegeuk Kim
2016-03-03 21:35                     ` [2.02] " Jaegeuk Kim
2016-03-03 21:36                 ` [2.02] Re: [f2fs-dev] [PATCH v8] " Jaegeuk Kim
2016-03-03 21:36                   ` Jaegeuk Kim
2016-08-04 17:06                   ` [f2fs-dev] [2.02] " Jaegeuk Kim
2016-08-04 17:06                     ` Jaegeuk Kim
2016-08-05 10:57                     ` [f2fs-dev] " Andrei Borzenkov
2016-08-05 10:57                       ` Andrei Borzenkov
2016-08-05 18:07                       ` [f2fs-dev] " Jaegeuk Kim
2016-08-05 18:07                         ` Jaegeuk Kim
2016-08-05 19:17                         ` [f2fs-dev] " Michael Zimmermann
2016-08-05 19:17                           ` Michael Zimmermann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151215003018.GC48918@jaegeuk.local \
    --to=jaegeuk@kernel.org \
    --cc=arvidjaar@gmail.com \
    --cc=grub-devel@gnu.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.