All of lore.kernel.org
 help / color / mirror / Atom feed
* tcmu: Reporting of errors detected by handler_read() before it returns
@ 2019-08-02 16:20 David Butterfield
  2019-08-02 16:27 ` Mike Christie
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: David Butterfield @ 2019-08-02 16:20 UTC (permalink / raw)
  To: target-devel

On 8/1/19 10:18 AM, Mike Christie wrote:
> Update your tcmu-runner git repo :)
> 
> A little bit ago, the comments in tcmu-runner.h were updated to make it
> clear what type of handler can do what, and also support for not having
> to call cmd->done in handlers like file_example was added.

I've pulled the latest master and the comment has been revised, but part
of my question still remains:

If the handler successfully completes execution of the block I/O command
in the callout function, what TCMU_STS code should it return from the
callout function?

It can't be TCMU_STS_OK, right?  Because that would leave tcmu-runner
expecting a call to cmd->done() later.

And it can't be a TCMU_STS error, because the I/O was successful.

So what does the handler return to indicate both success and completion?

125         /*
126          * Below callouts are only executed by generic_handle_cmd.
127          *
128          * Handlers that completely execute cmds from the callout's calling
129          * context must return a TCMU_STS code from the callout.
130          *
131          * Async handlers that queue a command from the callout and complete
132          * it from their own async context return:
133          * - TCMU_STS_OK if the handler has queued the command.
134          * - TCMU_STS_NO_RESOURCE if the handler was not able to allocate
135          *   resources to queue the command.
136          *
137          * If TCMU_STS_OK is returned from the callout the handler must call
138          * tcmur_cmd_complete with a TCMU_STS return code to complete the
139          * command.
140          */
141         int (*read)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
142                     struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
143         int (*write)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
144                      struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
145         int (*flush)(struct tcmu_device *dev, struct tcmur_cmd *cmd);


>> However, the code in file_example.c does not do either of those things, and directly
>> violates the comment in tcmu-runner.h -- this excerpt is from file_read():
>>
>> 	while (remaining) {
>> 		ret = preadv(state->fd, iov, iov_cnt, offset);
>> 		if (ret < 0) {
>> 			tcmu_err("read failed: %m\n");
>> 			ret = TCMU_STS_RD_ERR;
>> 			goto done;
>> 		}
>> 		...
>> 	}
>> 	ret = TCMU_STS_OK;
>> done:
>> 	return ret;
>>
>> The file_read() function operates synchronously, and never issues a call to cmd->done()
>> for successful reads returning TCMU_STS_OK, contradicting the comment in tcmu-runner.h.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: tcmu: Reporting of errors detected by handler_read() before it returns
  2019-08-02 16:20 tcmu: Reporting of errors detected by handler_read() before it returns David Butterfield
@ 2019-08-02 16:27 ` Mike Christie
  2019-08-08  5:50 ` David Butterfield
  2019-08-08 18:02 ` Michael Christie
  2 siblings, 0 replies; 4+ messages in thread
From: Mike Christie @ 2019-08-02 16:27 UTC (permalink / raw)
  To: target-devel

On 08/02/2019 11:20 AM, David Butterfield wrote:
> On 8/1/19 10:18 AM, Mike Christie wrote:
>> Update your tcmu-runner git repo :)
>>
>> A little bit ago, the comments in tcmu-runner.h were updated to make it
>> clear what type of handler can do what, and also support for not having
>> to call cmd->done in handlers like file_example was added.
> 
> I've pulled the latest master and the comment has been revised, but part
> of my question still remains:
> 
> If the handler successfully completes execution of the block I/O command
> in the callout function, what TCMU_STS code should it return from the
> callout function?
> 
> It can't be TCMU_STS_OK, right?  Because that would leave tcmu-runner
> expecting a call to cmd->done() later.
> 
> And it can't be a TCMU_STS error, because the I/O was successful.
> 
> So what does the handler return to indicate both success and completion?

What is says on line 128.

You must return a TCMU_STS code. It can TMCU_STS_OK or a TCMU_STS error
value like TCMU_STS_WR_ERR.

