diff mbox

[v6,3/9] tpm: replace dynamically allocated bios_dir with a static array

Message ID 20161122165856.GD3956@obsidianresearch.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jason Gunthorpe Nov. 22, 2016, 4:58 p.m. UTC
On Tue, Nov 22, 2016 at 01:23:33PM +0200, Jarkko Sakkinen wrote:
> On Mon, Nov 14, 2016 at 05:00:50AM -0500, Nayna Jain wrote:
> > This commit is based on a commit by Nayna Jain. Replaced dynamically
> > allocated bios_dir with a static array as the size is always constant.
> > 
> > Suggested-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> > Signed-off-by: Nayna Jain <nayna@linux.vnet.ibm.com>
> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> 
> This commit remains unreviewed and tested. I'm in the author role here
> so I cannot help with this. If that does not happen soon I cannot put
> this into the pull request.

Nayna must have tested it, looks OK to me..

> > +err:
> > +	chip->bios_dir[cnt] = NULL;
> > +	tpm_bios_log_teardown(chip);
> > +	return -EIO;

Except that return should ideally be PTR_ERR(chip->bios_dir[cnt])

.. and we still set ERR_PTR into bios_dir in the ENODEV case, so the
overall series is still broken if securityfs is compiled out.

Lets fix this all like this - which is a good enough reason to leave the
ENODEV detect alone - just squash this into your patch:


------------------------------------------------------------------------------

Comments

Jarkko Sakkinen Nov. 24, 2016, 1:57 p.m. UTC | #1
On Tue, Nov 22, 2016 at 09:58:56AM -0700, Jason Gunthorpe wrote:
> On Tue, Nov 22, 2016 at 01:23:33PM +0200, Jarkko Sakkinen wrote:
> > On Mon, Nov 14, 2016 at 05:00:50AM -0500, Nayna Jain wrote:
> > > This commit is based on a commit by Nayna Jain. Replaced dynamically
> > > allocated bios_dir with a static array as the size is always constant.
> > > 
> > > Suggested-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> > > Signed-off-by: Nayna Jain <nayna@linux.vnet.ibm.com>
> > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > 
> > This commit remains unreviewed and tested. I'm in the author role here
> > so I cannot help with this. If that does not happen soon I cannot put
> > this into the pull request.
> 
> Nayna must have tested it, looks OK to me..
> 
> > > +err:
> > > +	chip->bios_dir[cnt] = NULL;
> > > +	tpm_bios_log_teardown(chip);
> > > +	return -EIO;
> 
> Except that return should ideally be PTR_ERR(chip->bios_dir[cnt])
> 
> .. and we still set ERR_PTR into bios_dir in the ENODEV case, so the
> overall series is still broken if securityfs is compiled out.
> 
> Lets fix this all like this - which is a good enough reason to leave the
> ENODEV detect alone - just squash this into your patch:

That was a great catch. Thank you.

> diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c
> index 2a15b866ac257a..11bb1138a8282e 100644
> --- a/drivers/char/tpm/tpm_eventlog.c
> +++ b/drivers/char/tpm/tpm_eventlog.c
> @@ -356,15 +356,6 @@ static const struct file_operations tpm_bios_measurements_ops = {
>  	.release = tpm_bios_measurements_release,
>  };
>  
> -static int is_bad(void *p)
> -{
> -	if (!p)
> -		return 1;
> -	if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
> -		return 1;
> -	return 0;
> -}
> -

This function is only confusing indirection anyway. Does not serve
really any justifiable purpose.

>  static int tpm_read_log(struct tpm_chip *chip)
>  {
>  	int rc;
> @@ -390,7 +381,8 @@ static int tpm_read_log(struct tpm_chip *chip)
>   * If an event log is found then the securityfs files are setup to
>   * export it to userspace, otherwise nothing is done.
>   *
> - * Returns -ENODEV if the firmware has no event log.
> + * Returns -ENODEV if the firmware has no event log or securityfs is not
> + * supported.
>   */
>  int tpm_bios_log_setup(struct tpm_chip *chip)
>  {
> @@ -407,7 +399,10 @@ int tpm_bios_log_setup(struct tpm_chip *chip)
>  
>  	cnt = 0;
>  	chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
> -	if (is_bad(chip->bios_dir[cnt]))
> +	/* NOTE: securityfs_create_dir can return ENODEV if securityfs is
> +	 * compiled out. The caller should ignore the ENODEV return code.
> +	 */
> +	if (IS_ERR(chip->bios_dir[cnt]))
>  		goto err;
>  	cnt++;
>  
> @@ -419,7 +414,7 @@ int tpm_bios_log_setup(struct tpm_chip *chip)
>  				   0440, chip->bios_dir[0],
>  				   (void *)&chip->bin_log_seqops,
>  				   &tpm_bios_measurements_ops);
> -	if (is_bad(chip->bios_dir[cnt]))
> +	if (IS_ERR(chip->bios_dir[cnt]))
>  		goto err;
>  	cnt++;
>  
> @@ -431,16 +426,17 @@ int tpm_bios_log_setup(struct tpm_chip *chip)
>  				   0440, chip->bios_dir[0],
>  				   (void *)&chip->ascii_log_seqops,
>  				   &tpm_bios_measurements_ops);
> -	if (is_bad(chip->bios_dir[cnt]))
> +	if (IS_ERR(chip->bios_dir[cnt]))
>  		goto err;
>  	cnt++;
>  
>  	return 0;
>  
>  err:
> +	rc = PTR_ERR(chip->bios_dir[cnt]);
>  	chip->bios_dir[cnt] = NULL;
>  	tpm_bios_log_teardown(chip);
> -	return -EIO;
> +	return rc;
>  }
>  
>  void tpm_bios_log_teardown(struct tpm_chip *chip)

