Sorry for not explaining clearly. After the PVFS_isys_*() call completes immediately, we need to copy the results from the system
responses to the kernel by writing it to the device file.
The ->was_handled_inline member variable is actually set in write_inlined_device_response() which also does the kernel copy internally.
So what I meant to say was..
Uh, what? what do you mean by "copy the results to the downcall"?
Your post indicated that if the was_handled_inline member was set that
was all that was needed. Is something else needed? I don't know what a
downcall is or how to copy results there.
switch(ret) {
case SM_ACTION_TERMINATE:
vfs_request->out_downcall.type = vfs_request->in_upcall.type;
vfs_request->out_downcall.status = XX; /* This should be set to the return value of the isys_* call */
write_inlined_device_response(vfs_request);
/* Fall through */
case 0:
if (vfs_request->was_handled_inline) {
ret = repost_unexp_vfs_request(vfs_request, "..");
}
....
perhaps that explained it a little better I hope,
thanks,
Murali
Walt
Murali Vilayannur wrote:
> Hi Walt,
>
>> Maybe it would be simpler to modify the code as shown:
>>
>> >> /*
>> >> check if we need to repost the operation (in case of failure or
>> >> inlined handling/completion)
>> >> */
>> >> switch(ret)
>> >> {
>> case SM_ACTION_TERMINATE:
>> vfs->request->was_handled_inline = 1;
>
>
>
>
> Ok, that works too :)
> Just remember to copy the results to the downcall (calling the
> write_inlined_device_response should do the trick)
> before reposting the op.
> thanks,
> Murali
>
>> /* this code falls through to the next case */
>> >> case 0:
>> >> {
>> >> /*
>> >> if we've already completed the operation, just repost
>> >> the unexp request
>> >> */
>> >> if (vfs_request->was_handled_inline)
>> >> {
>> >> ret = repost_unexp_vfs_request(
>> >> vfs_request, "inlined completion");
>> >> }
>> >> else
>> >> {
>> >
>> >
>> > What we could do to retain this part of the code is to set the
>> > ->was_handled_inline member variable in all the post_*_request()
>> functions
>> > if the PVFS_isys_*() function indicated that the posted operation
>> finished
>> > immediately.
>> > If we do that, then we could retain this code as is without adding any
>> > more cases. Great catch!
>> > thanks,
>> > Murali
>> >
>> >
>> >> /*
>> >> otherwise, we've just properly posted a non-blocking
>> >> op; mark it as no longer a dev unexp msg and add it
>> >> to the ops in progress table
>> >> */
>> >> vfs_request->is_dev_unexp = 0;
>> >> ret = add_op_to_op_in_progress_table(vfs_request);
>> >>#if 0
>> >> assert(is_op_in_progress(vfs_request));
>> >>#endif
>> >> }
>> >> }
>> >> break;
>> >> case REMOUNT_PENDING:
>> >> ret = repost_unexp_vfs_request(
>> >> vfs_request, "mount pending");
>> >> break;
>> >> case OP_IN_PROGRESS:
>> >> ret = repost_unexp_vfs_request(
>> >> vfs_request, "op already in progress");
>> >> break;
>> >> default:
>> >> PVFS_perror_gossip("Operation failed", ret);
>> >> ret = repost_unexp_vfs_request(
>> >> vfs_request, "failure");
>> >> break;
>> >> }
>> >> return ret;
>> >>}
--
Dr. Walter B. Ligon III
Associate Professor
ECE Department
Clemson University
_______________________________________________ Pvfs2-developers mailing list [email protected] http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers
