nfs-ganesha 1.4
|
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 */