Uploaded image for project: 'Lustre'
  1. Lustre
  2. LU-16077

Cannot use tbf to filter brw request per effective uid/gid, inode attr ids is used instead

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • Major
    • Lustre 2.16.0
    • None
    • None
    • 3
    • 9223372036854775807

    Description

      Recently, we had to limit a user on an OST of products (lot of libs in it). But we were not able to do that with TBF. After some tries, we were able to set a limit, but with the GID's owner.
      Setting this limit, globally decrease the bandwidth for everybody (all files in the products have the same uid/gid).

      The TBF rules on an OST get the uid/gid values from:

      static int ost_tbf_id_cli_set(struct ptlrpc_request *req,
                                    struct tbf_id *id)         
              struct ost_body *body; 
      ...
                       id->ti_uid = body->oa.o_uid;
                       id->ti_gid = body->oa.o_gid;
      

      These values are filled by the osc here:

      int osc_build_rpc(const struct lu_env *env, struct client_obd *cli,
                        struct list_head *ext_list, int cmd)             
      ....
               crattr->cra_oa = oa;                      
               cl_req_attr_set(env, osc2cl(obj), crattr);
      
      
      static int                                                            
      osc_brw_prep_request(int cmd, struct client_obd *cli, struct obdo *oa,
                           u32 page_count, struct brw_page **pga,           
                           struct ptlrpc_request **reqp, int resend)        
      .....
              lustre_set_wire_obdo(&req->rq_import->imp_connect_data, &body->oa, oa); 
                                                                                      
              /* For READ and WRITE, we can't fill o_uid and o_gid using from_kuid()  
               * and from_kgid(), because they are asynchronous. Fortunately, variable
               * oa contains valid o_uid and o_gid in these two operations.           
               * Besides, filling o_uid and o_gid is enough for nrs-tbf, see LU-9658. 
               * OBD_MD_FLUID and OBD_MD_FLUID is not set in order to avoid breaking  
               * other process logic */                                               
              body->oa.o_uid = oa->o_uid;                                             
              body->oa.o_gid = oa->o_gid;                                             
      

      So the uid/gid use to filter the request came directly from the inode attr.

      Attachments

        Issue Links

          Activity

            People

              eaujames Etienne Aujames
              eaujames Etienne Aujames
              Votes:
              0 Vote for this issue
              Watchers:
              9 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: