trans_common.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright IBM Corporation, 2010
  3. * Author Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2.1 of the GNU Lesser General Public License
  7. * as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it would be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. *
  13. */
  14. #include <linux/slab.h>
  15. #include <linux/module.h>
  16. #include <net/9p/9p.h>
  17. #include <net/9p/client.h>
  18. #include <linux/scatterlist.h>
  19. #include "trans_common.h"
  20. /**
  21. * p9_release_req_pages - Release pages after the transaction.
  22. */
  23. void p9_release_pages(struct page **pages, int nr_pages)
  24. {
  25. int i;
  26. for (i = 0; i < nr_pages; i++)
  27. if (pages[i])
  28. put_page(pages[i]);
  29. }
  30. EXPORT_SYMBOL(p9_release_pages);
  31. /**
  32. * p9_nr_pages - Return number of pages needed to accommodate the payload.
  33. */
  34. int p9_nr_pages(char *data, int len)
  35. {
  36. unsigned long start_page, end_page;
  37. start_page = (unsigned long)data >> PAGE_SHIFT;
  38. end_page = ((unsigned long)data + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
  39. return end_page - start_page;
  40. }
  41. EXPORT_SYMBOL(p9_nr_pages);
  42. /**
  43. * payload_gup - Translates user buffer into kernel pages and
  44. * pins them either for read/write through get_user_pages_fast().
  45. * @req: Request to be sent to server.
  46. * @pdata_off: data offset into the first page after translation (gup).
  47. * @pdata_len: Total length of the IO. gup may not return requested # of pages.
  48. * @nr_pages: number of pages to accommodate the payload
  49. * @rw: Indicates if the pages are for read or write.
  50. */
  51. int p9_payload_gup(char *data, int *nr_pages, struct page **pages, int write)
  52. {
  53. int nr_mapped_pages;
  54. nr_mapped_pages = get_user_pages_fast((unsigned long)data,
  55. *nr_pages, write, pages);
  56. if (nr_mapped_pages <= 0)
  57. return nr_mapped_pages;
  58. *nr_pages = nr_mapped_pages;
  59. return 0;
  60. }
  61. EXPORT_SYMBOL(p9_payload_gup);