RE: [dm-devel] [PATCH 3/4] dm: convert dm_dev_internal.count from atomic_t to refcount_t

2017-11-28 Thread Reshetova, Elena

> 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

2017-11-28 Thread Reshetova, Elena

> 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

2017-11-24 Thread Mike Snitzer
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

2017-11-24 Thread Mike Snitzer
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

2017-11-23 Thread Reshetova, Elena
> 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

2017-11-23 Thread Reshetova, Elena
> 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

2017-11-23 Thread Alasdair G Kergon
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

2017-11-23 Thread Alasdair G Kergon
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