nfs-ganesha 1.4

fsal_nfsv4_macros.h

Go to the documentation of this file.
00001 /*
00002  * vim:expandtab:shiftwidth=8:tabstop=8:
00003  */
00004 
00014 #ifndef _FSAL_NFSV4_MACROS_H
00015 #define _FSAL_NFSV4_MACROS_H
00016 
00017 #ifdef _USE_GSSRPC
00018 #include <gssrpc/rpc.h>
00019 #include <gssrpc/clnt.h>
00020 #include <gssrpc/xdr.h>
00021 #else
00022 #include <rpc/rpc.h>
00023 #include <rpc/clnt.h>
00024 #include <rpc/xdr.h>
00025 #endif
00026 #include "nfs4.h"
00027 
00028 #include "fsal.h"
00029 #include "fsal_internal.h"
00030 #include "fsal_convert.h"
00031 #include "fsal_common.h"
00032 
00033 #define TIMEOUTRPC {2, 0} 
00034 
00035 #define PRINT_HANDLE( tag, handle )                                                     \
00036   do {                                                                                  \
00037     if(isFullDebug(COMPONENT_FSAL))                                                     \
00038       {                                                                                 \
00039         char outstr[1024] ;                                                             \
00040         snprintHandle(outstr, 1024, handle) ;                                           \
00041         LogFullDebug(COMPONENT_FSAL, "============> %s : handle=%s\n", tag, outstr ) ;  \
00042       }                                                                                 \
00043   } while( 0 )
00044 
00045 /* Free a compound */
00046 #define COMPOUNDV4_ARG_FREE \
00047 do {gsh_free(argcompound.argarray_val);} while( 0 )
00048 
00049 /* OP specific macros */
00050 #define COMPOUNDV4_ARG_ADD_OP_PUTROOTFH( argcompound )                                             \
00051 do {                                                                                               \
00052   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_PUTROOTFH ; \
00053   argcompound.argarray.argarray_len += 1 ;                                                         \
00054 } while( 0 )
00055 
00056 #define COMPOUNDV4_ARG_ADD_OP_OPEN_CONFIRM( argcompound, __openseqid, __other, __seqid )                                                       \
00057 do {                                                                                                                                           \
00058   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_OPEN_CONFIRM ;                                          \
00059   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen_confirm.seqid = __seqid ;                           \
00060   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen_confirm.open_stateid.seqid = __openseqid ;          \
00061   memcpy( argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen_confirm.open_stateid.other, __other, 12 ) ; \
00062   argcompound.argarray.argarray_len += 1 ;                                                                                                     \
00063 } while( 0 )
00064 
00065 #define COMPOUNDV4_ARG_ADD_OP_OPEN_NOCREATE( argcompound, __seqid, inclientid, inaccess, inname, __owner_val, __owner_len )             \
00066 do {                                                                                                                                    \
00067   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_OPEN ;                                           \
00068   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.seqid = __seqid ;                            \
00069   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.share_access = OPEN4_SHARE_ACCESS_BOTH ;     \
00070   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.share_deny = OPEN4_SHARE_DENY_NONE ;         \
00071   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.clientid = inclientid ;                \
00072   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.owner.owner_len =  __owner_len  ;      \
00073   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.owner.owner_val = __owner_val ;        \
00074   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.openhow.opentype = OPEN4_NOCREATE ;          \
00075   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.claim.claim = CLAIM_NULL ;                   \
00076   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.claim.open_claim4_u.file = inname ;          \
00077   argcompound.argarray.argarray_len += 1 ;                                                                                              \
00078 } while( 0 )
00079 
00080 #define COMPOUNDV4_ARG_ADD_OP_CLOSE( argcompound, __stateid )                                                                                    \
00081 do {                                                                                                                                             \
00082   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_CLOSE ;                                                   \
00083   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opclose.seqid = __stateid.seqid +1 ;                         \
00084   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opclose.open_stateid.seqid = __stateid.seqid ;               \
00085   memcpy( argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opclose.open_stateid.other, __stateid.other, 12 ) ;  \
00086   argcompound.argarray.argarray_len += 1 ;                                                                                                       \
00087 } while( 0 )
00088 
00089 #define COMPOUNDV4_ARG_ADD_OP_GETATTR( argcompound, bitmap )                                                          \
00090 do {                                                                                                                  \
00091   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_GETATTR ;                      \
00092   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opgetattr.attr_request = bitmap ; \
00093   argcompound.argarray.argarray_len += 1 ;                                                                            \
00094 } while( 0 )
00095 
00096 #define COMPOUNDV4_ARG_ADD_OP_SETATTR( argcompound, inattr )                                                                       \
00097 do {                                                                                                                               \
00098   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_SETATTR ;                                   \
00099   memset(&argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetattr.stateid,0,sizeof(stateid4)); \
00100   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetattr.obj_attributes = inattr ;            \
00101   argcompound.argarray.argarray_len += 1 ;                                                                                         \
00102 } while( 0 )
00103 
00104 #define COMPOUNDV4_ARG_ADD_OP_GETFH( argcompound )                                                            \
00105 do {                                                                                                          \
00106   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_GETFH ;                \
00107   argcompound.argarray.argarray_len += 1 ;                                                                    \
00108 } while( 0 )
00109 
00110 #define COMPOUNDV4_ARG_ADD_OP_PUTFH( argcompound, nfs4fh )                                                    \
00111 do {                                                                                                          \
00112   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_PUTFH ;                \
00113   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opputfh.object = nfs4fh ; \
00114   argcompound.argarray.argarray_len += 1 ;                                                                    \
00115 } while( 0 )
00116 
00117 #define COMPOUNDV4_ARG_ADD_OP_LOOKUP( argcompound, name )                                                     \
00118 do {                                                                                                          \
00119   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_LOOKUP ;               \
00120   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.oplookup.objname = name ; \
00121   argcompound.argarray.argarray_len += 1 ;                                                                    \
00122 } while ( 0 )
00123 
00124 #define COMPOUNDV4_ARG_ADD_OP_LOOKUPP( argcompound )                                             \
00125 do {                                                                                             \
00126   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_LOOKUPP ; \
00127   argcompound.argarray.argarray_len += 1 ;                                                       \
00128 } while ( 0 )
00129 
00130 #define COMPOUNDV4_ARG_ADD_OP_SETCLIENTID( argcompound, inclient, incallback )                                            \
00131 do {                                                                                                                      \
00132   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_SETCLIENTID ;                      \
00133   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetclientid.client = inclient ;     \
00134   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetclientid.callback = incallback ; \
00135   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetclientid.callback_ident = 0 ;    \
00136   argcompound.argarray.argarray_len += 1 ;                                                                                \
00137 } while ( 0 )
00138 
00139 #define COMPOUNDV4_ARG_ADD_OP_SETCLIENTID_CONFIRM( argcompound, inclientid, inverifier )                                                                                   \
00140 do {                                                                                                                                                                       \
00141   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_SETCLIENTID_CONFIRM ;                                                               \
00142   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetclientid_confirm.clientid = inclientid ;                                          \
00143   strncpy( argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opsetclientid_confirm.setclientid_confirm, inverifier, NFS4_VERIFIER_SIZE ) ; \
00144   argcompound.argarray.argarray_len += 1 ;                                                                                                                                 \
00145 } while ( 0 )
00146 
00147 #define COMPOUNDV4_ARG_ADD_OP_ACCESS( argcompound, inaccessflag )                                                    \
00148 do {                                                                                                                 \
00149   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_ACCESS ;                      \
00150   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opaccess.access = inaccessflag ; \
00151   argcompound.argarray.argarray_len += 1 ;                                                                           \
00152 } while ( 0 )
00153 
00154 #define COMPOUNDV4_ARG_ADD_OP_READDIR( argcompound, incookie, innbentry, inverifier, inbitmap  )                                                     \
00155 do {                                                                                                                                                 \
00156   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_READDIR ;                                                     \
00157   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.cookie       = incookie ;                              \
00158   memcpy( argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.cookieverf, inverifier, NFS4_VERIFIER_SIZE ) ; \
00159   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.dircount     = innbentry*sizeof( entry4 ) ;            \
00160   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.dircount     = 2048 ;                                  \
00161   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.maxcount     = innbentry*sizeof( entry4 ) ;            \
00162   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.maxcount     = 4096 ;                                  \
00163   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opreaddir.attr_request = inbitmap ;                              \
00164   argcompound.argarray.argarray_len += 1 ;                                                                                                           \
00165 } while ( 0 )
00166 
00167 #define COMPOUNDV4_ARG_ADD_OP_OPEN_CREATE( argcompound, inname, inattrs, inclientid, __owner_val, __owner_len )                                         \
00168 do {                                                                                                                                                    \
00169   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_OPEN ;                                                           \
00170   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.seqid = 0 ;                                                  \
00171   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.share_access = OPEN4_SHARE_ACCESS_BOTH ;                     \
00172   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.share_deny = OPEN4_SHARE_DENY_NONE ;                         \
00173   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.clientid = inclientid ;                                \
00174   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.owner.owner_len =  __owner_len ;                       \
00175   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.owner.owner.owner_val =  __owner_val ;                       \
00176   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.openhow.opentype = OPEN4_CREATE ;                            \
00177   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.openhow.openflag4_u.how.mode = GUARDED4 ;                    \
00178   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.openhow.openflag4_u.how.createhow4_u.createattrs = inattrs ; \
00179   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.claim.claim = CLAIM_NULL ;                                   \
00180   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opopen.claim.open_claim4_u.file = inname ;                          \
00181   argcompound.argarray.argarray_len += 1 ;                                                                                                              \
00182 } while ( 0 )
00183 
00184 #define COMPOUNDV4_ARG_ADD_OP_MKDIR( argcompound, inname, inattrs )                                                  \
00185 do {                                                                                                                 \
00186   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_CREATE ;                      \
00187   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.objtype.type = NF4DIR ; \
00188   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.objname = inname ;      \
00189   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.createattrs = inattrs ; \
00190   argcompound.argarray.argarray_len += 1 ;                                                                           \
00191 } while ( 0 )
00192 
00193 #define COMPOUNDV4_ARG_ADD_OP_SYMLINK( argcompound, inname, incontent, inattrs )                                                          \
00194 do {                                                                                                                                      \
00195   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_CREATE ;                                           \
00196   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.objtype.type = NF4LNK ;                      \
00197   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.objtype.createtype4_u.linkdata = incontent ; \
00198   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.objname = inname ;                           \
00199   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opcreate.createattrs = inattrs ;                      \
00200   argcompound.argarray.argarray_len += 1 ;                                                                                                \
00201 } while ( 0 )
00202 
00203 #define COMPOUNDV4_ARG_ADD_OP_LINK( argcompound, inname )                                                     \
00204 do {                                                                                                          \
00205   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_LINK ;                 \
00206   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.oplink.newname = inname ; \
00207   argcompound.argarray.argarray_len += 1 ;                                                                    \
00208 } while ( 0 )
00209 
00210 #define COMPOUNDV4_ARG_ADD_OP_REMOVE( argcompound, inname )                                                    \
00211 do {                                                                                                           \
00212   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_REMOVE ;                \
00213   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opremove.target = inname ; \
00214   argcompound.argarray.argarray_len += 1 ;                                                                     \
00215 } while ( 0 )
00216 
00217 #define COMPOUNDV4_ARG_ADD_OP_RENAME( argcompound, inoldname, innewname )                                          \
00218 do {                                                                                                               \
00219   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_RENAME ;                    \
00220   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.oprename.oldname = inoldname ; \
00221   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.oprename.newname = innewname ; \
00222   argcompound.argarray.argarray_len += 1 ;                                                                         \
00223 } while ( 0 )
00224 
00225 #define COMPOUNDV4_ARG_ADD_OP_READLINK( argcompound )                                             \
00226 do {                                                                                              \
00227   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_READLINK ; \
00228   argcompound.argarray.argarray_len += 1 ;                                                        \
00229 } while ( 0 )
00230 
00231 #define COMPOUNDV4_ARG_ADD_OP_SAVEFH( argcompound )                                             \
00232 do {                                                                                            \
00233   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_SAVEFH ; \
00234   argcompound.argarray.argarray_len += 1 ;                                                      \
00235 } while ( 0 )
00236 
00237 #define COMPOUNDV4_ARG_ADD_OP_RESTOREFH( argcompound )                                             \
00238 do {                                                                                               \
00239   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_RESTOREFH ; \
00240   argcompound.argarray.argarray_len += 1 ;                                                         \
00241 } while ( 0 )
00242 
00243 #define COMPOUNDV4_ARG_ADD_OP_READ( argcompound, instateid, inoffset, incount )                                                                \
00244 do {                                                                                                                                           \
00245   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_READ ;                                                  \
00246   memcpy( &argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opread.stateid, instateid, sizeof( stateid4 ) ) ; \
00247   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opread.offset = inoffset ;                                 \
00248   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opread.count  = incount ;                                  \
00249   argcompound.argarray.argarray_len += 1 ;                                                                                                     \
00250 } while ( 0 )
00251 
00252 #define COMPOUNDV4_ARG_ADD_OP_WRITE( argcompound, instateid, inoffset, indatabuffval, indatabufflen )                                           \
00253 do {                                                                                                                                            \
00254   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].argop = NFS4_OP_WRITE ;                                                  \
00255   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opwrite.stable= DATA_SYNC4 ;                                \
00256   memcpy( &argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opwrite.stateid, instateid, sizeof( stateid4 ) ) ; \
00257   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opwrite.offset = inoffset ;                                 \
00258   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opwrite.data.data_val = indatabuffval ;                     \
00259   argcompound.argarray.argarray_val[argcompound.argarray.argarray_len].nfs_argop4_u.opwrite.data.data_len = indatabufflen ;                     \
00260   argcompound.argarray.argarray_len += 1 ;                                                                                                      \
00261 } while ( 0 )
00262 
00263 #define COMPOUNDV4_EXECUTE( pcontext, argcompound, rescompound, rc )                      \
00264 do {                                                                                      \
00265   int __renew_rc = 0 ;                                                                    \
00266   rc = -1 ;                                                                               \
00267   do {                                                                                    \
00268   if( __renew_rc == 0 )                                                                   \
00269       {                                                                                   \
00270         if( FSAL_proxy_change_user( pcontext ) == NULL ) break  ;                         \
00271         if( ( rc = clnt_call( pcontext->rpc_client, NFSPROC4_COMPOUND,                    \
00272                               (xdrproc_t)xdr_COMPOUND4args, (caddr_t)&argcompound,        \
00273                               (xdrproc_t)xdr_COMPOUND4res,  (caddr_t)&rescompound,        \
00274                               timeout ) ) == RPC_SUCCESS )                                \
00275               break ;                                                                     \
00276        }                                                                                  \
00277   LogEvent(COMPONENT_FSAL, "Reconnecting to the remote server.." ) ;                      \
00278   pthread_mutex_lock( &pcontext->lock ) ;                                                 \
00279   __renew_rc = fsal_internal_ClientReconnect( pcontext ) ;                                \
00280   pthread_mutex_unlock( &pcontext->lock ) ;                                               \
00281   if (__renew_rc) {                                                                       \
00282      LogEvent(COMPONENT_FSAL, "Cannot reconnect, will sleep for %d seconds",              \
00283               pcontext->retry_sleeptime ) ;                                               \
00284    sleep( pcontext->retry_sleeptime ) ;                                                   \
00285   }                                                                                       \
00286   } while( 1  ) ;                                                                         \
00287 }  while( 0 )
00288 
00289 #define COMPOUNDV4_EXECUTE_SIMPLE( pcontext, argcompound, rescompound )   \
00290    clnt_call( pcontext->rpc_client, NFSPROC4_COMPOUND,                    \
00291               (xdrproc_t)xdr_COMPOUND4args, (caddr_t)&argcompound,        \
00292               (xdrproc_t)xdr_COMPOUND4res,  (caddr_t)&rescompound,        \
00293               timeout )
00294 
00295 #endif                          /* _FSAL_NFSV4_MACROS_H */