For handlers like file_example that operate like described on line 128,
tcmu-runner core will do cmd->done for it.


> 
> 125         /*
> 126          * Below callouts are only executed by generic_handle_cmd.
> 127          *
> 128          * Handlers that completely execute cmds from the callout's calling
> 129          * context must return a TCMU_STS code from the callout.
> 130          *
> 131          * Async handlers that queue a command from the callout and complete
> 132          * it from their own async context return:
> 133          * - TCMU_STS_OK if the handler has queued the command.
> 134          * - TCMU_STS_NO_RESOURCE if the handler was not able to allocate
> 135          *   resources to queue the command.
> 136          *
> 137          * If TCMU_STS_OK is returned from the callout the handler must call
> 138          * tcmur_cmd_complete with a TCMU_STS return code to complete the
> 139          * command.
> 140          */
> 141         int (*read)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
> 142                     struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
> 143         int (*write)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
> 144                      struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
> 145         int (*flush)(struct tcmu_device *dev, struct tcmur_cmd *cmd);
> 
> 
>>> However, the code in file_example.c does not do either of those things, and directly
>>> violates the comment in tcmu-runner.h -- this excerpt is from file_read():

file_example operates like described in line 128.

>>>
>>> 	while (remaining) {
>>> 		ret = preadv(state->fd, iov, iov_cnt, offset);
>>> 		if (ret < 0) {
>>> 			tcmu_err("read failed: %m\n");
>>> 			ret = TCMU_STS_RD_ERR;
>>> 			goto done;
>>> 		}
>>> 		...
>>> 	}
>>> 	ret = TCMU_STS_OK;
>>> done:
>>> 	return ret;
>>>
>>> The file_read() function operates synchronously, and never issues a call to cmd->done()
>>> for successful reads returning TCMU_STS_OK, contradicting the comment in tcmu-runner.h.
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: tcmu: Reporting of errors detected by handler_read() before it returns
  2019-08-02 16:20 tcmu: Reporting of errors detected by handler_read() before it returns David Butterfield
  2019-08-02 16:27 ` Mike Christie
@ 2019-08-08  5:50 ` David Butterfield
  2019-08-08 18:02 ` Michael Christie
  2 siblings, 0 replies; 4+ messages in thread
From: David Butterfield @ 2019-08-08  5:50 UTC (permalink / raw)
  To: target-devel

Thanks for your help.  I'm afraid I'm still confused somehow about this.

>> If the handler successfully completes execution of the block I/O command
>> in the callout function, what TCMU_STS code should it return from the
>> callout function
>
> What is says on line 128.
> 
> You must return a TCMU_STS code. It can TMCU_STS_OK or a TCMU_STS error
> value like TCMU_STS_WR_ERR.

So, then, line 137 is intended to apply only to line 131 and not line 128?
I was reading it as applying to both.

> For handlers like file_example that operate like described on line 128,
> tcmu-runner core will do cmd->done for it.

If TCMU_STS_OK is returned from file_read(), how does runner know whether that is

    (1) TCMU_STS_OK because the handler is async and it queued the command, and
	there will be a future call to tcmur_cmd_complete() from the handler; or

    (2) TCMU_STS_OK because the handler executed the entire command successfully
	and runner needs to issue the cmd->done for it now?

Also, I wonder why the return from async handlers for successful queueing
of the command is TCMU_STS_OK rather than TCMU_STS_ASYNC_HANDLED.

>> 125         /*
>> 126          * Below callouts are only executed by generic_handle_cmd.
>> 127          *
>> 128          * Handlers that completely execute cmds from the callout's calling
>> 129          * context must return a TCMU_STS code from the callout.
>> 130          *
>> 131          * Async handlers that queue a command from the callout and complete
>> 132          * it from their own async context return:
>> 133          * - TCMU_STS_OK if the handler has queued the command.
>> 134          * - TCMU_STS_NO_RESOURCE if the handler was not able to allocate
>> 135          *   resources to queue the command.
>> 136          *
>> 137          * If TCMU_STS_OK is returned from the callout the handler must call
>> 138          * tcmur_cmd_complete with a TCMU_STS return code to complete the
>> 139          * command.
>> 140          */
>> 141         int (*read)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
>> 142                     struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
>> 143         int (*write)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
>> 144                      struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
>> 145         int (*flush)(struct tcmu_device *dev, struct tcmur_cmd *cmd);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: tcmu: Reporting of errors detected by handler_read() before it returns
  2019-08-02 16:20 tcmu: Reporting of errors detected by handler_read() before it returns David Butterfield
  2019-08-02 16:27 ` Mike Christie
  2019-08-08  5:50 ` David Butterfield
@ 2019-08-08 18:02 ` Michael Christie
  2 siblings, 0 replies; 4+ messages in thread
