nfs-ganesha 1.4

fsal_access.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 #ifdef _USE_GSSRPC
00023 #include <gssrpc/rpc.h>
00024 #include <gssrpc/xdr.h>
00025 #else
00026 #include <rpc/rpc.h>
00027 #include <rpc/xdr.h>
00028 #endif
00029 #include "nfs4.h"
00030 
00031 #include <string.h>
00032 
00033 #include "fsal_internal.h"
00034 #include "fsal_convert.h"
00035 #include "fsal_common.h"
00036 
00037 #include "nfs_proto_functions.h"
00038 #include "fsal_nfsv4_macros.h"
00039 
00074 fsal_status_t PROXYFSAL_access(fsal_handle_t * object_handle,      /* IN */
00075                                fsal_op_context_t *context,      /* IN */
00076                                fsal_accessflags_t access_type,  /* IN */
00077                                fsal_attrib_list_t * object_attributes   /* [ IN/OUT ] */
00078     )
00079 {
00080 
00081   int rc;
00082   COMPOUND4args argnfs4;
00083   COMPOUND4res resnfs4;
00084   bitmap4 bitmap;
00085   uint32_t bitmap_val[2];
00086   uint32_t bitmap_res[2];
00087   uint32_t accessflag = 0;
00088   proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context;
00089 
00090   fsal_proxy_internal_fattr_t fattr_internal;
00091 
00092   struct timeval __attribute__ ((__unused__)) timeout = TIMEOUTRPC;
00093   nfs_fh4 nfs4fh;
00094 
00095 #define FSAL_ACCESS_NB_OP_ACCESS 3
00096 
00097   nfs_argop4 argoparray[FSAL_ACCESS_NB_OP_ACCESS];
00098   nfs_resop4 resoparray[FSAL_ACCESS_NB_OP_ACCESS];
00099 
00100   /* sanity checks.
00101    * note : object_attributes is optional in PROXYFSAL_access.
00102    */
00103   if(!object_handle || !p_context)
00104     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_access);
00105 
00106   /* Setup results structures */
00107   argnfs4.argarray.argarray_val = argoparray;
00108   resnfs4.resarray.resarray_val = resoparray;
00109   fsal_internal_proxy_setup_fattr(&fattr_internal);
00110   argnfs4.minorversion = 0;
00111   /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Access" ; */
00112   argnfs4.tag.utf8string_val = NULL;
00113   argnfs4.tag.utf8string_len = 0;
00114   argnfs4.argarray.argarray_len = 0;
00115 
00116   bitmap.bitmap4_val = bitmap_val;
00117   bitmap.bitmap4_len = 2;
00118   fsal_internal_proxy_create_fattr_bitmap(&bitmap);
00119 
00120   /* Set up access flags */
00121   if(access_type & FSAL_R_OK)
00122     accessflag |= ACCESS4_READ;
00123 
00124   if(access_type & FSAL_X_OK)
00125     accessflag |= ACCESS4_LOOKUP;
00126 
00127   if(access_type & FSAL_W_OK)
00128     accessflag |= (ACCESS4_MODIFY & ACCESS4_EXTEND);
00129 
00130   if(access_type & FSAL_F_OK)
00131     accessflag |= ACCESS4_LOOKUP;
00132 
00133   /* >> convert your fsal access type to your FS access type << */
00134 
00135   /* Get NFSv4 File handle */
00136   if(fsal_internal_proxy_extract_fh(&nfs4fh, object_handle) == FALSE)
00137     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_access);
00138 
00139 #define FSAL_ACCESS_IDX_OP_PUTFH    0
00140 #define FSAL_ACCESS_IDX_OP_ACCESS   1
00141 #define FSAL_ACCESS_IDX_OP_GETATTR  2
00142 
00143   COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh);
00144   COMPOUNDV4_ARG_ADD_OP_ACCESS(argnfs4, accessflag);
00145   COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap);
00146 
00147   resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00148       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res;
00149   resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00150       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2;
00151 
00152   resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00153       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val =
00154       (char *)&fattr_internal;
00155   resnfs4.resarray.resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00156       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len =
00157       sizeof(fattr_internal);
00158 
00159   TakeTokenFSCall();
00160 
00161   /* Call the NFSv4 function */
00162   COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc);
00163   if(rc != RPC_SUCCESS)
00164     {
00165       ReleaseTokenFSCall();
00166 
00167       Return(ERR_FSAL_IO, resnfs4.status, INDEX_FSAL_access);
00168     }
00169 
00170   ReleaseTokenFSCall();
00171 
00172   /* >> convert the returned code, an return it on error << */
00173   if(resnfs4.status != NFS4_OK)
00174     return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_access);
00175 
00176   /* get attributes if object_attributes is not null.
00177    * If an error occures during getattr operation,
00178    * an error bit is set in the output structure.
00179    */
00180   if(object_attributes)
00181     {
00182       /* Use NFSv4 service function to build the FSAL_attr */
00183       if(nfs4_Fattr_To_FSAL_attr(object_attributes,
00184                                  &resnfs4.resarray.
00185                                  resarray_val[FSAL_ACCESS_IDX_OP_GETATTR].nfs_resop4_u.
00186                                  opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK)
00187         {
00188           FSAL_CLEAR_MASK(object_attributes->asked_attributes);
00189           FSAL_SET_MASK(object_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR);
00190 
00191           Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_access);
00192         }
00193 
00194     }
00195 
00196   Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_access);
00197 
00198 }