I manually added the changes to:

  tpm: replace dynamically allocated bios_dir with a static array

The code was changed so radically after that patch so it was the
cleanest way.

I need to declare 'rc' in that patch.  I changed also this "int rc = 0;"
to "int rc;" as it does not need to be initialized in the declaration.
This affects:

  tpm: have event log use the tpm_chip

And finally I needed the update this patch too to accomadate the doc
change:

  tpm: Fix handling of missing event log

Could you check through those patches that I didn't blow things up,
which could easily happen given that I needed to update three patches
and give your final reviewed-by if it looks good to you?

In the meanwhile I'll start running sparse, coccicheck etc. for the
release content.

/Jarkko

------------------------------------------------------------------------------
Jason Gunthorpe Nov. 24, 2016, 4:53 p.m. UTC | #2
On Thu, Nov 24, 2016 at 03:57:23PM +0200, Jarkko Sakkinen wrote:
> I manually added the changes to:
> 
>   tpm: replace dynamically allocated bios_dir with a static array

For this patch..

Could drop 'int rc' from tpm1_chip_register, but it will come back in
a later patch

Could dump TPM_NUM_EVENT_LOG_FILES and just use
ARRAY_SIZE(chip->bios_dir)

Now the the stub for tpm_bios_log_setup can properly return -ENODEV

This is no good at this point in the series - we need the ENODEV
detection in tpm_chip_register() from the 'Fix handle of missing event
log' moved into this patch, because it now returns ENODEV due to
sercurityfs

The commit 'tpm: vtpm_proxy: Do not access host's event log' still
needs a proper commit message - it doesn't match what the patch is
doing at all.

If you are going to be editing the patches I'd suggest squashing all
the bug fix ones with proper credit so it at least makes sense to
read..

Jason

------------------------------------------------------------------------------
Jarkko Sakkinen Nov. 25, 2016, 8:08 a.m. UTC | #3
On Thu, Nov 24, 2016 at 09:53:13AM -0700, Jason Gunthorpe wrote:
> On Thu, Nov 24, 2016 at 03:57:23PM +0200, Jarkko Sakkinen wrote:
> > I manually added the changes to:
> > 
> >   tpm: replace dynamically allocated bios_dir with a static array
> 
> For this patch..
> 
> Could drop 'int rc' from tpm1_chip_register, but it will come back in
> a later patch
> 
> Could dump TPM_NUM_EVENT_LOG_FILES and just use
> ARRAY_SIZE(chip->bios_dir)

Not a bug fix. Happy take a patch after the pull request.

> Now the the stub for tpm_bios_log_setup can properly return -ENODEV
> 
> This is no good at this point in the series - we need the ENODEV
> detection in tpm_chip_register() from the 'Fix handle of missing event
> log' moved into this patch, because it now returns ENODEV due to
> sercurityfs

Sure it would be cleaner but not really necessary. Do you really think
this is mandatory? No matter how I reorder patches this will require
time and effort to fix various merge conflicts because of the replacemnt
of event log. After that I have to test everything.

Not doing this for light reasons...

> The commit 'tpm: vtpm_proxy: Do not access host's event log' still
> needs a proper commit message - it doesn't match what the patch is
> doing at all.

The commit message otherwise great except for the short summary, which
is now fixed.

> If you are going to be editing the patches I'd suggest squashing all
> the bug fix ones with proper credit so it at least makes sense to
> read..
> 
> Jason

I do not have interest to edit patches more than I have to.

/Jarkko

