nfs-ganesha 1.4

fsal_fsinfo.c

Go to the documentation of this file.
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 }