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 #include "fsal.h" 00019 #include "fsal_internal.h" 00020 #include "fsal_convert.h" 00021 00022 #if HPSS_MAJOR_VERSION == 5 00023 /* for struct statfs */ 00024 # include <sys/types.h> 00025 #endif 00026 00046 fsal_status_t HPSSFSAL_dynamic_fsinfo(hpssfsal_handle_t * filehandle, /* IN */ 00047 hpssfsal_op_context_t * p_context, /* IN */ 00048 fsal_dynamicfsinfo_t * dynamicinfo /* OUT */ 00049 ) 00050 { 00051 00052 #if HPSS_MAJOR_VERSION == 5 00053 struct statfs hpss_statfs; 00054 #elif HPSS_MAJOR_VERSION >= 6 00055 hpss_statfs_t hpss_statfs; 00056 #endif 00057 00058 unsigned int cos_export; 00059 int rc; 00060 00061 /* sanity checks. */ 00062 if(!filehandle || !dynamicinfo || !p_context) 00063 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_dynamic_fsinfo); 00064 00065 /* retrieves the default cos (or the user defined cos for this fileset) */ 00066 00067 if(p_context->export_context->default_cos != 0) 00068 { 00069 cos_export = p_context->export_context->default_cos; 00070 } 00071 else 00072 { 00073 /* retrieves default fileset cos */ 00074 00075 ns_FilesetAttrBits_t attrBits; 00076 ns_FilesetAttrs_t fsattrs; 00077 00078 attrBits = cast64m(0); 00079 attrBits = orbit64m(attrBits, NS_FS_ATTRINDEX_COS); 00080 00081 TakeTokenFSCall(); 00082 rc = hpss_FilesetGetAttributes(NULL, NULL, 00083 &p_context->export_context->fileset_root_handle, 00084 NULL, attrBits, &fsattrs); 00085 ReleaseTokenFSCall(); 00086 00087 if(rc) 00088 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00089 00090 cos_export = fsattrs.ClassOfService; 00091 00092 } 00093 00094 TakeTokenFSCall(); 00095 rc = hpss_Statfs(p_context->export_context->default_cos, &hpss_statfs); 00096 ReleaseTokenFSCall(); 00097 00098 if(rc) 00099 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00100 00101 /* retrieves the default cos (or the user defined cos for this fileset) */ 00102 if(p_context->export_context->default_cos != 0) 00103 { 00104 cos_export = p_context->export_context->default_cos; 00105 } 00106 else 00107 { 00108 /* retrieves default fileset cos */ 00109 00110 ns_FilesetAttrBits_t attrBits; 00111 ns_FilesetAttrs_t fsattrs; 00112 00113 attrBits = cast64m(0); 00114 attrBits = orbit64m(attrBits, NS_FS_ATTRINDEX_COS); 00115 00116 TakeTokenFSCall(); 00117 rc = hpss_FilesetGetAttributes(NULL, NULL, 00118 &p_context->export_context->fileset_root_handle, 00119 NULL, attrBits, &fsattrs); 00120 ReleaseTokenFSCall(); 00121 00122 if(rc) 00123 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00124 00125 cos_export = fsattrs.ClassOfService; 00126 00127 } 00128 00129 TakeTokenFSCall(); 00130 rc = hpss_Statfs(p_context->export_context->default_cos, &hpss_statfs); 00131 ReleaseTokenFSCall(); 00132 00133 if(rc) 00134 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00135 00136 /* then retrieve info about this cos */ 00137 #ifdef BUGAZOMEU 00138 /* retrieves the default cos (or the user defined cos for this fileset) */ 00139 if(DefaultCosId != 0) 00140 { 00141 cos_export = DefaultCosId; 00142 } 00143 else 00144 { 00145 /* retrieves default fileset cos */ 00146 00147 ns_FilesetAttrBits_t attrBits; 00148 ns_FilesetAttrs_t fsattrs; 00149 hpss_fileattr_t rootattr; 00150 ns_ObjHandle_t fshdl; 00151 00152 /* recupere la racine */ 00153 00154 TakeTokenFSCall(); 00155 rc = HPSSFSAL_GetRoot(&rootattr); 00156 ReleaseTokenFSCall(); 00157 00158 if(rc) 00159 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00160 00161 fshdl = rootattr.ObjectHandle; 00162 00163 /* recupere la cos du fileset correspondant */ 00164 00165 attrBits = cast64m(0); 00166 attrBits = orbit64m(attrBits, NS_FS_ATTRINDEX_COS); 00167 00168 TakeTokenFSCall(); 00169 rc = hpss_FilesetGetAttributes(NULL, NULL, &fshdl, NULL, attrBits, &fsattrs); 00170 ReleaseTokenFSCall(); 00171 00172 if(rc) 00173 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00174 00175 cos_export = fsattrs.ClassOfService; 00176 00177 /* @todo : sometimes NULL ??? */ 00178 if(cos_export == 0) 00179 cos_export = 1; 00180 00181 } 00182 00183 /* then retrieve info about this cos */ 00184 00185 TakeTokenFSCall(); 00186 rc = hpss_Statfs(cos_export, &hpss_statfs); 00187 ReleaseTokenFSCall(); 00188 00189 if(rc) 00190 Return(hpss2fsal_error(rc), -rc, INDEX_FSAL_dynamic_fsinfo); 00191 00192 /* @todo : sometimes hpss_statfs.f_blocks < hpss_statfs.f_bfree !!! */ 00193 00194 if(dynamicinfo->total_bytes > dynamicinfo->free_bytes) 00195 { 00196 dynamicinfo->total_bytes = hpss_statfs.f_blocks * hpss_statfs.f_bsize; 00197 dynamicinfo->free_bytes = hpss_statfs.f_bfree * hpss_statfs.f_bsize; 00198 dynamicinfo->avail_bytes = hpss_statfs.f_bavail * hpss_statfs.f_bsize; 00199 00200 dynamicinfo->total_files = hpss_statfs.f_files; 00201 dynamicinfo->free_files = hpss_statfs.f_ffree; 00202 dynamicinfo->avail_files = hpss_statfs.f_ffree; 00203 } 00204 #else 00205 00206 /* return dummy values... like HPSS do... */ 00207 00208 /* dynamicinfo->total_bytes= 1976007601074984ULL; 00209 dynamicinfo->free_bytes = 23992398925016ULL; 00210 dynamicinfo->avail_bytes= 23992398925016ULL;*/ 00211 00212 dynamicinfo->total_bytes = INT_MAX; 00213 dynamicinfo->free_bytes = INT_MAX; 00214 dynamicinfo->avail_bytes = INT_MAX; 00215 00216 dynamicinfo->total_files = 20000000; 00217 dynamicinfo->free_files = 1000000; 00218 dynamicinfo->avail_files = 1000000; 00219 00220 #endif 00221 dynamicinfo->time_delta.seconds = 1; 00222 dynamicinfo->time_delta.nseconds = 0; 00223 00224 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_dynamic_fsinfo); 00225 00226 }