On Fri, Mar 27, 2020 at 08:15:37PM +0300, Max Gurtovoy wrote: > From: Israel Rukshin <israelr@xxxxxxxxxxxx> > > Allocate the metadata SGL buffers and set metadata fields for the > request. This is a preparation for adding metadata support over the > fabrics. I don't think having this as a separate prep patch is a good idea, it should go with the code making use of it. > - req->transfer_len); > - if (req->sg) { > - req->p2p_dev = p2p_dev; > - return 0; > + data_len); > + if (!req->sg) > + goto fallback; > + > + if (req->md_len) { > + req->md_sg = > + pci_p2pmem_alloc_sgl(p2p_dev, > + &req->md_sg_cnt, > + req->md_len); > + if (!req->md_sg) { > + pci_p2pmem_free_sgl(req->p2p_dev, > + req->sg); > + goto fallback; > + } > } > + req->p2p_dev = p2p_dev; > + return 0; > } > > /* > @@ -984,23 +1001,40 @@ int nvmet_req_alloc_sgl(struct nvmet_req *req) > */ > } > > - req->sg = sgl_alloc(req->transfer_len, GFP_KERNEL, &req->sg_cnt); > +fallback: > + req->sg = sgl_alloc(data_len, GFP_KERNEL, &req->sg_cnt); > if (unlikely(!req->sg)) > return -ENOMEM; > > + if (req->md_len) { > + req->md_sg = sgl_alloc(req->md_len, GFP_KERNEL, > + &req->md_sg_cnt); > + if (unlikely(!req->md_sg)) { > + sgl_free(req->sg); > + return -ENOMEM; > + } > + } > + > return 0; > } > EXPORT_SYMBOL_GPL(nvmet_req_alloc_sgl); I suspect this might be a little cleaner with a nvmet_alloc_sgl helper that returns a scatterlist instead of duplicating all the code for data vs metadata.