------------------------------------------------------------------------------
Jason Gunthorpe Nov. 25, 2016, 7:38 p.m. UTC | #4
On Fri, Nov 25, 2016 at 10:08:38AM +0200, Jarkko Sakkinen wrote:

> > This is no good at this point in the series - we need the ENODEV
> > detection in tpm_chip_register() from the 'Fix handle of missing event
> > log' moved into this patch, because it now returns ENODEV due to
> > sercurityfs
> 
> Sure it would be cleaner but not really necessary. Do you really think
> this is mandatory? No matter how I reorder patches this will require
> time and effort to fix various merge conflicts because of the replacemnt
> of event log. After that I have to test everything.

Well, once you started editing patches to fix them you should make
them fully correct so bisection works.

If you applied the patch I gave you on top of the tree then I would
have said to leave it...

> The commit message otherwise great except for the short summary, which
> is now fixed.

It is good now

Jason

------------------------------------------------------------------------------
Jarkko Sakkinen Nov. 26, 2016, 12:54 p.m. UTC | #5
On Fri, Nov 25, 2016 at 12:38:13PM -0700, Jason Gunthorpe wrote:
> On Fri, Nov 25, 2016 at 10:08:38AM +0200, Jarkko Sakkinen wrote:
> 
> > > This is no good at this point in the series - we need the ENODEV
> > > detection in tpm_chip_register() from the 'Fix handle of missing event
> > > log' moved into this patch, because it now returns ENODEV due to
> > > sercurityfs
> > 
> > Sure it would be cleaner but not really necessary. Do you really think
> > this is mandatory? No matter how I reorder patches this will require
> > time and effort to fix various merge conflicts because of the replacemnt
> > of event log. After that I have to test everything.
> 
> Well, once you started editing patches to fix them you should make
> them fully correct so bisection works.
> 
> If you applied the patch I gave you on top of the tree then I would
> have said to leave it...

I agree with you on this. I adjusted it to be like that now. Is it good
now?

/Jarkko

------------------------------------------------------------------------------
diff mbox

Patch

diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c
index 2a15b866ac257a..11bb1138a8282e 100644
--- a/drivers/char/tpm/tpm_eventlog.c
+++ b/drivers/char/tpm/tpm_eventlog.c
@@ -356,15 +356,6 @@  static const struct file_operations tpm_bios_measurements_ops = {
 	.release = tpm_bios_measurements_release,
 };
 
-static int is_bad(void *p)
-{
-	if (!p)
-		return 1;
-	if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
-		return 1;
-	return 0;
-}
-
 static int tpm_read_log(struct tpm_chip *chip)
 {
 	int rc;
@@ -390,7 +381,8 @@  static int tpm_read_log(struct tpm_chip *chip)
  * If an event log is found then the securityfs files are setup to
  * export it to userspace, otherwise nothing is done.
  *
- * Returns -ENODEV if the firmware has no event log.
+ * Returns -ENODEV if the firmware has no event log or securityfs is not
+ * supported.
  */
 int tpm_bios_log_setup(struct tpm_chip *chip)
 {
@@ -407,7 +399,10 @@  int tpm_bios_log_setup(struct tpm_chip *chip)
 
 	cnt = 0;
 	chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
-	if (is_bad(chip->bios_dir[cnt]))
+	/* NOTE: securityfs_create_dir can return ENODEV if securityfs is
+	 * compiled out. The caller should ignore the ENODEV return code.
+	 */
+	if (IS_ERR(chip->bios_dir[cnt]))
 		goto err;
 	cnt++;
 
@@ -419,7 +414,7 @@  int tpm_bios_log_setup(struct tpm_chip *chip)
 				   0440, chip->bios_dir[0],
 				   (void *)&chip->bin_log_seqops,
 				   &tpm_bios_measurements_ops);
-	if (is_bad(chip->bios_dir[cnt]))
+	if (IS_ERR(chip->bios_dir[cnt]))
 		goto err;
 	cnt++;
 
@@ -431,16 +426,17 @@  int tpm_bios_log_setup(struct tpm_chip *chip)
 				   0440, chip->bios_dir[0],
 				   (void *)&chip->ascii_log_seqops,
 				   &tpm_bios_measurements_ops);
-	if (is_bad(chip->bios_dir[cnt]))
+	if (IS_ERR(chip->bios_dir[cnt]))
 		goto err;
 	cnt++;
 
 	return 0;
 
 err:
+	rc = PTR_ERR(chip->bios_dir[cnt]);
 	chip->bios_dir[cnt] = NULL;
 	tpm_bios_log_teardown(chip);
-	return -EIO;
+	return rc;
 }
 
 void tpm_bios_log_teardown(struct tpm_chip *chip)