From c64c35332ec18eb11efe4b3d1dc251a55c05ba66 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 14 Jan 2013 09:33:49 -0800 Subject: [PATCH] 3.0-stable patches added patches: ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch --- ...k-in-ext4_xattr_set_acl-s-error-path.patch | 39 +++++++++++ ...rm-devices-allocated-by-the-mfd-core.patch | 68 +++++++++++++++++++ queue-3.0/series | 2 + 3 files changed, 109 insertions(+) create mode 100644 queue-3.0/ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch create mode 100644 queue-3.0/mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch diff --git a/queue-3.0/ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch b/queue-3.0/ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch new file mode 100644 index 00000000000..54fbf305c47 --- /dev/null +++ b/queue-3.0/ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch @@ -0,0 +1,39 @@ +From 24ec19b0ae83a385ad9c55520716da671274b96c Mon Sep 17 00:00:00 2001 +From: Eugene Shatokhin +Date: Thu, 8 Nov 2012 15:11:11 -0500 +Subject: ext4: fix memory leak in ext4_xattr_set_acl()'s error path + +From: Eugene Shatokhin + +commit 24ec19b0ae83a385ad9c55520716da671274b96c upstream. + +In ext4_xattr_set_acl(), if ext4_journal_start() returns an error, +posix_acl_release() will not be called for 'acl' which may result in a +memory leak. + +This patch fixes that. + +Reviewed-by: Lukas Czerner +Signed-off-by: Eugene Shatokhin +Signed-off-by: "Theodore Ts'o" +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext4/acl.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/fs/ext4/acl.c ++++ b/fs/ext4/acl.c +@@ -450,8 +450,10 @@ ext4_xattr_set_acl(struct dentry *dentry + + retry: + handle = ext4_journal_start(inode, EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); +- if (IS_ERR(handle)) +- return PTR_ERR(handle); ++ if (IS_ERR(handle)) { ++ error = PTR_ERR(handle); ++ goto release_and_out; ++ } + error = ext4_set_acl(handle, inode, type, acl); + ext4_journal_stop(handle); + if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) diff --git a/queue-3.0/mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch b/queue-3.0/mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch new file mode 100644 index 00000000000..754a0932993 --- /dev/null +++ b/queue-3.0/mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch @@ -0,0 +1,68 @@ +From b9fbb62eb61452d728c39b2e5020739c575aac53 Mon Sep 17 00:00:00 2001 +From: Charles Keepax +Date: Fri, 9 Nov 2012 16:15:28 +0000 +Subject: mfd: Only unregister platform devices allocated by the mfd core + +From: Charles Keepax + +commit b9fbb62eb61452d728c39b2e5020739c575aac53 upstream. + +mfd_remove_devices would iterate over all devices sharing a parent with +an mfd device regardless of whether they were allocated by the mfd core +or not. This especially caused problems when the device structure was +not contained within a platform_device, because to_platform_device is +used on each device pointer. + +This patch defines a device_type for mfd devices and checks this is +present from mfd_remove_devices_fn before processing the device. + +Signed-off-by: Charles Keepax +Tested-by: Peter Tyser +Reviewed-by: Mark Brown +Signed-off-by: Samuel Ortiz +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mfd/mfd-core.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/drivers/mfd/mfd-core.c ++++ b/drivers/mfd/mfd-core.c +@@ -18,6 +18,10 @@ + #include + #include + ++static struct device_type mfd_dev_type = { ++ .name = "mfd_device", ++}; ++ + int mfd_cell_enable(struct platform_device *pdev) + { + const struct mfd_cell *cell = mfd_get_cell(pdev); +@@ -87,6 +91,7 @@ static int mfd_add_device(struct device + goto fail_device; + + pdev->dev.parent = parent; ++ pdev->dev.type = &mfd_dev_type; + + if (cell->pdata_size) { + ret = platform_device_add_data(pdev, +@@ -182,10 +187,16 @@ EXPORT_SYMBOL(mfd_add_devices); + + static int mfd_remove_devices_fn(struct device *dev, void *c) + { +- struct platform_device *pdev = to_platform_device(dev); +- const struct mfd_cell *cell = mfd_get_cell(pdev); ++ struct platform_device *pdev; ++ const struct mfd_cell *cell; + atomic_t **usage_count = c; + ++ if (dev->type != &mfd_dev_type) ++ return 0; ++ ++ pdev = to_platform_device(dev); ++ cell = mfd_get_cell(pdev); ++ + /* find the base address of usage_count pointers (for freeing) */ + if (!*usage_count || (cell->usage_count < *usage_count)) + *usage_count = cell->usage_count; diff --git a/queue-3.0/series b/queue-3.0/series index e633fbe7b68..38aa3108e78 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -12,3 +12,5 @@ sata_promise-fix-hardreset-lockdep-error.patch libata-set-dma_mode-to-0xff-in-reset.patch libata-fix-null-pointer-dereference-on-disk-error.patch target-tcm_fc-fix-the-lockdep-warning-due-to-inconsistent-lock-state.patch +mfd-only-unregister-platform-devices-allocated-by-the-mfd-core.patch +ext4-fix-memory-leak-in-ext4_xattr_set_acl-s-error-path.patch -- 2.47.3