nfs-ganesha 1.4
|
00001 /* 00002 * vim:expandtab:shiftwidth=8:tabstop=8: 00003 */ 00004 00014 #ifdef HAVE_CONFIG_H 00015 #include "config.h" 00016 #endif 00017 00018 #ifdef _SOLARIS 00019 #include "solaris_port.h" 00020 #endif /* _SOLARIS */ 00021 00022 #include <string.h> 00023 #ifdef _USE_GSSRPC 00024 #include <gssrpc/rpc.h> 00025 #include <gssrpc/xdr.h> 00026 #else 00027 #include <rpc/rpc.h> 00028 #include <rpc/xdr.h> 00029 #endif 00030 #include "nfs4.h" 00031 00032 #include "fsal_internal.h" 00033 #include "fsal_convert.h" 00034 #include "fsal_common.h" 00035 00036 #include "nfs_proto_functions.h" 00037 #include "fsal_nfsv4_macros.h" 00038 00058 fsal_status_t PROXYFSAL_dynamic_fsinfo(fsal_handle_t * filehandle, /* IN */ 00059 fsal_op_context_t * context, /* IN */ 00060 fsal_dynamicfsinfo_t * dynamicinfo /* OUT */ 00061 ) 00062 { 00063 00064 int rc; 00065 00066 COMPOUND4args argnfs4; 00067 COMPOUND4res resnfs4; 00068 nfs_fh4 nfs4fh; 00069 bitmap4 bitmap; 00070 uint32_t bitmap_val[2]; 00071 uint32_t bitmap_res[2]; 00072 proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context; 00073 00074 #define FSAL_FSINFO_NB_OP_ALLOC 2 00075 nfs_argop4 argoparray[FSAL_FSINFO_NB_OP_ALLOC]; 00076 nfs_resop4 resoparray[FSAL_FSINFO_NB_OP_ALLOC]; 00077 00078 fsal_proxy_internal_fattr_t fattr_internal; 00079 struct timeval timeout = TIMEOUTRPC; 00080 00081 /* sanity checks. */ 00082 if(!filehandle || !dynamicinfo || !p_context) 00083 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_dynamic_fsinfo); 00084 00085 /* >> get attributes from your filesystem << */ 00086 /* Setup results structures */ 00087 argnfs4.argarray.argarray_val = argoparray; 00088 resnfs4.resarray.resarray_val = resoparray; 00089 fsal_internal_proxy_setup_fattr(&fattr_internal); 00090 argnfs4.minorversion = 0; 00091 /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Getattr" ; */ 00092 argnfs4.tag.utf8string_val = NULL; 00093 argnfs4.tag.utf8string_len = 0; 00094 argnfs4.argarray.argarray_len = 0; 00095 00096 bitmap.bitmap4_val = bitmap_val; 00097 bitmap.bitmap4_len = 2; 00098 00099 fsal_internal_proxy_create_fattr_fsinfo_bitmap(&bitmap); 00100 00101 /* Get NFSv4 File handle */ 00102 if(fsal_internal_proxy_extract_fh(&nfs4fh, filehandle) == FALSE) 00103 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_getattrs); 00104 00105 #define FSAL_FSINFO_IDX_OP_PUTFH 0 00106 #define FSAL_FSINFO_IDX_OP_GETATTR 1 00107 COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh); 00108 COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap); 00109 00110 resnfs4.resarray.resarray_val[FSAL_FSINFO_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00111 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res; 00112 resnfs4.resarray.resarray_val[FSAL_FSINFO_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00113 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2; 00114 00115 resnfs4.resarray.resarray_val[FSAL_FSINFO_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00116 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val = 00117 (char *)&fattr_internal; 00118 resnfs4.resarray.resarray_val[FSAL_FSINFO_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00119 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len = 00120 sizeof(fattr_internal); 00121 00122 TakeTokenFSCall(); 00123 00124 /* Call the NFSv4 function */ 00125 COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc); 00126 if(rc != RPC_SUCCESS) 00127 { 00128 ReleaseTokenFSCall(); 00129 00130 Return(ERR_FSAL_IO, 0, INDEX_FSAL_dynamic_fsinfo); 00131 } 00132 00133 ReleaseTokenFSCall(); 00134 00135 if(resnfs4.status != NFS4_OK) 00136 return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_dynamic_fsinfo); 00137 00138 /* Use NFSv4 service function to build the FSAL_attr */ 00139 if(proxy_Fattr_To_FSAL_dynamic_fsinfo(dynamicinfo, 00140 &resnfs4.resarray.resarray_val 00141 [FSAL_FSINFO_IDX_OP_GETATTR]. 00142 nfs_resop4_u.opgetattr.GETATTR4res_u.resok4. 00143 obj_attributes) != 1) 00144 { 00145 memset((char *)dynamicinfo, 0, sizeof(fsal_dynamicfsinfo_t)); 00146 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_dynamic_fsinfo); 00147 } 00148 00149 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_dynamic_fsinfo); 00150 00151 } /* FSAL_dynamic_fsinfo */