2011-01-28 14:11:13 -08:00
/*
* Copyright IBM Corporation , 2010
* Author Venkateswararao Jujjuri < jvrao @ linux . vnet . ibm . com >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it would be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
*
*/
# include <linux/slab.h>
# include <linux/module.h>
# include <net/9p/9p.h>
# include <net/9p/client.h>
# include <linux/scatterlist.h>
# include "trans_common.h"
/**
* p9_release_req_pages - Release pages after the transaction .
*/
2011-08-16 10:50:10 +05:30
void p9_release_pages ( struct page * * pages , int nr_pages )
2011-01-28 14:11:13 -08:00
{
int i = 0 ;
2011-08-16 10:50:10 +05:30
while ( pages [ i ] & & nr_pages - - ) {
put_page ( pages [ i ] ) ;
2011-01-28 14:11:13 -08:00
i + + ;
}
}
2011-08-16 10:50:10 +05:30
EXPORT_SYMBOL ( p9_release_pages ) ;
2011-01-28 14:11:13 -08:00
/**
2011-03-30 22:57:33 -03:00
* p9_nr_pages - Return number of pages needed to accommodate the payload .
2011-01-28 14:11:13 -08:00
*/
2011-08-16 10:50:10 +05:30
int p9_nr_pages ( char * data , int len )
2011-01-28 14:11:13 -08:00
{
2011-03-08 16:39:47 +05:30
unsigned long start_page , end_page ;
2011-08-16 10:50:10 +05:30
start_page = ( unsigned long ) data > > PAGE_SHIFT ;
end_page = ( ( unsigned long ) data + len + PAGE_SIZE - 1 ) > > PAGE_SHIFT ;
2011-01-28 14:11:13 -08:00
return end_page - start_page ;
}
EXPORT_SYMBOL ( p9_nr_pages ) ;
/**
* payload_gup - Translates user buffer into kernel pages and
* pins them either for read / write through get_user_pages_fast ( ) .
* @ req : Request to be sent to server .
* @ pdata_off : data offset into the first page after translation ( gup ) .
* @ pdata_len : Total length of the IO . gup may not return requested # of pages .
2011-03-30 22:57:33 -03:00
* @ nr_pages : number of pages to accommodate the payload
2011-01-28 14:11:13 -08:00
* @ rw : Indicates if the pages are for read or write .
*/
2011-08-16 10:50:10 +05:30
int p9_payload_gup ( char * data , int * nr_pages , struct page * * pages , int write )
{
int nr_mapped_pages ;
2011-01-28 14:11:13 -08:00
2011-08-16 10:50:10 +05:30
nr_mapped_pages = get_user_pages_fast ( ( unsigned long ) data ,
* nr_pages , write , pages ) ;
if ( nr_mapped_pages < = 0 )
return nr_mapped_pages ;
2011-01-28 14:11:13 -08:00
2011-08-16 10:50:10 +05:30
* nr_pages = nr_mapped_pages ;
2011-01-28 14:11:13 -08:00
return 0 ;
}
EXPORT_SYMBOL ( p9_payload_gup ) ;