Re: [PATCH 2/4] target: Move subdev release logic into ->release() callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 2, 2011 at 9:26 AM, Nicholas A. Bellinger
<nab@xxxxxxxxxxxxxxx> wrote:
> From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx>
>
> This patch moves the se_free_virtual_device() / se_subsystem_api->free_device()
> and subsequent release of struct se_subsystem_dev memory to inside of the
> configfs callback target_core_dev_item_ops->release() called from within
> fs/configfs/item.c:config_item_cleanup() context.  This patch resolves the
> following SLUB 'Poison overwritten' warning when calling target_core_drop_subdev()
> -> kfree(se_dev) directly after config_item_put():
>
> [ 5147.638639] =============================================================================
> [ 5147.638959] BUG kmalloc-4096: Poison overwritten
> [ 5147.639124] -----------------------------------------------------------------------------
> [ 5147.639124]
> [ 5147.639294] INFO: 0xffff88000d2f887c-0xffff88000d2f887c. First byte 0x6a instead of 0x6b
> [ 5147.639294] INFO: Allocated in kzalloc+0xf/0x11 [target_core_mod] age=2602 cpu=0 pid=14639
> [ 5147.639294] INFO: Freed in target_core_drop_subdev+0x18d/0x199 [target_core_mod] age=25 cpu=0 pid=14654
> [ 5147.639294] INFO: Slab 0xffffea00002e2640 objects=7 used=1 fp=0xffff88000d2f8000 flags=0x1000000000040c1
> [ 5147.639294] INFO: Object 0xffff88000d2f8000 @offset=0 fp=0xffff88000d2fb0d8
>
> Cc: Joel Becker <jlbec@xxxxxxxxxxxx>
> Cc: Christoph Hellwig <hch@xxxxxx>
> Signed-off-by: Nicholas A. Bellinger <nab@xxxxxxxxxxxxxxx>
> ---
>  drivers/target/target_core_configfs.c |   64 ++++++++++++++++-----------------
>  1 files changed, 31 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
> index ccb5554..3715c91 100644
> --- a/drivers/target/target_core_configfs.c
> +++ b/drivers/target/target_core_configfs.c
> @@ -2004,9 +2004,35 @@ static void target_core_dev_release(struct config_item *item)
>  {
>        struct se_subsystem_dev *se_dev = container_of(to_config_group(item),
>                                struct se_subsystem_dev, se_dev_group);
> +       struct se_hba *hba = item_to_hba(&se_dev->se_dev_hba->hba_group.cg_item);
> +       struct se_subsystem_api *t = hba->transport;
>        struct config_group *dev_cg = &se_dev->se_dev_group;
>
>        kfree(dev_cg->default_groups);
> +       /*
> +        * This pointer will set when the storage is enabled with:
> +        *`echo 1 > $CONFIGFS/core/$HBA/$DEV/dev_enable`
> +        */
> +       if (se_dev->se_dev_ptr) {
> +               printk(KERN_INFO "Target_Core_ConfigFS: Calling se_free_"
> +                       "virtual_device() for se_dev_ptr: %p\n",
> +                       se_dev->se_dev_ptr);
> +
> +               se_free_virtual_device(se_dev->se_dev_ptr, hba);
> +       } else {
> +               /*
> +                * Release struct se_subsystem_dev->se_dev_su_ptr..
> +                */
> +               printk(KERN_INFO "Target_Core_ConfigFS: Calling t->free_"
> +                       "device() for se_dev_su_ptr: %p\n",
> +                       se_dev->se_dev_su_ptr);
> +
> +               t->free_device(se_dev->se_dev_su_ptr);
> +       }
> +
> +       printk(KERN_INFO "Target_Core_ConfigFS: Deallocating se_subsystem"
> +                       "_dev_t: %p\n", se_dev);
> +       kfree(se_dev);
>  }
>
>  static ssize_t target_core_dev_show(struct config_item *item,
> @@ -2847,13 +2873,11 @@ static void target_core_drop_subdev(
>        struct se_subsystem_api *t;
>        struct config_item *df_item;
>        struct config_group *dev_cg, *tg_pt_gp_cg, *dev_stat_grp;
> -       int i, ret;
> +       int i;
>
>        hba = item_to_hba(&se_dev->se_dev_hba->hba_group.cg_item);
>
> -       if (mutex_lock_interruptible(&hba->hba_access_mutex))
> -               goto out;
> -
> +       mutex_lock(&hba->hba_access_mutex);
>        t = hba->transport;
>
>        spin_lock(&se_global->g_device_lock);
> @@ -2884,38 +2908,12 @@ static void target_core_drop_subdev(
>                dev_cg->default_groups[i] = NULL;
>                config_item_put(df_item);
>        }
> -
> -       config_item_put(item);
>        /*
> -        * This pointer will set when the storage is enabled with:
> -        * `echo 1 > $CONFIGFS/core/$HBA/$DEV/dev_enable`
> +        * The releasing of se_dev and associated se_dev->se_dev_ptr is done
> +        * from target_core_dev_item_ops->release() ->target_core_dev_release().
>         */
> -       if (se_dev->se_dev_ptr) {
> -               printk(KERN_INFO "Target_Core_ConfigFS: Calling se_free_"
> -                       "virtual_device() for se_dev_ptr: %p\n",
> -                               se_dev->se_dev_ptr);
> -
> -               ret = se_free_virtual_device(se_dev->se_dev_ptr, hba);
> -               if (ret < 0)
> -                       goto hba_out;
> -       } else {
> -               /*
> -                * Release struct se_subsystem_dev->se_dev_su_ptr..
> -                */
> -               printk(KERN_INFO "Target_Core_ConfigFS: Calling t->free_"
> -                       "device() for se_dev_su_ptr: %p\n",
> -                       se_dev->se_dev_su_ptr);
> -
> -               t->free_device(se_dev->se_dev_su_ptr);
> -       }
> -
> -       printk(KERN_INFO "Target_Core_ConfigFS: Deallocating se_subsystem"
> -               "_dev_t: %p\n", se_dev);
> -
> -hba_out:
> +       config_item_put(item);
>        mutex_unlock(&hba->hba_access_mutex);
> -out:
> -       kfree(se_dev);
>  }
>
>  static struct configfs_group_operations target_core_hba_group_ops = {

Hello Nicholas,

How to apply this patch ? This is what I get:

# git diff v2.6.38-rc2 | wc
      0       0       0
# patch -p1 < ../p2.patch
patching file drivers/target/target_core_configfs.c
Hunk #1 FAILED at 2004.
Hunk #2 FAILED at 2847.
Hunk #3 succeeded at 2800 (offset -84 lines).
2 out of 3 hunks FAILED -- saving rejects to file
drivers/target/target_core_configfs.c.rej

Fubo.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux