<br><br><div class="gmail_quote">On Sun, Mar 25, 2012 at 9:49 PM, Mike Snitzer <span dir="ltr"><<a href="mailto:snitzer@redhat.com" target="_blank">snitzer@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>On Sun, Mar 25 2012 at  7:54pm -0400,<br>
Mike Snitzer <<a href="mailto:snitzer@redhat.com" target="_blank">snitzer@redhat.com</a>> wrote:<br>
<br>
> On Sun, Mar 25 2012 at  6:46pm -0400,<br>
> Amar Mudrankit <<a href="mailto:amar.mudrankit@gmail.com" target="_blank">amar.mudrankit@gmail.com</a>> wrote:<br>
><br>
> > Hi all,<br>
> ><br>
> > I am building an experimental device mapper target which is supposed to<br>
> > receive<br>
> > all TRIM requests (REQ_DISCARD).  Irrespective of whether underlying actual<br>
> > physical block device supports discards or not, my device mapper target<br>
> > should<br>
> > receive REQ_DISCARD bios.<br>
><br>
> I'm just curious but: what will your target do in general?<br></div></blockquote><div><br>Target is somewhat similar to what a Flash Translation Layer does in SSDs, but not<br>
as fancy as that.  So, when my target maintains logical -> physical mapping, my target<br>
will be interested in which blocks are free from file system perspective, a typical use<br>
case of TRIM.  I guess somewhat similar to thin-provisioning.<br><br></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>
><br>
> > In my target, I set:<br>
> ><br>
> > ti->num_discard_requests = 1;<br>
> > ti->discards_supported = 1;<br>
><br>
> You'll also want to set ti->discards_supported<br>
><br>
> see: <a href="http://git.kernel.org/linus/4c259327" target="_blank">http://git.kernel.org/linus/4c259327</a><br>
<br>
</div>ah, I now see you already did set discards_supported.<br>
<div><br>
> > So, if my device mapper target does not implement iterate_devices function<br>
> > (used to set max_discard_sectors based on underlying physical device's<br>
> > discard<br>
> > support) or underlying physical device does not support discards, then there<br>
> > is no way for device mapper target to set max_discard_sectors more than 0<br>
> > to receive REQ_DISCARD commands.<br>
> ><br>
> > Is this analysis correct? Or I am missing something?<br>
><br>
> All DM targets should implement .iterate_devices -- intent is to iterate<br>
> over all data devices.<br>
><br>
> You'll also want to implement .io_hints to set limits->max_discard_sectors<br>
> (like drivers/md/dm-thin.c does).<br>
<br>
</div>BTW, the dm-thin.c discard changes will be merged in 3.4, you can see<br>
the relevant patches here:<br>
<br>
<a href="http://people.redhat.com/agk/patches/linux/editing/dm-thin-support-discards.patch" target="_blank">http://people.redhat.com/agk/patches/linux/editing/dm-thin-support-discards.patch</a><br>
<a href="http://people.redhat.com/agk/patches/linux/editing/dm_thin-add-pool-target-flags-to-control-discard.patch" target="_blank">http://people.redhat.com/agk/patches/linux/editing/dm_thin-add-pool-target-flags-to-control-discard.patch</a><br>

</blockquote><div><br>With io_hints function pointer, I set max_discard_sectors and it is getting set properly,  and I<br></div><div>was able to receive and process TRIM requests.</div><div><br></div><div>Thank you Mike for the help !!</div>
</div><br>Thanks and Regards,<br>Amar<br>