)]}'
{
  "commit": "677e90eda3bd8cfde0b748daaa46476162a03950",
  "tree": "4b40614cf9cd125883d0430467be9172997ca184",
  "parents": [
    "6408f79cce401e1bfecf923e7156f84f96e021e3"
  ],
  "author": {
    "name": "Thomas Graf",
    "email": "tgraf@suug.ch",
    "time": "Thu Jun 23 20:59:51 2005 -0700"
  },
  "committer": {
    "name": "David S. Miller",
    "email": "davem@davemloft.net",
    "time": "Thu Jun 23 20:59:51 2005 -0700"
  },
  "message": "[NET]: Zerocopy sequential reading of skb data\n\nImplements sequential reading for both linear and non-linear\nskb data at zerocopy cost. The data is returned in chunks of\narbitary length, therefore random access is not possible.\n\nUsage:\n\tfrom\t :\u003d 0\n\tto\t :\u003d 128\n\tstate\t :\u003d undef\n\tdata\t :\u003d undef\n\tlen\t :\u003d undef\n\tconsumed :\u003d 0\n\n\tskb_prepare_seq_read(skb, from, to, \u0026state)\n\twhile (len \u003d skb_seq_read(consumed, \u0026data, \u0026state)) !\u003d 0 do\n\t\t/* do something with \u0027data\u0027 of length \u0027len\u0027 */\n\t\tif abort then\n\t\t\t/* abort read if we don\u0027t wait for\n\t\t\t * skb_seq_read() to return 0 */\n\t\t\tskb_abort_seq_read(\u0026state)\n\t\t\treturn\n\t\tendif\n\t\t/* not necessary to consume all of \u0027len\u0027 */\n\t\tconsumed +\u003d len\n\tdone\n\nSigned-off-by: Thomas Graf \u003ctgraf@suug.ch\u003e\nSigned-off-by: David S. Miller \u003cdavem@davemloft.net\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d7c839a21842ca03f360a0e16320bab6c8253f76",
      "old_mode": 33188,
      "old_path": "include/linux/skbuff.h",
      "new_id": "171a37dff83aa63baeffb6eec2949fabf59b9daa",
      "new_mode": 33188,
      "new_path": "include/linux/skbuff.h"
    },
    {
      "type": "modify",
      "old_id": "6d68c03bc0516291f71a3b98030d72ee8f71297f",
      "old_mode": 33188,
      "old_path": "net/core/skbuff.c",
      "new_id": "d285f2f7e812e6666df3a2da213c9f790a4f4abc",
      "new_mode": 33188,
      "new_path": "net/core/skbuff.c"
    }
  ]
}
