RE: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
> On Fri, Nov 24, 2017 at 2:36 AM, Reshetova, Elena >wrote: > >> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > >> > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > >> > r = upgrade_mode(dd, mode, t->md); > >> > if (r) > >> > return r; > >> > + refcount_inc(>count); > >> > } > >> > >> Missing here: > >> > >> else > >> refcount_inc(>count); > >> > >> ? > > > > Oh, yes, thanks for catching this! I think this got unnoticed so far and > > patch was > merged, so I am going to send a followup patch now. > > I pushed this fix and will send to Linus next week: > https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux- > dm.git/commit/?h=dm-4.15=d908af82d06cc420f9581c97c6db941cb87e4434 I guess you mean this commit: https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=for-next=c2318d07ead871f058dda62e942ed7b6b1c1cfcf Unfortunately it is not correct: diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 88130b5..f6d32ee 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -451,15 +451,15 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode, return r; } - refcount_set(>count, 1); + refcount_set(>count, 0); list_add(>list, >devices); } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { r = upgrade_mode(dd, mode, t->md); if (r) return r; - refcount_inc(>count); } + refcount_inc(>count); Problem will be here if you hit this refcount_inc() after the refcount_set(>count, 0) earlier. refcount_inc() does not increment on zero value *ever* for security reasons and instead people should initialize refcounters to 1 always and do increments from there if needed. This was the reason for the initial change I did, my mistake was just to forget to increment it also in case condition (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) fails. I have issues with my intel smpt server for sending patches (I will get it fixed tomorrow from internal network), so I am attaching the patch I did end of last week to this thread instead (or alternatively can properly send it tomorrow after fix). Sorry for the delay! Best Regards, Elena. 0001-dm-fix-the-missing-increment-for-dm_dev_internal.cou.patch Description: 0001-dm-fix-the-missing-increment-for-dm_dev_internal.cou.patch
RE: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
> On Fri, Nov 24, 2017 at 2:36 AM, Reshetova, Elena > wrote: > >> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > >> > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > >> > r = upgrade_mode(dd, mode, t->md); > >> > if (r) > >> > return r; > >> > + refcount_inc(>count); > >> > } > >> > >> Missing here: > >> > >> else > >> refcount_inc(>count); > >> > >> ? > > > > Oh, yes, thanks for catching this! I think this got unnoticed so far and > > patch was > merged, so I am going to send a followup patch now. > > I pushed this fix and will send to Linus next week: > https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux- > dm.git/commit/?h=dm-4.15=d908af82d06cc420f9581c97c6db941cb87e4434 I guess you mean this commit: https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=for-next=c2318d07ead871f058dda62e942ed7b6b1c1cfcf Unfortunately it is not correct: diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 88130b5..f6d32ee 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -451,15 +451,15 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode, return r; } - refcount_set(>count, 1); + refcount_set(>count, 0); list_add(>list, >devices); } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { r = upgrade_mode(dd, mode, t->md); if (r) return r; - refcount_inc(>count); } + refcount_inc(>count); Problem will be here if you hit this refcount_inc() after the refcount_set(>count, 0) earlier. refcount_inc() does not increment on zero value *ever* for security reasons and instead people should initialize refcounters to 1 always and do increments from there if needed. This was the reason for the initial change I did, my mistake was just to forget to increment it also in case condition (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) fails. I have issues with my intel smpt server for sending patches (I will get it fixed tomorrow from internal network), so I am attaching the patch I did end of last week to this thread instead (or alternatively can properly send it tomorrow after fix). Sorry for the delay! Best Regards, Elena. 0001-dm-fix-the-missing-increment-for-dm_dev_internal.cou.patch Description: 0001-dm-fix-the-missing-increment-for-dm_dev_internal.cou.patch
Re: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
On Fri, Nov 24, 2017 at 2:36 AM, Reshetova, Elenawrote: >> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: >> > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { >> > r = upgrade_mode(dd, mode, t->md); >> > if (r) >> > return r; >> > + refcount_inc(>count); >> > } >> >> Missing here: >> >> else >> refcount_inc(>count); >> >> ? > > Oh, yes, thanks for catching this! I think this got unnoticed so far and > patch was merged, so I am going to send a followup patch now. I pushed this fix and will send to Linus next week: https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=dm-4.15=d908af82d06cc420f9581c97c6db941cb87e4434
Re: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
On Fri, Nov 24, 2017 at 2:36 AM, Reshetova, Elena wrote: >> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: >> > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { >> > r = upgrade_mode(dd, mode, t->md); >> > if (r) >> > return r; >> > + refcount_inc(>count); >> > } >> >> Missing here: >> >> else >> refcount_inc(>count); >> >> ? > > Oh, yes, thanks for catching this! I think this got unnoticed so far and > patch was merged, so I am going to send a followup patch now. I pushed this fix and will send to Linus next week: https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=dm-4.15=d908af82d06cc420f9581c97c6db941cb87e4434
RE: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > > r = upgrade_mode(dd, mode, t->md); > > if (r) > > return r; > > + refcount_inc(>count); > > } > > Missing here: > > else > refcount_inc(>count); > > ? Oh, yes, thanks for catching this! I think this got unnoticed so far and patch was merged, so I am going to send a followup patch now. Best Regards, Elena. > > Alasdair
RE: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
> On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > > r = upgrade_mode(dd, mode, t->md); > > if (r) > > return r; > > + refcount_inc(>count); > > } > > Missing here: > > else > refcount_inc(>count); > > ? Oh, yes, thanks for catching this! I think this got unnoticed so far and patch was merged, so I am going to send a followup patch now. Best Regards, Elena. > > Alasdair
Re: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > r = upgrade_mode(dd, mode, t->md); > if (r) > return r; > + refcount_inc(>count); > } Missing here: else refcount_inc(>count); ? Alasdair
Re: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t
On Fri, Oct 20, 2017 at 10:37:38AM +0300, Elena Reshetova wrote: > } else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) { > r = upgrade_mode(dd, mode, t->md); > if (r) > return r; > + refcount_inc(>count); > } Missing here: else refcount_inc(>count); ? Alasdair