All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Whitcroft <apw@canonical.com>
To: Jeremy Kerr <jeremy.kerr@canonical.com>
Cc: Matthew Garrett <mjg@redhat.com>,
	Matt Fleming <matt.fleming@intel.com>,
	linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 5/5] efivarfs: efivarfs_fill_super() ensure we clean up correctly on error
Date: Thu, 11 Oct 2012 17:06:33 +0100	[thread overview]
Message-ID: <20121011160633.GA23494@dm> (raw)
In-Reply-To: <5076D1EC.1060100@canonical.com>

On Thu, Oct 11, 2012 at 10:04:28PM +0800, Jeremy Kerr wrote:
> Hi Andy,
> 
> >@@ -969,16 +970,18 @@
> >  		return -ENOMEM;
> >
> >  	list_for_each_entry_safe(entry, n, &efivars->list, list) {
> >-		struct inode *inode;
> >  		struct dentry *dentry, *root = efivarfs_sb->s_root;
> >-		char *name;
> >  		unsigned long size = 0;
> >  		int len, i;
> >
> >+		inode = NULL;
> >+
> >  		len = utf16_strlen(entry->var.VariableName);
> >
> >  		/* GUID plus trailing NULL */
> >  		name = kmalloc(len + 38, GFP_ATOMIC);
> >+		if (!name)
> >+			goto fail;
> >
> >  		for (i = 0; i < len; i++)
> >  			name[i] = entry->var.VariableName[i] & 0xFF;
> >@@ -991,7 +994,13 @@
> >
> >  		inode = efivarfs_get_inode(efivarfs_sb, root->d_inode,
> >  					  S_IFREG | 0644, 0);
> >+		if (!inode)
> >+			goto fail_name;
> >+			
> >  		dentry = d_alloc_name(root, name);
> >+		if (!dentry)
> >+			goto fail_inode;
> >+
> >  		/* copied by the above to local storage in the dentry. */
> >  		kfree(name);
> 
> If we break out of the loop on the second (and onwards) iteration,
> won't we still have the other inodes and dentries remaining
> allocated?

As we calling this from the mount_single() wrapper:

        return mount_single(fs_type, flags, data, efivarfs_fill_super);


which does this:

    struct dentry *mount_single(struct file_system_type *fs_type,
	    int flags, void *data,
	    int (*fill_super)(struct super_block *, void *, int))
    {
    [...]
		    error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
		    if (error) {
			    deactivate_locked_super(s);
			    return ERR_PTR(error);
		    }
    [...]

I am expecting us to get called back via deactivate_locked_super(),
which calls sb->kill_sb() which is:

    static void efivarfs_kill_sb(struct super_block *sb)
    {       
	    kill_litter_super(sb);
	    efivarfs_sb = NULL;
    }       

Which I believe will clean them up.

-apw


  reply	other threads:[~2012-10-11 16:06 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-05  5:54 [PATCH 1/3] efi: Add support for a UEFI variable filesystem Jeremy Kerr
2012-10-05  5:54 ` [PATCH 3/3] efi: Handle deletions and size changes in efivarfs_write_file Jeremy Kerr
2012-10-05  5:54 ` [PATCH 2/3] efi: add efivars kobject to efi sysfs folder Jeremy Kerr
2012-10-05  6:51   ` joeyli
2012-10-05  7:44     ` Jeremy Kerr
2012-10-06 19:32 ` [PATCH 1/3] efi: Add support for a UEFI variable filesystem Matt Fleming
2012-10-11 10:32 ` [PATCH 0/5] efivarfs: fixes and cleanups Andy Whitcroft
2012-10-11 10:32   ` [PATCH 1/5] efivarfs: efivarfs_file_read ensure we free data in error paths Andy Whitcroft
2012-10-11 13:53     ` Jeremy Kerr
2012-10-11 10:32   ` [PATCH 2/5] efivarfs: efivarfs_create() ensure we drop our reference on inode on error Andy Whitcroft
2012-10-11 14:13     ` Jeremy Kerr
     [not found]     ` <1349951541-20498-3-git-send-email-apw-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2012-10-12 19:03       ` Khalid Aziz
2012-10-12 19:03         ` Khalid Aziz
2012-10-12 19:21         ` Matt Fleming
2012-10-12 19:21           ` Matt Fleming
2012-10-12 20:11           ` Khalid Aziz
2012-10-11 10:32   ` [PATCH 3/5] efivarfs: efivarfs_fill_super() fix inode reference counts Andy Whitcroft
2012-10-11 14:10     ` Jeremy Kerr
2012-10-11 10:32   ` [PATCH 4/5] efivarfs: efivarfs_fill_super() ensure we free our temporary name Andy Whitcroft
2012-10-11 13:59     ` Jeremy Kerr
2012-10-11 10:32   ` [PATCH 5/5] efivarfs: efivarfs_fill_super() ensure we clean up correctly on error Andy Whitcroft
2012-10-11 14:04     ` Jeremy Kerr
2012-10-11 16:06       ` Andy Whitcroft [this message]
2012-10-16  9:16         ` Jeremy Kerr
2012-10-16  9:16           ` Jeremy Kerr
2012-10-11 12:40   ` [PATCH 0/5] efivarfs: fixes and cleanups Matthew Garrett
2012-10-11 12:48   ` Matt Fleming

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=20121011160633.GA23494@dm \
    --to=apw@canonical.com \
    --cc=jeremy.kerr@canonical.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matt.fleming@intel.com \
    --cc=mjg@redhat.com \
    /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.