diff mbox

xfs: Allow user to kill fstrim process

Message ID 1493282368-32422-1-git-send-email-lczerner@redhat.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Lukas Czerner April 27, 2017, 8:39 a.m. UTC
fstrim can take really long time on big, slow device or on file system
with a lots of allocation groups. Currently there is no way for the user
to cancell the operation. This patch makes it possible for the user to
kill fstrim pocess by adding the check for fatal_signal_pending() in
xfs_trim_extents().

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 fs/xfs/xfs_discard.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Eric Sandeen April 27, 2017, 2:34 p.m. UTC | #1
On 4/27/17 3:39 AM, Lukas Czerner wrote:
> fstrim can take really long time on big, slow device or on file system
> with a lots of allocation groups. Currently there is no way for the user
> to cancell the operation. This patch makes it possible for the user to
> kill fstrim pocess by adding the check for fatal_signal_pending() in
> xfs_trim_extents().

With this patch, it seems that if it is killed, then nothing is copied
back to the user about the number of blocks trimmed before the kill.

Is that intentional?

I think it could be done in a way that the progress until the kill
does get reported, and that might be more useful?

Thanks,
-Eric

> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
> ---
>  fs/xfs/xfs_discard.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
> index d796ffa..6a05d27 100644
> --- a/fs/xfs/xfs_discard.c
> +++ b/fs/xfs/xfs_discard.c
> @@ -132,6 +132,11 @@ xfs_trim_extents(
>  		error = xfs_btree_decrement(cur, 0, &i);
>  		if (error)
>  			goto out_del_cursor;
> +
> +		if (fatal_signal_pending(current)) {
> +			error = -ERESTARTSYS;
> +			goto out_del_cursor;
> +		}
>  	}
>  
>  out_del_cursor:
> @@ -196,8 +201,11 @@ xfs_ioc_trim(
>  	for (agno = start_agno; agno <= end_agno; agno++) {
>  		error = xfs_trim_extents(mp, agno, start, end, minlen,
>  					  &blocks_trimmed);
> -		if (error)
> +		if (error) {
>  			last_error = error;
> +			if (error == -ERESTARTSYS)
> +				break;
> +		}
>  	}
>  
>  	if (last_error)
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick J. Wong April 27, 2017, 3:38 p.m. UTC | #2
On Thu, Apr 27, 2017 at 09:34:04AM -0500, Eric Sandeen wrote:
> On 4/27/17 3:39 AM, Lukas Czerner wrote:
> > fstrim can take really long time on big, slow device or on file system
> > with a lots of allocation groups. Currently there is no way for the user
> > to cancell the operation. This patch makes it possible for the user to
> > kill fstrim pocess by adding the check for fatal_signal_pending() in
> > xfs_trim_extents().
> 
> With this patch, it seems that if it is killed, then nothing is copied
> back to the user about the number of blocks trimmed before the kill.
> 
> Is that intentional?
> 
> I think it could be done in a way that the progress until the kill
> does get reported, and that might be more useful?

AFAICT ext4 doesn't report anything if somoene ERESTARTSYS's it...

> 
> Thanks,
> -Eric
> 
> > Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> > Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
> > ---
> >  fs/xfs/xfs_discard.c | 10 +++++++++-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> > 
> > diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
> > index d796ffa..6a05d27 100644
> > --- a/fs/xfs/xfs_discard.c
> > +++ b/fs/xfs/xfs_discard.c
> > @@ -132,6 +132,11 @@ xfs_trim_extents(
> >  		error = xfs_btree_decrement(cur, 0, &i);
> >  		if (error)
> >  			goto out_del_cursor;
> > +
> > +		if (fatal_signal_pending(current)) {

...but the process isn't going to be around to care anyway, right?

--D

> > +			error = -ERESTARTSYS;
> > +			goto out_del_cursor;
> > +		}
> >  	}
> >  
> >  out_del_cursor:
> > @@ -196,8 +201,11 @@ xfs_ioc_trim(
> >  	for (agno = start_agno; agno <= end_agno; agno++) {
> >  		error = xfs_trim_extents(mp, agno, start, end, minlen,
> >  					  &blocks_trimmed);
> > -		if (error)
> > +		if (error) {
> >  			last_error = error;
> > +			if (error == -ERESTARTSYS)
> > +				break;
> > +		}
> >  	}
> >  
> >  	if (last_error)
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen April 27, 2017, 3:46 p.m. UTC | #3
On 4/27/17 10:38 AM, Darrick J. Wong wrote:
> On Thu, Apr 27, 2017 at 09:34:04AM -0500, Eric Sandeen wrote:
>> On 4/27/17 3:39 AM, Lukas Czerner wrote:
>>> fstrim can take really long time on big, slow device or on file system
>>> with a lots of allocation groups. Currently there is no way for the user
>>> to cancell the operation. This patch makes it possible for the user to
>>> kill fstrim pocess by adding the check for fatal_signal_pending() in
>>> xfs_trim_extents().
>>
>> With this patch, it seems that if it is killed, then nothing is copied
>> back to the user about the number of blocks trimmed before the kill.
>>
>> Is that intentional?
>>
>> I think it could be done in a way that the progress until the kill
>> does get reported, and that might be more useful?
> 
> AFAICT ext4 doesn't report anything if somoene ERESTARTSYS's it...

Well we aren't ext4, are we?  ;)

actually, it seems that it may report "count" as ERESTARTSYS in:

        ext4_debug("trimmed %d blocks in the group %d\n",
                count, group);

But yeah, although it does update the &range values, they don't
get copied out on any error.

Anyway, ok, ext4 doesn't.  Is there a reason that we shouldn't?

Thanks,
-Eric

>>
>> Thanks,
>> -Eric
>>
>>> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
>>> Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
>>> ---
>>>  fs/xfs/xfs_discard.c | 10 +++++++++-
>>>  1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
>>> index d796ffa..6a05d27 100644
>>> --- a/fs/xfs/xfs_discard.c
>>> +++ b/fs/xfs/xfs_discard.c
>>> @@ -132,6 +132,11 @@ xfs_trim_extents(
>>>  		error = xfs_btree_decrement(cur, 0, &i);
>>>  		if (error)
>>>  			goto out_del_cursor;
>>> +
>>> +		if (fatal_signal_pending(current)) {
> 
> ...but the process isn't going to be around to care anyway, right?
> 
> --D
> 
>>> +			error = -ERESTARTSYS;
>>> +			goto out_del_cursor;
>>> +		}
>>>  	}
>>>  
>>>  out_del_cursor:
>>> @@ -196,8 +201,11 @@ xfs_ioc_trim(
>>>  	for (agno = start_agno; agno <= end_agno; agno++) {
>>>  		error = xfs_trim_extents(mp, agno, start, end, minlen,
>>>  					  &blocks_trimmed);
>>> -		if (error)
>>> +		if (error) {
>>>  			last_error = error;
>>> +			if (error == -ERESTARTSYS)
>>> +				break;
>>> +		}
>>>  	}
>>>  
>>>  	if (last_error)
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen April 27, 2017, 3:50 p.m. UTC | #4
On 4/27/17 10:46 AM, Eric Sandeen wrote:
> On 4/27/17 10:38 AM, Darrick J. Wong wrote:
>> On Thu, Apr 27, 2017 at 09:34:04AM -0500, Eric Sandeen wrote:
>>> On 4/27/17 3:39 AM, Lukas Czerner wrote:
>>>> fstrim can take really long time on big, slow device or on file system
>>>> with a lots of allocation groups. Currently there is no way for the user
>>>> to cancell the operation. This patch makes it possible for the user to
>>>> kill fstrim pocess by adding the check for fatal_signal_pending() in
>>>> xfs_trim_extents().
>>>
>>> With this patch, it seems that if it is killed, then nothing is copied
>>> back to the user about the number of blocks trimmed before the kill.
>>>
>>> Is that intentional?
>>>
>>> I think it could be done in a way that the progress until the kill
>>> does get reported, and that might be more useful?
>>
>> AFAICT ext4 doesn't report anything if somoene ERESTARTSYS's it...
> 
> Well we aren't ext4, are we?  ;)
> 
> actually, it seems that it may report "count" as ERESTARTSYS in:
> 
>         ext4_debug("trimmed %d blocks in the group %d\n",
>                 count, group);
> 
> But yeah, although it does update the &range values, they don't
> get copied out on any error.
> 
> Anyway, ok, ext4 doesn't.  Is there a reason that we shouldn't?

Ok I am probably misunderstanding how things work, maybe it's
not actually possible (he says after a little experimentation.)
Feel free to ignore me on this one.  :)

-Eric
 
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen April 27, 2017, 3:55 p.m. UTC | #5
On 4/27/17 3:39 AM, Lukas Czerner wrote:
> fstrim can take really long time on big, slow device or on file system
> with a lots of allocation groups. Currently there is no way for the user
> to cancell the operation. This patch makes it possible for the user to
> kill fstrim pocess by adding the check for fatal_signal_pending() in
> xfs_trim_extents().
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> Reported-by: Zdenek Kabelac <zkabelac@redhat.com>

Sorry for the detour while I got confused about signals.  ;)

This looks ok to me.  Thanks!

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> ---
>  fs/xfs/xfs_discard.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
> index d796ffa..6a05d27 100644
> --- a/fs/xfs/xfs_discard.c
> +++ b/fs/xfs/xfs_discard.c
> @@ -132,6 +132,11 @@ xfs_trim_extents(
>  		error = xfs_btree_decrement(cur, 0, &i);
>  		if (error)
>  			goto out_del_cursor;
> +
> +		if (fatal_signal_pending(current)) {
> +			error = -ERESTARTSYS;
> +			goto out_del_cursor;
> +		}
>  	}
>  
>  out_del_cursor:
> @@ -196,8 +201,11 @@ xfs_ioc_trim(
>  	for (agno = start_agno; agno <= end_agno; agno++) {
>  		error = xfs_trim_extents(mp, agno, start, end, minlen,
>  					  &blocks_trimmed);
> -		if (error)
> +		if (error) {
>  			last_error = error;
> +			if (error == -ERESTARTSYS)
> +				break;
> +		}
>  	}
>  
>  	if (last_error)
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick J. Wong April 27, 2017, 9:04 p.m. UTC | #6
On Thu, Apr 27, 2017 at 10:39:28AM +0200, Lukas Czerner wrote:
> fstrim can take really long time on big, slow device or on file system
> with a lots of allocation groups. Currently there is no way for the user
> to cancell the operation. This patch makes it possible for the user to
> kill fstrim pocess by adding the check for fatal_signal_pending() in
> xfs_trim_extents().
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> Reported-by: Zdenek Kabelac <zkabelac@redhat.com>

Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> ---
>  fs/xfs/xfs_discard.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
> index d796ffa..6a05d27 100644
> --- a/fs/xfs/xfs_discard.c
> +++ b/fs/xfs/xfs_discard.c
> @@ -132,6 +132,11 @@ xfs_trim_extents(
>  		error = xfs_btree_decrement(cur, 0, &i);
>  		if (error)
>  			goto out_del_cursor;
> +
> +		if (fatal_signal_pending(current)) {
> +			error = -ERESTARTSYS;
> +			goto out_del_cursor;
> +		}
>  	}
>  
>  out_del_cursor:
> @@ -196,8 +201,11 @@ xfs_ioc_trim(
>  	for (agno = start_agno; agno <= end_agno; agno++) {
>  		error = xfs_trim_extents(mp, agno, start, end, minlen,
>  					  &blocks_trimmed);
> -		if (error)
> +		if (error) {
>  			last_error = error;
> +			if (error == -ERESTARTSYS)
> +				break;
> +		}
>  	}
>  
>  	if (last_error)
> -- 
> 2.7.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lukas Czerner April 28, 2017, 8:22 a.m. UTC | #7
On Thu, Apr 27, 2017 at 10:50:02AM -0500, Eric Sandeen wrote:
> On 4/27/17 10:46 AM, Eric Sandeen wrote:
> > On 4/27/17 10:38 AM, Darrick J. Wong wrote:
> >> On Thu, Apr 27, 2017 at 09:34:04AM -0500, Eric Sandeen wrote:
> >>> On 4/27/17 3:39 AM, Lukas Czerner wrote:
> >>>> fstrim can take really long time on big, slow device or on file system
> >>>> with a lots of allocation groups. Currently there is no way for the user
> >>>> to cancell the operation. This patch makes it possible for the user to
> >>>> kill fstrim pocess by adding the check for fatal_signal_pending() in
> >>>> xfs_trim_extents().
> >>>
> >>> With this patch, it seems that if it is killed, then nothing is copied
> >>> back to the user about the number of blocks trimmed before the kill.
> >>>
> >>> Is that intentional?
> >>>
> >>> I think it could be done in a way that the progress until the kill
> >>> does get reported, and that might be more useful?
> >>
> >> AFAICT ext4 doesn't report anything if somoene ERESTARTSYS's it...
> > 
> > Well we aren't ext4, are we?  ;)
> > 
> > actually, it seems that it may report "count" as ERESTARTSYS in:
> > 
> >         ext4_debug("trimmed %d blocks in the group %d\n",
> >                 count, group);
> > 
> > But yeah, although it does update the &range values, they don't
> > get copied out on any error.
> > 
> > Anyway, ok, ext4 doesn't.  Is there a reason that we shouldn't?
> 
> Ok I am probably misunderstanding how things work, maybe it's
> not actually possible (he says after a little experimentation.)
> Feel free to ignore me on this one.  :)
> 
> -Eric

Hi Eric,

I agree with Darrick, at the moment fstrim is not sticikng around to
care, I am not even sure if it can stick around to care.

Thanks!
-Lukas
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c
index d796ffa..6a05d27 100644
--- a/fs/xfs/xfs_discard.c
+++ b/fs/xfs/xfs_discard.c
@@ -132,6 +132,11 @@  xfs_trim_extents(
 		error = xfs_btree_decrement(cur, 0, &i);
 		if (error)
 			goto out_del_cursor;
+
+		if (fatal_signal_pending(current)) {
+			error = -ERESTARTSYS;
+			goto out_del_cursor;
+		}
 	}
 
 out_del_cursor:
@@ -196,8 +201,11 @@  xfs_ioc_trim(
 	for (agno = start_agno; agno <= end_agno; agno++) {
 		error = xfs_trim_extents(mp, agno, start, end, minlen,
 					  &blocks_trimmed);
-		if (error)
+		if (error) {
 			last_error = error;
+			if (error == -ERESTARTSYS)
+				break;
+		}
 	}
 
 	if (last_error)