2007-07-11 02:57:28 +04:00
/*
* net / 9 p / clnt . c
*
* 9 P Client
*
2008-02-07 04:25:03 +03:00
* Copyright ( C ) 2008 by Eric Van Hensbergen < ericvh @ gmail . com >
2007-07-11 02:57:28 +04:00
* Copyright ( C ) 2007 by Latchesar Ionkov < lucho @ ionkov . net >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to :
* Free Software Foundation
* 51 Franklin Street , Fifth Floor
* Boston , MA 02111 - 1301 USA
*
*/
# include <linux/module.h>
# include <linux/errno.h>
# include <linux/fs.h>
2008-02-07 04:25:03 +03:00
# include <linux/poll.h>
2007-07-11 02:57:28 +04:00
# include <linux/idr.h>
# include <linux/mutex.h>
# include <linux/sched.h>
# include <linux/uaccess.h>
# include <net/9p/9p.h>
2007-10-17 23:31:07 +04:00
# include <linux/parser.h>
2007-07-11 02:57:28 +04:00
# include <net/9p/client.h>
2008-10-14 03:45:25 +04:00
# include <net/9p/transport.h>
2008-10-16 17:30:07 +04:00
# include "protocol.h"
2007-07-11 02:57:28 +04:00
2008-02-07 04:25:03 +03:00
/*
* Client Option Parsing ( code inspired by NFS code )
* - a little lazy - parse all client options
*/
enum {
Opt_msize ,
Opt_trans ,
Opt_legacy ,
Opt_err ,
} ;
2008-10-13 13:46:57 +04:00
static const match_table_t tokens = {
2008-02-07 04:25:03 +03:00
{ Opt_msize , " msize=%u " } ,
{ Opt_legacy , " noextend " } ,
{ Opt_trans , " trans=%s " } ,
{ Opt_err , NULL } ,
} ;
2008-10-16 17:30:07 +04:00
static struct p9_req_t *
p9_client_rpc ( struct p9_client * c , int8_t type , const char * fmt , . . . ) ;
2008-10-14 03:45:21 +04:00
2008-02-07 04:25:03 +03:00
/**
* v9fs_parse_options - parse mount options into session structure
* @ options : options string passed from mount
* @ v9ses : existing v9fs session information
*
2008-03-07 19:53:53 +03:00
* Return 0 upon success , - ERRNO upon failure
2008-02-07 04:25:03 +03:00
*/
2008-03-07 19:53:53 +03:00
static int parse_opts ( char * opts , struct p9_client * clnt )
2008-02-07 04:25:03 +03:00
{
2008-03-07 19:53:53 +03:00
char * options ;
2008-02-07 04:25:03 +03:00
char * p ;
substring_t args [ MAX_OPT_ARGS ] ;
int option ;
2008-03-07 19:53:53 +03:00
int ret = 0 ;
2008-02-07 04:25:03 +03:00
clnt - > dotu = 1 ;
clnt - > msize = 8192 ;
2008-03-07 19:53:53 +03:00
if ( ! opts )
return 0 ;
options = kstrdup ( opts , GFP_KERNEL ) ;
if ( ! options ) {
P9_DPRINTK ( P9_DEBUG_ERROR ,
" failed to allocate copy of option string \n " ) ;
return - ENOMEM ;
}
2008-02-07 04:25:03 +03:00
while ( ( p = strsep ( & options , " , " ) ) ! = NULL ) {
int token ;
if ( ! * p )
continue ;
token = match_token ( p , tokens , args ) ;
if ( token < Opt_trans ) {
2008-03-07 19:53:53 +03:00
int r = match_int ( & args [ 0 ] , & option ) ;
if ( r < 0 ) {
2008-02-07 04:25:03 +03:00
P9_DPRINTK ( P9_DEBUG_ERROR ,
" integer field, but no integer? \n " ) ;
2008-03-07 19:53:53 +03:00
ret = r ;
2008-02-07 04:25:03 +03:00
continue ;
}
}
switch ( token ) {
case Opt_msize :
clnt - > msize = option ;
break ;
case Opt_trans :
2008-09-25 01:22:23 +04:00
clnt - > trans_mod = v9fs_get_trans_by_name ( & args [ 0 ] ) ;
2008-02-07 04:25:03 +03:00
break ;
case Opt_legacy :
clnt - > dotu = 0 ;
break ;
default :
continue ;
}
}
2008-09-25 01:22:23 +04:00
2008-03-07 19:53:53 +03:00
kfree ( options ) ;
return ret ;
2008-02-07 04:25:03 +03:00
}
2008-10-14 03:45:23 +04:00
/**
* p9_tag_alloc - lookup / allocate a request by tag
* @ c : client session to lookup tag within
* @ tag : numeric id for transaction
*
* this is a simple array lookup , but will grow the
* request_slots as necessary to accomodate transaction
* ids which did not previously have a slot .
*
* this code relies on the client spinlock to manage locks , its
* possible we should switch to something else , but I ' d rather
* stick with something low - overhead for the common case .
*
*/
2008-10-16 17:30:07 +04:00
static struct p9_req_t * p9_tag_alloc ( struct p9_client * c , u16 tag )
2008-10-14 03:45:23 +04:00
{
unsigned long flags ;
int row , col ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2008-10-14 03:45:23 +04:00
/* This looks up the original request by tag so we know which
* buffer to read the data into */
tag + + ;
if ( tag > = c - > max_tag ) {
spin_lock_irqsave ( & c - > lock , flags ) ;
/* check again since original check was outside of lock */
while ( tag > = c - > max_tag ) {
row = ( tag / P9_ROW_MAXTAG ) ;
c - > reqs [ row ] = kcalloc ( P9_ROW_MAXTAG ,
sizeof ( struct p9_req_t ) , GFP_ATOMIC ) ;
if ( ! c - > reqs [ row ] ) {
printk ( KERN_ERR " Couldn't grow tag array \n " ) ;
2008-10-23 03:54:47 +04:00
spin_unlock_irqrestore ( & c - > lock , flags ) ;
2008-10-16 17:30:07 +04:00
return ERR_PTR ( - ENOMEM ) ;
2008-10-14 03:45:23 +04:00
}
for ( col = 0 ; col < P9_ROW_MAXTAG ; col + + ) {
c - > reqs [ row ] [ col ] . status = REQ_STATUS_IDLE ;
2008-10-16 17:30:07 +04:00
c - > reqs [ row ] [ col ] . tc = NULL ;
2008-10-14 03:45:23 +04:00
}
c - > max_tag + = P9_ROW_MAXTAG ;
}
spin_unlock_irqrestore ( & c - > lock , flags ) ;
}
row = tag / P9_ROW_MAXTAG ;
col = tag % P9_ROW_MAXTAG ;
2008-10-16 17:30:07 +04:00
req = & c - > reqs [ row ] [ col ] ;
if ( ! req - > tc ) {
req - > wq = kmalloc ( sizeof ( wait_queue_head_t ) , GFP_KERNEL ) ;
if ( ! req - > wq ) {
printk ( KERN_ERR " Couldn't grow tag array \n " ) ;
return ERR_PTR ( - ENOMEM ) ;
}
init_waitqueue_head ( req - > wq ) ;
req - > tc = kmalloc ( sizeof ( struct p9_fcall ) + c - > msize ,
GFP_KERNEL ) ;
req - > rc = kmalloc ( sizeof ( struct p9_fcall ) + c - > msize ,
GFP_KERNEL ) ;
if ( ( ! req - > tc ) | | ( ! req - > rc ) ) {
printk ( KERN_ERR " Couldn't grow tag array \n " ) ;
kfree ( req - > tc ) ;
kfree ( req - > rc ) ;
2008-10-24 01:33:25 +04:00
kfree ( req - > wq ) ;
req - > tc = req - > rc = NULL ;
req - > wq = NULL ;
2008-10-16 17:30:07 +04:00
return ERR_PTR ( - ENOMEM ) ;
}
req - > tc - > sdata = ( char * ) req - > tc + sizeof ( struct p9_fcall ) ;
req - > tc - > capacity = c - > msize ;
req - > rc - > sdata = ( char * ) req - > rc + sizeof ( struct p9_fcall ) ;
req - > rc - > capacity = c - > msize ;
}
p9pdu_reset ( req - > tc ) ;
p9pdu_reset ( req - > rc ) ;
req - > tc - > tag = tag - 1 ;
req - > status = REQ_STATUS_ALLOC ;
2008-10-14 03:45:23 +04:00
return & c - > reqs [ row ] [ col ] ;
}
/**
* p9_tag_lookup - lookup a request by tag
* @ c : client session to lookup tag within
* @ tag : numeric id for transaction
*
*/
struct p9_req_t * p9_tag_lookup ( struct p9_client * c , u16 tag )
{
int row , col ;
/* This looks up the original request by tag so we know which
* buffer to read the data into */
tag + + ;
BUG_ON ( tag > = c - > max_tag ) ;
row = tag / P9_ROW_MAXTAG ;
col = tag % P9_ROW_MAXTAG ;
return & c - > reqs [ row ] [ col ] ;
}
EXPORT_SYMBOL ( p9_tag_lookup ) ;
/**
* p9_tag_init - setup tags structure and contents
* @ tags : tags structure from the client struct
*
* This initializes the tags structure for each client instance .
*
*/
static int p9_tag_init ( struct p9_client * c )
{
int err = 0 ;
c - > tagpool = p9_idpool_create ( ) ;
if ( IS_ERR ( c - > tagpool ) ) {
err = PTR_ERR ( c - > tagpool ) ;
c - > tagpool = NULL ;
goto error ;
}
p9_idpool_get ( c - > tagpool ) ; /* reserve tag 0 */
c - > max_tag = 0 ;
error :
return err ;
}
/**
* p9_tag_cleanup - cleans up tags structure and reclaims resources
* @ tags : tags structure from the client struct
*
* This frees resources associated with the tags structure
*
*/
static void p9_tag_cleanup ( struct p9_client * c )
{
int row , col ;
/* check to insure all requests are idle */
for ( row = 0 ; row < ( c - > max_tag / P9_ROW_MAXTAG ) ; row + + ) {
for ( col = 0 ; col < P9_ROW_MAXTAG ; col + + ) {
if ( c - > reqs [ row ] [ col ] . status ! = REQ_STATUS_IDLE ) {
P9_DPRINTK ( P9_DEBUG_MUX ,
" Attempting to cleanup non-free tag %d,%d \n " ,
row , col ) ;
/* TODO: delay execution of cleanup */
return ;
}
}
}
if ( c - > tagpool )
p9_idpool_destroy ( c - > tagpool ) ;
/* free requests associated with tags */
for ( row = 0 ; row < ( c - > max_tag / P9_ROW_MAXTAG ) ; row + + ) {
2008-10-16 17:30:07 +04:00
for ( col = 0 ; col < P9_ROW_MAXTAG ; col + + ) {
2008-10-14 03:45:23 +04:00
kfree ( c - > reqs [ row ] [ col ] . wq ) ;
2008-10-16 17:30:07 +04:00
kfree ( c - > reqs [ row ] [ col ] . tc ) ;
kfree ( c - > reqs [ row ] [ col ] . rc ) ;
}
2008-10-14 03:45:23 +04:00
kfree ( c - > reqs [ row ] ) ;
}
c - > max_tag = 0 ;
}
2008-10-14 03:45:22 +04:00
/**
* p9_free_req - free a request and clean - up as necessary
* c : client state
* r : request to release
*
*/
2008-10-16 17:30:07 +04:00
static void p9_free_req ( struct p9_client * c , struct p9_req_t * r )
2008-10-14 03:45:22 +04:00
{
2008-10-16 17:30:07 +04:00
int tag = r - > tc - > tag ;
P9_DPRINTK ( P9_DEBUG_MUX , " clnt %p req %p tag: %d \n " , c , r , tag ) ;
2008-10-14 03:45:22 +04:00
r - > status = REQ_STATUS_IDLE ;
2008-10-16 17:30:07 +04:00
if ( tag ! = P9_NOTAG & & p9_idpool_check ( tag , c - > tagpool ) )
p9_idpool_put ( tag , c - > tagpool ) ;
2008-10-14 03:45:22 +04:00
}
2008-10-14 03:45:21 +04:00
/**
* p9_client_cb - call back from transport to client
* c : client state
* req : request received
*
*/
void p9_client_cb ( struct p9_client * c , struct p9_req_t * req )
{
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " tag %d \n " , req - > tc - > tag ) ;
2009-04-06 01:28:59 +04:00
wake_up ( req - > wq ) ;
P9_DPRINTK ( P9_DEBUG_MUX , " wakeup: %d \n " , req - > tc - > tag ) ;
2008-10-14 03:45:21 +04:00
}
EXPORT_SYMBOL ( p9_client_cb ) ;
2008-10-16 17:30:07 +04:00
/**
* p9_parse_header - parse header arguments out of a packet
* @ pdu : packet to parse
* @ size : size of packet
* @ type : type of request
* @ tag : tag of packet
* @ rewind : set if we need to rewind offset afterwards
*/
int
p9_parse_header ( struct p9_fcall * pdu , int32_t * size , int8_t * type , int16_t * tag ,
int rewind )
{
int8_t r_type ;
int16_t r_tag ;
int32_t r_size ;
int offset = pdu - > offset ;
int err ;
pdu - > offset = 0 ;
if ( pdu - > size = = 0 )
pdu - > size = 7 ;
err = p9pdu_readf ( pdu , 0 , " dbw " , & r_size , & r_type , & r_tag ) ;
if ( err )
goto rewind_and_exit ;
pdu - > size = r_size ;
pdu - > id = r_type ;
pdu - > tag = r_tag ;
2008-10-18 01:20:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< size=%d type: %d tag: %d \n " , pdu - > size ,
pdu - > id , pdu - > tag ) ;
2008-10-16 17:30:07 +04:00
if ( type )
* type = r_type ;
if ( tag )
* tag = r_tag ;
if ( size )
* size = r_size ;
rewind_and_exit :
if ( rewind )
pdu - > offset = offset ;
return err ;
}
EXPORT_SYMBOL ( p9_parse_header ) ;
/**
* p9_check_errors - check 9 p packet for error return and process it
* @ c : current client instance
* @ req : request to parse and check for error conditions
*
* returns error code if one is discovered , otherwise returns 0
*
* this will have to be more complicated if we have multiple
* error packet types
*/
static int p9_check_errors ( struct p9_client * c , struct p9_req_t * req )
{
int8_t type ;
int err ;
err = p9_parse_header ( req - > rc , NULL , & type , NULL , 0 ) ;
if ( err ) {
P9_DPRINTK ( P9_DEBUG_ERROR , " couldn't parse header %d \n " , err ) ;
return err ;
}
if ( type = = P9_RERROR ) {
int ecode ;
char * ename ;
err = p9pdu_readf ( req - > rc , c - > dotu , " s?d " , & ename , & ecode ) ;
if ( err ) {
P9_DPRINTK ( P9_DEBUG_ERROR , " couldn't parse error%d \n " ,
err ) ;
return err ;
}
if ( c - > dotu )
err = - ecode ;
if ( ! err ) {
err = p9_errstr2errno ( ename , strlen ( ename ) ) ;
/* string match failed */
if ( ! err )
err = - ESERVERFAULT ;
}
P9_DPRINTK ( P9_DEBUG_9P , " <<< RERROR (%d) %s \n " , - ecode , ename ) ;
kfree ( ename ) ;
} else
err = 0 ;
return err ;
}
/**
* p9_client_flush - flush ( cancel ) a request
* c : client state
* req : request to cancel
*
* This sents a flush for a particular requests and links
* the flush request to the original request . The current
* code only supports a single flush request although the protocol
* allows for multiple flush requests to be sent for a single request .
*
*/
static int p9_client_flush ( struct p9_client * c , struct p9_req_t * oldreq )
{
struct p9_req_t * req ;
int16_t oldtag ;
int err ;
err = p9_parse_header ( oldreq - > tc , NULL , NULL , & oldtag , 1 ) ;
if ( err )
return err ;
P9_DPRINTK ( P9_DEBUG_9P , " >>> TFLUSH tag %d \n " , oldtag ) ;
req = p9_client_rpc ( c , P9_TFLUSH , " w " , oldtag ) ;
if ( IS_ERR ( req ) )
return PTR_ERR ( req ) ;
2009-04-06 01:28:59 +04:00
/* if we haven't received a response for oldreq,
remove it from the list . */
spin_lock ( & c - > lock ) ;
if ( oldreq - > status = = REQ_STATUS_FLSH )
list_del ( & oldreq - > req_list ) ;
spin_unlock ( & c - > lock ) ;
p9_free_req ( c , req ) ;
2008-10-16 17:30:07 +04:00
return 0 ;
}
2008-10-14 03:45:21 +04:00
/**
* p9_client_rpc - issue a request and wait for a response
* @ c : client session
2008-10-16 17:30:07 +04:00
* @ type : type of request
* @ fmt : protocol format string ( see protocol . c )
2008-10-14 03:45:21 +04:00
*
2008-10-16 17:30:07 +04:00
* Returns request structure ( which client must free using p9_free_req )
2008-10-14 03:45:21 +04:00
*/
2008-10-16 17:30:07 +04:00
static struct p9_req_t *
p9_client_rpc ( struct p9_client * c , int8_t type , const char * fmt , . . . )
2008-10-14 03:45:21 +04:00
{
2008-10-16 17:30:07 +04:00
va_list ap ;
int tag , err ;
2008-10-14 03:45:21 +04:00
struct p9_req_t * req ;
unsigned long flags ;
int sigpending ;
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " client %p op %d \n " , c , type ) ;
2008-10-14 03:45:21 +04:00
if ( c - > status ! = Connected )
2008-10-16 17:30:07 +04:00
return ERR_PTR ( - EIO ) ;
2008-10-14 03:45:21 +04:00
if ( signal_pending ( current ) ) {
sigpending = 1 ;
clear_thread_flag ( TIF_SIGPENDING ) ;
} else
sigpending = 0 ;
tag = P9_NOTAG ;
2008-10-16 17:30:07 +04:00
if ( type ! = P9_TVERSION ) {
2008-10-14 03:45:21 +04:00
tag = p9_idpool_get ( c - > tagpool ) ;
if ( tag < 0 )
2008-10-16 17:30:07 +04:00
return ERR_PTR ( - ENOMEM ) ;
2008-10-14 03:45:21 +04:00
}
req = p9_tag_alloc ( c , tag ) ;
2008-10-16 17:30:07 +04:00
if ( IS_ERR ( req ) )
return req ;
2008-10-14 03:45:21 +04:00
2008-10-16 17:30:07 +04:00
/* marshall the data */
p9pdu_prepare ( req - > tc , tag , type ) ;
va_start ( ap , fmt ) ;
err = p9pdu_vwritef ( req - > tc , c - > dotu , fmt , ap ) ;
va_end ( ap ) ;
p9pdu_finalize ( req - > tc ) ;
2008-10-14 03:45:21 +04:00
err = c - > trans_mod - > request ( c , req ) ;
if ( err < 0 ) {
c - > status = Disconnected ;
goto reterr ;
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " wait %p tag: %d \n " , req - > wq , tag ) ;
2008-10-14 03:45:21 +04:00
err = wait_event_interruptible ( * req - > wq ,
req - > status > = REQ_STATUS_RCVD ) ;
2009-04-06 01:28:59 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " wait %p tag: %d returned %d \n " ,
req - > wq , tag , err ) ;
2008-10-14 03:45:21 +04:00
if ( req - > status = = REQ_STATUS_ERROR ) {
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_ERROR , " req_status error %d \n " , req - > t_err ) ;
2008-10-14 03:45:21 +04:00
err = req - > t_err ;
}
2009-04-06 01:28:59 +04:00
if ( ( err = = - ERESTARTSYS ) & & ( c - > status = = Connected ) ) {
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " flushing \n " ) ;
2008-10-14 03:45:21 +04:00
sigpending = 1 ;
clear_thread_flag ( TIF_SIGPENDING ) ;
2009-04-06 01:28:59 +04:00
if ( c - > trans_mod - > cancel ( c , req ) )
p9_client_flush ( c , req ) ;
/* if we received the response anyway, don't signal error */
if ( req - > status = = REQ_STATUS_RCVD )
err = 0 ;
2008-10-14 03:45:21 +04:00
}
if ( sigpending ) {
spin_lock_irqsave ( & current - > sighand - > siglock , flags ) ;
recalc_sigpending ( ) ;
spin_unlock_irqrestore ( & current - > sighand - > siglock , flags ) ;
}
if ( err < 0 )
goto reterr ;
2008-10-16 17:30:07 +04:00
err = p9_check_errors ( c , req ) ;
if ( ! err ) {
P9_DPRINTK ( P9_DEBUG_MUX , " exit: client %p op %d \n " , c , type ) ;
return req ;
2008-10-14 03:45:21 +04:00
}
reterr :
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " exit: client %p op %d error: %d \n " , c , type ,
err ) ;
2008-10-14 03:45:21 +04:00
p9_free_req ( c , req ) ;
2008-10-16 17:30:07 +04:00
return ERR_PTR ( err ) ;
2008-10-14 03:45:21 +04:00
}
2008-10-14 03:45:24 +04:00
static struct p9_fid * p9_fid_create ( struct p9_client * clnt )
{
2008-10-28 22:22:43 +03:00
int ret ;
2008-10-14 03:45:24 +04:00
struct p9_fid * fid ;
2008-10-24 01:31:02 +04:00
unsigned long flags ;
2008-10-14 03:45:24 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_FID , " clnt %p \n " , clnt ) ;
2008-10-14 03:45:24 +04:00
fid = kmalloc ( sizeof ( struct p9_fid ) , GFP_KERNEL ) ;
if ( ! fid )
return ERR_PTR ( - ENOMEM ) ;
2008-10-28 22:22:43 +03:00
ret = p9_idpool_get ( clnt - > fidpool ) ;
2009-01-19 08:32:11 +03:00
if ( ret < 0 ) {
2008-10-28 22:22:43 +03:00
ret = - ENOSPC ;
2008-10-14 03:45:24 +04:00
goto error ;
}
2008-10-28 22:22:43 +03:00
fid - > fid = ret ;
2008-10-14 03:45:24 +04:00
memset ( & fid - > qid , 0 , sizeof ( struct p9_qid ) ) ;
fid - > mode = - 1 ;
fid - > rdir_fpos = 0 ;
2008-11-14 02:38:44 +03:00
fid - > uid = current_fsuid ( ) ;
2008-10-14 03:45:24 +04:00
fid - > clnt = clnt ;
fid - > aux = NULL ;
2008-10-24 01:31:02 +04:00
spin_lock_irqsave ( & clnt - > lock , flags ) ;
2008-10-14 03:45:24 +04:00
list_add ( & fid - > flist , & clnt - > fidlist ) ;
2008-10-24 01:31:02 +04:00
spin_unlock_irqrestore ( & clnt - > lock , flags ) ;
2008-10-14 03:45:24 +04:00
return fid ;
error :
kfree ( fid ) ;
2008-10-28 22:22:43 +03:00
return ERR_PTR ( ret ) ;
2008-10-14 03:45:24 +04:00
}
static void p9_fid_destroy ( struct p9_fid * fid )
{
struct p9_client * clnt ;
2008-10-24 01:31:02 +04:00
unsigned long flags ;
2008-10-14 03:45:24 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_FID , " fid %d \n " , fid - > fid ) ;
2008-10-14 03:45:24 +04:00
clnt = fid - > clnt ;
p9_idpool_put ( fid - > fid , clnt - > fidpool ) ;
2008-10-24 01:31:02 +04:00
spin_lock_irqsave ( & clnt - > lock , flags ) ;
2008-10-14 03:45:24 +04:00
list_del ( & fid - > flist ) ;
2008-10-24 01:31:02 +04:00
spin_unlock_irqrestore ( & clnt - > lock , flags ) ;
2008-10-14 03:45:24 +04:00
kfree ( fid ) ;
}
2008-02-07 04:25:03 +03:00
2008-10-16 17:30:07 +04:00
int p9_client_version ( struct p9_client * c )
2007-07-11 02:57:28 +04:00
{
2008-10-14 05:36:14 +04:00
int err = 0 ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
char * version ;
int msize ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TVERSION msize %d extended %d \n " ,
c - > msize , c - > dotu ) ;
req = p9_client_rpc ( c , P9_TVERSION , " ds " , c - > msize ,
c - > dotu ? " 9P2000.u " : " 9P2000 " ) ;
if ( IS_ERR ( req ) )
return PTR_ERR ( req ) ;
2008-10-14 05:36:14 +04:00
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , c - > dotu , " ds " , & msize , & version ) ;
if ( err ) {
P9_DPRINTK ( P9_DEBUG_9P , " version error %d \n " , err ) ;
2008-10-18 01:20:07 +04:00
p9pdu_dump ( 1 , req - > rc ) ;
2008-10-14 05:36:14 +04:00
goto error ;
2008-10-16 17:30:07 +04:00
}
2008-10-14 05:36:14 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RVERSION msize %d %s \n " , msize , version ) ;
if ( ! memcmp ( version , " 9P2000.u " , 8 ) )
c - > dotu = 1 ;
else if ( ! memcmp ( version , " 9P2000 " , 6 ) )
c - > dotu = 0 ;
2008-10-14 05:36:14 +04:00
else {
err = - EREMOTEIO ;
goto error ;
}
2008-10-16 17:30:07 +04:00
if ( msize < c - > msize )
c - > msize = msize ;
2008-10-14 05:36:14 +04:00
error :
2008-10-16 17:30:07 +04:00
kfree ( version ) ;
p9_free_req ( c , req ) ;
2008-10-14 05:36:14 +04:00
return err ;
}
2008-10-16 17:30:07 +04:00
EXPORT_SYMBOL ( p9_client_version ) ;
2008-10-14 05:36:14 +04:00
struct p9_client * p9_client_create ( const char * dev_name , char * options )
{
int err ;
struct p9_client * clnt ;
err = 0 ;
2007-07-11 02:57:28 +04:00
clnt = kmalloc ( sizeof ( struct p9_client ) , GFP_KERNEL ) ;
if ( ! clnt )
return ERR_PTR ( - ENOMEM ) ;
2008-09-25 01:22:23 +04:00
clnt - > trans_mod = NULL ;
2008-03-07 19:53:53 +03:00
clnt - > trans = NULL ;
2007-07-11 02:57:28 +04:00
spin_lock_init ( & clnt - > lock ) ;
INIT_LIST_HEAD ( & clnt - > fidlist ) ;
clnt - > fidpool = p9_idpool_create ( ) ;
2008-03-07 20:40:33 +03:00
if ( IS_ERR ( clnt - > fidpool ) ) {
2007-07-11 02:57:28 +04:00
err = PTR_ERR ( clnt - > fidpool ) ;
clnt - > fidpool = NULL ;
goto error ;
}
2008-10-14 03:45:23 +04:00
p9_tag_init ( clnt ) ;
2008-03-07 19:53:53 +03:00
err = parse_opts ( options , clnt ) ;
if ( err < 0 )
goto error ;
2009-07-14 22:24:10 +04:00
if ( ! clnt - > trans_mod )
clnt - > trans_mod = v9fs_get_default_trans ( ) ;
2008-02-07 04:25:03 +03:00
if ( clnt - > trans_mod = = NULL ) {
err = - EPROTONOSUPPORT ;
P9_DPRINTK ( P9_DEBUG_ERROR ,
" No transport defined or default transport \n " ) ;
goto error ;
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " clnt %p trans %p msize %d dotu %d \n " ,
2008-02-07 04:25:03 +03:00
clnt , clnt - > trans_mod , clnt - > msize , clnt - > dotu ) ;
2008-10-14 03:45:25 +04:00
err = clnt - > trans_mod - > create ( clnt , dev_name , options ) ;
if ( err )
2007-07-11 02:57:28 +04:00
goto error ;
2008-02-07 04:25:03 +03:00
if ( ( clnt - > msize + P9_IOHDRSZ ) > clnt - > trans_mod - > maxsize )
clnt - > msize = clnt - > trans_mod - > maxsize - P9_IOHDRSZ ;
2008-10-14 05:36:14 +04:00
err = p9_client_version ( clnt ) ;
2007-07-11 02:57:28 +04:00
if ( err )
goto error ;
return clnt ;
error :
p9_client_destroy ( clnt ) ;
return ERR_PTR ( err ) ;
}
EXPORT_SYMBOL ( p9_client_create ) ;
void p9_client_destroy ( struct p9_client * clnt )
{
struct p9_fid * fid , * fidptr ;
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_MUX , " clnt %p \n " , clnt ) ;
2007-07-11 02:57:28 +04:00
2008-10-14 03:45:25 +04:00
if ( clnt - > trans_mod )
clnt - > trans_mod - > close ( clnt ) ;
2007-07-11 02:57:28 +04:00
2008-09-25 01:22:23 +04:00
v9fs_put_trans ( clnt - > trans_mod ) ;
2007-07-11 02:57:28 +04:00
list_for_each_entry_safe ( fid , fidptr , & clnt - > fidlist , flist )
p9_fid_destroy ( fid ) ;
2007-07-14 01:47:58 +04:00
if ( clnt - > fidpool )
p9_idpool_destroy ( clnt - > fidpool ) ;
2008-10-14 03:45:23 +04:00
p9_tag_cleanup ( clnt ) ;
2007-07-11 02:57:28 +04:00
kfree ( clnt ) ;
}
EXPORT_SYMBOL ( p9_client_destroy ) ;
void p9_client_disconnect ( struct p9_client * clnt )
{
P9_DPRINTK ( P9_DEBUG_9P , " clnt %p \n " , clnt ) ;
2008-10-14 03:45:25 +04:00
clnt - > status = Disconnected ;
2007-07-11 02:57:28 +04:00
}
EXPORT_SYMBOL ( p9_client_disconnect ) ;
struct p9_fid * p9_client_attach ( struct p9_client * clnt , struct p9_fid * afid ,
2007-10-17 23:31:07 +04:00
char * uname , u32 n_uname , char * aname )
2007-07-11 02:57:28 +04:00
{
int err ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2007-07-11 02:57:28 +04:00
struct p9_fid * fid ;
2008-10-16 17:30:07 +04:00
struct p9_qid qid ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TATTACH afid %d uname %s aname %s \n " ,
afid ? afid - > fid : - 1 , uname , aname ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
fid = p9_fid_create ( clnt ) ;
if ( IS_ERR ( fid ) ) {
err = PTR_ERR ( fid ) ;
fid = NULL ;
goto error ;
}
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TATTACH , " ddss?d " , fid - > fid ,
afid ? afid - > fid : P9_NOFID , uname , aname , n_uname ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " Q " , & qid ) ;
if ( err ) {
2008-10-18 01:20:07 +04:00
p9pdu_dump ( 1 , req - > rc ) ;
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
2008-10-16 17:30:07 +04:00
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RATTACH qid %x.%llx.%x \n " ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
qid . type ,
( unsigned long long ) qid . path ,
qid . version ) ;
2008-10-16 17:30:07 +04:00
memmove ( & fid - > qid , & qid , sizeof ( struct p9_qid ) ) ;
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
return fid ;
error :
if ( fid )
p9_fid_destroy ( fid ) ;
return ERR_PTR ( err ) ;
}
EXPORT_SYMBOL ( p9_client_attach ) ;
2008-10-16 17:30:07 +04:00
struct p9_fid *
p9_client_auth ( struct p9_client * clnt , char * uname , u32 n_uname , char * aname )
2007-07-11 02:57:28 +04:00
{
int err ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
struct p9_qid qid ;
struct p9_fid * afid ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TAUTH uname %s aname %s \n " , uname , aname ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
2008-10-16 17:30:07 +04:00
afid = p9_fid_create ( clnt ) ;
if ( IS_ERR ( afid ) ) {
err = PTR_ERR ( afid ) ;
afid = NULL ;
2007-07-11 02:57:28 +04:00
goto error ;
}
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TAUTH , " dss?d " ,
afid ? afid - > fid : P9_NOFID , uname , aname , n_uname ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " Q " , & qid ) ;
if ( err ) {
2008-10-18 01:20:07 +04:00
p9pdu_dump ( 1 , req - > rc ) ;
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
2008-10-16 17:30:07 +04:00
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RAUTH qid %x.%llx.%x \n " ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
qid . type ,
( unsigned long long ) qid . path ,
qid . version ) ;
2008-10-16 17:30:07 +04:00
memmove ( & afid - > qid , & qid , sizeof ( struct p9_qid ) ) ;
p9_free_req ( clnt , req ) ;
return afid ;
2007-07-11 02:57:28 +04:00
error :
2008-10-16 17:30:07 +04:00
if ( afid )
p9_fid_destroy ( afid ) ;
2007-07-11 02:57:28 +04:00
return ERR_PTR ( err ) ;
}
EXPORT_SYMBOL ( p9_client_auth ) ;
struct p9_fid * p9_client_walk ( struct p9_fid * oldfid , int nwname , char * * wnames ,
int clone )
{
int err ;
struct p9_client * clnt ;
struct p9_fid * fid ;
2008-10-16 17:30:07 +04:00
struct p9_qid * wqids ;
struct p9_req_t * req ;
int16_t nwqids , count ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = oldfid - > clnt ;
if ( clone ) {
fid = p9_fid_create ( clnt ) ;
if ( IS_ERR ( fid ) ) {
err = PTR_ERR ( fid ) ;
fid = NULL ;
goto error ;
}
fid - > uid = oldfid - > uid ;
} else
fid = oldfid ;
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TWALK fids %d,%d nwname %d wname[0] %s \n " ,
oldfid - > fid , fid - > fid , nwname , wnames ? wnames [ 0 ] : NULL ) ;
req = p9_client_rpc ( clnt , P9_TWALK , " ddT " , oldfid - > fid , fid - > fid ,
nwname , wnames ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " R " , & nwqids , & wqids ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
p9pdu_dump ( 1 , req - > rc ) ;
p9_free_req ( clnt , req ) ;
2008-10-16 17:30:07 +04:00
goto clunk_fid ;
2008-10-18 01:20:07 +04:00
}
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RWALK nwqid %d: \n " , nwqids ) ;
if ( nwqids ! = nwname ) {
2007-07-11 02:57:28 +04:00
err = - ENOENT ;
goto clunk_fid ;
}
2008-10-16 17:30:07 +04:00
for ( count = 0 ; count < nwqids ; count + + )
P9_DPRINTK ( P9_DEBUG_9P , " <<< [%d] %x.%llx.%x \n " ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
count , wqids [ count ] . type ,
( unsigned long long ) wqids [ count ] . path ,
2008-10-16 17:30:07 +04:00
wqids [ count ] . version ) ;
2007-07-11 02:57:28 +04:00
if ( nwname )
2008-10-16 17:30:07 +04:00
memmove ( & fid - > qid , & wqids [ nwqids - 1 ] , sizeof ( struct p9_qid ) ) ;
2007-07-11 02:57:28 +04:00
else
fid - > qid = oldfid - > qid ;
return fid ;
clunk_fid :
2008-10-16 17:30:07 +04:00
p9_client_clunk ( fid ) ;
fid = NULL ;
2007-07-11 02:57:28 +04:00
error :
if ( fid & & ( fid ! = oldfid ) )
p9_fid_destroy ( fid ) ;
return ERR_PTR ( err ) ;
}
EXPORT_SYMBOL ( p9_client_walk ) ;
int p9_client_open ( struct p9_fid * fid , int mode )
{
int err ;
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
struct p9_qid qid ;
int iounit ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TOPEN fid %d mode %d \n " , fid - > fid , mode ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
if ( fid - > mode ! = - 1 )
return - EINVAL ;
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TOPEN , " db " , fid - > fid , mode ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " Qd " , & qid , & iounit ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
p9pdu_dump ( 1 , req - > rc ) ;
goto free_and_error ;
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< ROPEN qid %x.%llx.%x iounit %x \n " ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
qid . type ,
( unsigned long long ) qid . path ,
qid . version , iounit ) ;
2007-07-11 02:57:28 +04:00
fid - > mode = mode ;
2008-10-16 17:30:07 +04:00
fid - > iounit = iounit ;
2007-07-11 02:57:28 +04:00
2008-10-18 01:20:07 +04:00
free_and_error :
p9_free_req ( clnt , req ) ;
2008-10-16 17:30:07 +04:00
error :
2007-07-11 02:57:28 +04:00
return err ;
}
EXPORT_SYMBOL ( p9_client_open ) ;
int p9_client_fcreate ( struct p9_fid * fid , char * name , u32 perm , int mode ,
char * extension )
{
int err ;
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
struct p9_qid qid ;
int iounit ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TCREATE fid %d name %s perm %d mode %d \n " ,
fid - > fid , name , perm , mode ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
if ( fid - > mode ! = - 1 )
return - EINVAL ;
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TCREATE , " dsdb?s " , fid - > fid , name , perm ,
mode , extension ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " Qd " , & qid , & iounit ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
p9pdu_dump ( 1 , req - > rc ) ;
goto free_and_error ;
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RCREATE qid %x.%llx.%x iounit %x \n " ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
qid . type ,
( unsigned long long ) qid . path ,
qid . version , iounit ) ;
2007-07-11 02:57:28 +04:00
fid - > mode = mode ;
2008-10-16 17:30:07 +04:00
fid - > iounit = iounit ;
2007-07-11 02:57:28 +04:00
2008-10-18 01:20:07 +04:00
free_and_error :
p9_free_req ( clnt , req ) ;
2008-10-16 17:30:07 +04:00
error :
2007-07-11 02:57:28 +04:00
return err ;
}
EXPORT_SYMBOL ( p9_client_fcreate ) ;
int p9_client_clunk ( struct p9_fid * fid )
{
int err ;
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TCLUNK fid %d \n " , fid - > fid ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TCLUNK , " d " , fid - > fid ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RCLUNK fid %d \n " , fid - > fid ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
p9_fid_destroy ( fid ) ;
2008-10-16 17:30:07 +04:00
error :
2007-07-11 02:57:28 +04:00
return err ;
}
EXPORT_SYMBOL ( p9_client_clunk ) ;
int p9_client_remove ( struct p9_fid * fid )
{
int err ;
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TREMOVE fid %d \n " , fid - > fid ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TREMOVE , " d " , fid - > fid ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RREMOVE fid %d \n " , fid - > fid ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
p9_fid_destroy ( fid ) ;
2008-10-16 17:30:07 +04:00
error :
2007-07-11 02:57:28 +04:00
return err ;
}
EXPORT_SYMBOL ( p9_client_remove ) ;
2008-10-14 05:36:17 +04:00
int
p9_client_read ( struct p9_fid * fid , char * data , char __user * udata , u64 offset ,
u32 count )
2007-07-11 02:57:28 +04:00
{
2008-10-16 17:30:07 +04:00
int err , rsize , total ;
2007-07-11 02:57:28 +04:00
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
char * dataptr ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TREAD fid %d offset %llu %d \n " , fid - > fid ,
2007-07-11 02:57:28 +04:00
( long long unsigned ) offset , count ) ;
err = 0 ;
clnt = fid - > clnt ;
total = 0 ;
rsize = fid - > iounit ;
if ( ! rsize | | rsize > clnt - > msize - P9_IOHDRSZ )
rsize = clnt - > msize - P9_IOHDRSZ ;
2008-10-16 17:30:07 +04:00
if ( count < rsize )
rsize = count ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TREAD , " dqd " , fid - > fid , offset , rsize ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " D " , & count , & dataptr ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
p9pdu_dump ( 1 , req - > rc ) ;
2008-10-16 17:30:07 +04:00
goto free_and_error ;
2008-10-18 01:20:07 +04:00
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RREAD count %d \n " , count ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
if ( data ) {
memmove ( data , dataptr , count ) ;
data + = count ;
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
if ( udata ) {
err = copy_to_user ( udata , dataptr , count ) ;
if ( err ) {
err = - EFAULT ;
goto free_and_error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
return count ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
free_and_error :
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
error :
return err ;
}
2008-10-14 05:36:17 +04:00
EXPORT_SYMBOL ( p9_client_read ) ;
2007-07-11 02:57:28 +04:00
int
2008-10-14 05:36:17 +04:00
p9_client_write ( struct p9_fid * fid , char * data , const char __user * udata ,
u64 offset , u32 count )
2007-07-11 02:57:28 +04:00
{
2008-10-16 17:30:07 +04:00
int err , rsize , total ;
2007-07-11 02:57:28 +04:00
struct p9_client * clnt ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TWRITE fid %d offset %llu count %d \n " ,
fid - > fid , ( long long unsigned ) offset , count ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
total = 0 ;
rsize = fid - > iounit ;
if ( ! rsize | | rsize > clnt - > msize - P9_IOHDRSZ )
rsize = clnt - > msize - P9_IOHDRSZ ;
2008-10-16 17:30:07 +04:00
if ( count < rsize )
rsize = count ;
if ( data )
req = p9_client_rpc ( clnt , P9_TWRITE , " dqD " , fid - > fid , offset ,
rsize , data ) ;
else
req = p9_client_rpc ( clnt , P9_TWRITE , " dqU " , fid - > fid , offset ,
rsize , udata ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
}
2008-10-14 05:36:17 +04:00
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " d " , & count ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
p9pdu_dump ( 1 , req - > rc ) ;
2008-10-16 17:30:07 +04:00
goto free_and_error ;
2008-10-18 01:20:07 +04:00
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RWRITE count %d \n " , count ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
return count ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
free_and_error :
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
error :
return err ;
}
2008-10-14 05:36:17 +04:00
EXPORT_SYMBOL ( p9_client_write ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
struct p9_wstat * p9_client_stat ( struct p9_fid * fid )
2008-10-14 03:45:24 +04:00
{
2008-10-16 17:30:07 +04:00
int err ;
struct p9_client * clnt ;
struct p9_wstat * ret = kmalloc ( sizeof ( struct p9_wstat ) , GFP_KERNEL ) ;
struct p9_req_t * req ;
u16 ignored ;
2008-10-14 03:45:24 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TSTAT fid %d \n " , fid - > fid ) ;
2008-10-14 03:45:24 +04:00
if ( ! ret )
return ERR_PTR ( - ENOMEM ) ;
2007-07-11 02:57:28 +04:00
err = 0 ;
clnt = fid - > clnt ;
2008-10-16 17:30:07 +04:00
req = p9_client_rpc ( clnt , P9_TSTAT , " d " , fid - > fid ) ;
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
2007-07-11 02:57:28 +04:00
goto error ;
}
2008-10-16 17:30:07 +04:00
err = p9pdu_readf ( req - > rc , clnt - > dotu , " wS " , & ignored , ret ) ;
2008-10-18 01:20:07 +04:00
if ( err ) {
ret = ERR_PTR ( err ) ;
p9pdu_dump ( 1 , req - > rc ) ;
goto free_and_error ;
}
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P ,
2008-10-18 01:20:07 +04:00
" <<< RSTAT sz=%x type=%x dev=%x qid=%x.%llx.%x \n "
" <<< mode=%8.8x atime=%8.8x mtime=%8.8x length=%llx \n "
" <<< name=%s uid=%s gid=%s muid=%s extension=(%s) \n "
" <<< uid=%d gid=%d n_muid=%d \n " ,
2008-10-16 17:30:07 +04:00
ret - > size , ret - > type , ret - > dev , ret - > qid . type ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
( unsigned long long ) ret - > qid . path , ret - > qid . version , ret - > mode ,
ret - > atime , ret - > mtime , ( unsigned long long ) ret - > length ,
ret - > name , ret - > uid , ret - > gid , ret - > muid , ret - > extension ,
2008-10-18 01:20:07 +04:00
ret - > n_uid , ret - > n_gid , ret - > n_muid ) ;
2007-07-11 02:57:28 +04:00
2009-04-06 01:26:41 +04:00
p9_free_req ( clnt , req ) ;
return ret ;
2008-10-18 01:20:07 +04:00
free_and_error :
p9_free_req ( clnt , req ) ;
2007-07-11 02:57:28 +04:00
error :
2009-04-06 01:26:41 +04:00
kfree ( ret ) ;
return ERR_PTR ( err ) ;
2007-07-11 02:57:28 +04:00
}
EXPORT_SYMBOL ( p9_client_stat ) ;
2009-04-06 01:22:16 +04:00
static int p9_client_statsize ( struct p9_wstat * wst , int optional )
{
int ret ;
/* size[2] type[2] dev[4] qid[13] */
/* mode[4] atime[4] mtime[4] length[8]*/
/* name[s] uid[s] gid[s] muid[s] */
ret = 2 + 2 + 4 + 13 + 4 + 4 + 4 + 8 + 2 + 2 + 2 + 2 ;
if ( wst - > name )
ret + = strlen ( wst - > name ) ;
if ( wst - > uid )
ret + = strlen ( wst - > uid ) ;
if ( wst - > gid )
ret + = strlen ( wst - > gid ) ;
if ( wst - > muid )
ret + = strlen ( wst - > muid ) ;
if ( optional ) {
ret + = 2 + 4 + 4 + 4 ; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */
if ( wst - > extension )
ret + = strlen ( wst - > extension ) ;
}
return ret ;
}
2007-07-11 02:57:28 +04:00
int p9_client_wstat ( struct p9_fid * fid , struct p9_wstat * wst )
{
int err ;
2008-10-16 17:30:07 +04:00
struct p9_req_t * req ;
2007-07-11 02:57:28 +04:00
struct p9_client * clnt ;
2009-04-06 01:22:16 +04:00
err = 0 ;
clnt = fid - > clnt ;
wst - > size = p9_client_statsize ( wst , clnt - > dotu ) ;
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " >>> TWSTAT fid %d \n " , fid - > fid ) ;
2008-10-18 01:20:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P ,
" sz=%x type=%x dev=%x qid=%x.%llx.%x \n "
" mode=%8.8x atime=%8.8x mtime=%8.8x length=%llx \n "
" name=%s uid=%s gid=%s muid=%s extension=(%s) \n "
" uid=%d gid=%d n_muid=%d \n " ,
wst - > size , wst - > type , wst - > dev , wst - > qid . type ,
net/9p: fix printk format warnings
Fix printk format warnings in net/9p.
Built cleanly on 7 arches.
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:820: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:867: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:932: warning: format '%llx' expects type 'long long unsigned int', but argument 6 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:982: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 4 has type 'u64'
net/9p/client.c:1025: warning: format '%llx' expects type 'long long unsigned int', but argument 5 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1227: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 7 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 8 has type 'u64'
net/9p/client.c:1252: warning: format '%llx' expects type 'long long unsigned int', but argument 13 has type 'u64'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
2008-11-05 07:46:46 +03:00
( unsigned long long ) wst - > qid . path , wst - > qid . version , wst - > mode ,
wst - > atime , wst - > mtime , ( unsigned long long ) wst - > length ,
wst - > name , wst - > uid , wst - > gid , wst - > muid , wst - > extension ,
2008-10-18 01:20:07 +04:00
wst - > n_uid , wst - > n_gid , wst - > n_muid ) ;
2007-07-11 02:57:28 +04:00
2009-04-06 01:22:16 +04:00
req = p9_client_rpc ( clnt , P9_TWSTAT , " dwS " , fid - > fid , wst - > size , wst ) ;
2008-10-16 17:30:07 +04:00
if ( IS_ERR ( req ) ) {
err = PTR_ERR ( req ) ;
goto error ;
2007-07-11 02:57:28 +04:00
}
2008-10-16 17:30:07 +04:00
P9_DPRINTK ( P9_DEBUG_9P , " <<< RWSTAT fid %d \n " , fid - > fid ) ;
2007-07-11 02:57:28 +04:00
2008-10-16 17:30:07 +04:00
p9_free_req ( clnt , req ) ;
error :
2007-07-11 02:57:28 +04:00
return err ;
}
EXPORT_SYMBOL ( p9_client_wstat ) ;