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 #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 */