On Fri, 2018-10-19 at 15:55 -0400, Douglas Gilbert wrote:
> On 2018-10-19 11:22 a.m., Bart Van Assche wrote:
> > On Fri, 2018-10-19 at 02:24 -0400, Douglas Gilbert wrote:
> > > static void
> > > -sg_fill_request_table(struct sg_fd *sfp, struct sg_req_info *rinfo)
> > > +sg_fill_request_table(struct sg_fd *sfp, struct sg_req_info *rinfo,
> > > +                     int max_num)
> > >   {
> > >          struct sg_request *srp;
> > >          int val;
> > > -       unsigned int ms;
> > >   
> > >          val = 0;
> > > -       list_for_each_entry(srp, &sfp->rq_list, entry) {
> > > -               if (val >= SG_MAX_QUEUE)
> > > -                       break;
> > > -               rinfo[val].req_state = srp->done + 1;
> > > +       list_for_each_entry(srp, &sfp->rq_list, rq_entry) {
> > > +               if (val >= max_num)
> > > +                       return;
> > 
> > What protects the sfp->rq_list against concurrent changes? It seems to me
> > like all other code that iterates over or modifies that list protects that
> > list with rq_list_lock?
> 
> Bart,
> The function is called from sg_ioctl() case SG_GET_REQUEST_TABLE and at the
> call point the read_lock is held on rq_list_lock. Maybe I can add a comment
> above the function about the lock being held. [At least it is as the end
> of the patch series, and that is all I care about :-)]

Hi Doug,

Thanks for the clarification. How about adding a __must_hold() annotation?

Bart.

Reply via email to