From: Michael Christie @ 2019-08-08 18:02 UTC (permalink / raw)
  To: target-devel

On 08/08/2019 12:50 AM, David Butterfield wrote:
> Thanks for your help.  I'm afraid I'm still confused somehow about this.
> 
>>> If the handler successfully completes execution of the block I/O command
>>> in the callout function, what TCMU_STS code should it return from the
>>> callout function
>>
>> What is says on line 128.
>>
>> You must return a TCMU_STS code. It can TMCU_STS_OK or a TCMU_STS error
>> value like TCMU_STS_WR_ERR.
> 
> So, then, line 137 is intended to apply only to line 131 and not line 128?

Correct.

> I was reading it as applying to both.
> 
>> For handlers like file_example that operate like described on line 128,
>> tcmu-runner core will do cmd->done for it.
> 
> If TCMU_STS_OK is returned from file_read(), how does runner know whether that is
> 
>     (1) TCMU_STS_OK because the handler is async and it queued the command, and
> 	there will be a future call to tcmur_cmd_complete() from the handl>
>     (2) TCMU_STS_OK because the handler executed the entire command successfully
> 	and runner needs to issue the cmd->done for it now?

If you set nr_threads > 0 and implement the callouts below then
TCMU_STS_OK means you completed the command in the callout successfully.

If you set nr_threads = 0 and implement the callouts below then OK means
it got queued successfully and the handler is going to complete it by
calling tcmur_cmd_complete.

We do not have any handlers where nr_threads = 0, the callouts below are
implemented and the handler executes the command in the callout, so it's
not supported right now.


> 
> Also, I wonder why the return from async handlers for successful queueing
> of the command is TCMU_STS_OK rather than TCMU_STS_ASYNC_HANDLED.

It's just one of those things that needs to be cleaned up.

tcmu-runner uses it internally and when interacting with libtcmu, and
runner handlers that only implement a handle_cmd can use it directly.

> 
>>> 125         /*
>>> 126          * Below callouts are only executed by generic_handle_cmd.
>>> 127          *
>>> 128          * Handlers that completely execute cmds from the callout's calling
>>> 129          * context must return a TCMU_STS code from the callout.
>>> 130          *
>>> 131          * Async handlers that queue a command from the callout and complete
>>> 132          * it from their own async context return:
>>> 133          * - TCMU_STS_OK if the handler has queued the command.
>>> 134          * - TCMU_STS_NO_RESOURCE if the handler was not able to allocate
>>> 135          *   resources to queue the command.
>>> 136          *
>>> 137          * If TCMU_STS_OK is returned from the callout the handler must call
>>> 138          * tcmur_cmd_complete with a TCMU_STS return code to complete the
>>> 139          * command.
>>> 140          */
>>> 141         int (*read)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
>>> 142                     struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
>>> 143         int (*write)(struct tcmu_device *dev, struct tcmur_cmd *cmd,
>>> 144                      struct iovec *iovec, size_t iov_cnt, size_t len, off_t off);
>>> 145         int (*flush)(struct tcmu_device *dev, struct tcmur_cmd *cmd);
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-08-08 18:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-08-02 16:20 tcmu: Reporting of errors detected by handler_read() before it returns David Butterfield
2019-08-02 16:27 ` Mike Christie
2019-08-08  5:50 ` David Butterfield
2019-08-08 18:02 ` Michael Christie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.