nfs-ganesha 1.4

fsal_attrs.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 "nfs_proto_tools.h"
00038 #include "fsal_nfsv4_macros.h"
00039 
00040 extern fsal_staticfsinfo_t default_proxy_info;
00041 
00063 fsal_status_t PROXYFSAL_getattrs(fsal_handle_t * filehandle,       /* IN */
00064                                  fsal_op_context_t * context,    /* IN */
00065                                  fsal_attrib_list_t * object_attributes /* IN/OUT */
00066     )
00067 {
00068 
00069   int rc;
00070 
00071   COMPOUND4args argnfs4;
00072   COMPOUND4res resnfs4;
00073   nfs_fh4 nfs4fh;
00074   bitmap4 bitmap;
00075   uint32_t bitmap_val[2];
00076   uint32_t bitmap_res[2];
00077   proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context;
00078 
00079 #define FSAL_GETATTR_NB_OP_ALLOC 2
00080   nfs_argop4 argoparray[FSAL_GETATTR_NB_OP_ALLOC];
00081   nfs_resop4 resoparray[FSAL_GETATTR_NB_OP_ALLOC];
00082 
00083   fsal_proxy_internal_fattr_t fattr_internal;
00084   struct timeval timeout = TIMEOUTRPC;
00085   /* sanity checks.
00086    * note : object_attributes is mandatory in PROXYFSAL_getattrs.
00087    */
00088   if(!filehandle || !p_context || !object_attributes)
00089     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_getattrs);
00090 
00091   PRINT_HANDLE("PROXYFSAL_getattrs", filehandle);
00092 
00093   /* >> get attributes from your filesystem << */
00094   /* Setup results structures */
00095   argnfs4.argarray.argarray_val = argoparray;
00096   resnfs4.resarray.resarray_val = resoparray;
00097   fsal_internal_proxy_setup_fattr(&fattr_internal);
00098   argnfs4.minorversion = 0;
00099   /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Getattr" ; */
00100   argnfs4.tag.utf8string_val = NULL;
00101   argnfs4.tag.utf8string_len = 0;
00102   argnfs4.argarray.argarray_len = 0;
00103 
00104   bitmap.bitmap4_val = bitmap_val;
00105   bitmap.bitmap4_len = 2;
00106   fsal_internal_proxy_create_fattr_bitmap(&bitmap);
00107 
00108   /* Get NFSv4 File handle */
00109   if(fsal_internal_proxy_extract_fh(&nfs4fh, filehandle) == FALSE)
00110     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_getattrs);
00111 
00112 #define FSAL_GETATTR_IDX_OP_PUTFH     0
00113 #define FSAL_GETATTR_IDX_OP_GETATTR   1
00114   COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh);
00115   COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap);
00116 
00117   resnfs4.resarray.resarray_val[FSAL_GETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00118       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res;
00119   resnfs4.resarray.resarray_val[FSAL_GETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00120       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2;
00121 
00122   resnfs4.resarray.resarray_val[FSAL_GETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00123       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val =
00124       (char *)&fattr_internal;
00125   resnfs4.resarray.resarray_val[FSAL_GETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00126       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len =
00127       sizeof(fattr_internal);
00128 
00129   TakeTokenFSCall();
00130 
00131   /* Call the NFSv4 function */
00132   COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc);
00133   if(rc != RPC_SUCCESS)
00134     {
00135       ReleaseTokenFSCall();
00136 
00137       Return(ERR_FSAL_IO, resnfs4.status, INDEX_FSAL_getattrs);
00138     }
00139 
00140   ReleaseTokenFSCall();
00141 
00142   if(resnfs4.status != NFS4_OK)
00143     return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_getattrs);
00144 
00145   /* Use NFSv4 service function to build the FSAL_attr */
00146   if(nfs4_Fattr_To_FSAL_attr(object_attributes,
00147                              &resnfs4.resarray.resarray_val[FSAL_GETATTR_IDX_OP_GETATTR].
00148                              nfs_resop4_u.opgetattr.GETATTR4res_u.resok4.
00149                              obj_attributes) != NFS4_OK)
00150     {
00151       FSAL_CLEAR_MASK(object_attributes->asked_attributes);
00152       FSAL_SET_MASK(object_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR);
00153 
00154       Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_getattrs);
00155     }
00156 
00158   object_attributes->supported_attributes = default_proxy_info.supported_attrs;
00159 
00160   Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_getattrs);
00161 }
00162 
00196 fsal_status_t PROXYFSAL_setattrs(fsal_handle_t * filehandle,       /* IN */
00197                                  fsal_op_context_t * context,    /* IN */
00198                                  fsal_attrib_list_t * attrib_set,       /* IN */
00199                                  fsal_attrib_list_t * object_attributes /* [ IN/OUT ] */
00200     )
00201 {
00202 
00203   int rc;
00204   fsal_attrib_list_t attrs;
00205 
00206   nfs_fh4 nfs4fh;
00207   uint32_t bitmap_conv_val[2];
00208   fattr4 input_attr;
00209   bitmap4 convert_bitmap;
00210   bitmap4 output_bitmap;
00211   uint32_t bitmap_res_getattr[2];
00212   uint32_t bitmap_val_getattr[2];
00213   COMPOUND4res resnfs4;
00214   COMPOUND4args argnfs4;
00215   proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context;
00216 
00217   fsal_proxy_internal_fattr_t fattr_internal_getattr;
00218 
00219 #define FSAL_SETATTR_NB_OP_ALLOC 3
00220 #define FSAL_SETATTR_VAL_BUFFER  1024
00221 
00222   nfs_argop4 argoparray[FSAL_SETATTR_NB_OP_ALLOC];
00223   nfs_resop4 resoparray[FSAL_SETATTR_NB_OP_ALLOC];
00224 
00225   struct timeval timeout = TIMEOUTRPC;
00226 
00227   /* sanity checks.
00228    * note : object_attributes is optional.
00229    */
00230   if(!filehandle || !p_context || !attrib_set)
00231     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_setattrs);
00232 
00233   PRINT_HANDLE("FSAL_setattr", filehandle);
00234 
00235   memset((char *)&argnfs4, 0, sizeof(COMPOUND4args));
00236   memset((char *)&resnfs4, 0, sizeof(COMPOUND4res));
00237 
00238   /* Setup results structures */
00239   argnfs4.argarray.argarray_val = argoparray;
00240   resnfs4.resarray.resarray_val = resoparray;
00241   argnfs4.minorversion = 0;
00242   /*argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Setattr" ; */
00243   argnfs4.tag.utf8string_val = NULL;
00244   argnfs4.tag.utf8string_len = 0;
00245   argnfs4.argarray.argarray_len = 0;
00246 
00247   convert_bitmap.bitmap4_val = bitmap_conv_val;
00248   convert_bitmap.bitmap4_len = 2;
00249 
00250   /* local copy of attributes */
00251   attrs = *attrib_set;
00252 
00253   output_bitmap.bitmap4_val = bitmap_val_getattr;
00254   output_bitmap.bitmap4_len = 2;
00255 
00256   fsal_internal_proxy_create_fattr_bitmap(&output_bitmap);
00257   fsal_internal_proxy_setup_fattr(&fattr_internal_getattr);
00258 
00259   /* Is it allowed to change times ? */
00260 
00261   if(!global_fs_info.cansettime)
00262     {
00263 
00264       if(attrs.asked_attributes
00265          & (FSAL_ATTR_ATIME | FSAL_ATTR_CREATION | FSAL_ATTR_CTIME | FSAL_ATTR_MTIME))
00266         {
00267 
00268           /* handled as an unsettable attribute. */
00269           Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_setattrs);
00270         }
00271 
00272     }
00273 
00274   /* apply umask, if mode attribute is to be changed */
00275 
00276   if(FSAL_TEST_MASK(attrs.asked_attributes, FSAL_ATTR_MODE))
00277     {
00278       attrs.mode &= (~global_fs_info.umask);
00279     }
00280 
00281   /* Get NFSv4 File handle */
00282   if(fsal_internal_proxy_extract_fh(&nfs4fh, filehandle) == FALSE)
00283     Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_setattrs);
00284 
00285   fsal_interval_proxy_fsalattr2bitmap4(attrib_set, &convert_bitmap);
00286 
00287   /* Create the fattr4 for the request */
00288   /* We use the function that is used to convert NFSv4 read attributes, only a subset of it will be used */
00289   if(nfs4_FSALattr_To_Fattr(NULL,       /* no exportlist required here */
00290                             attrib_set, &input_attr, NULL,      /* no compound data required here */
00291                             NULL,       /* No fh here, filehandle is not a settable attribute */
00292                             &convert_bitmap) == -1)
00293     Return(ERR_FSAL_INVAL, -1, INDEX_FSAL_setattrs);
00294 
00295 #define FSAL_SETATTR_IDX_OP_PUTFH     0
00296 #define FSAL_SETATTR_IDX_OP_SETATTR   1
00297 #define FSAL_SETATTR_IDX_OP_GETATTR   2
00298   COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh);
00299   COMPOUNDV4_ARG_ADD_OP_SETATTR(argnfs4, input_attr);
00300   COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, output_bitmap);
00301 
00302   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_SETATTR].nfs_resop4_u.opsetattr.
00303       attrsset.bitmap4_val = bitmap_res_getattr;
00304   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_SETATTR].nfs_resop4_u.opsetattr.
00305       attrsset.bitmap4_len = 2;
00306 
00307   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00308       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res_getattr;
00309   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00310       GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2;
00311 
00312   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00313       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val =
00314       (char *)&fattr_internal_getattr;
00315   resnfs4.resarray.resarray_val[FSAL_SETATTR_IDX_OP_GETATTR].nfs_resop4_u.opgetattr.
00316       GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len =
00317       sizeof(fattr_internal_getattr);
00318 
00319   /* Call to the server for which we act as a proxy */
00320   TakeTokenFSCall();
00321 
00322   /* Call the NFSv4 function */
00323   COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc);
00324   nfs4_Fattr_Free(&input_attr);
00325   if(rc != RPC_SUCCESS)
00326     {
00327       ReleaseTokenFSCall();
00328 
00329       Return(ERR_FSAL_IO, 0, INDEX_FSAL_setattrs);
00330     }
00331 
00332   ReleaseTokenFSCall();
00333 
00334   /* >> convert error code, and return on error << */
00335   if(resnfs4.status != NFS4_OK)
00336     return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_setattrs);
00337 
00338   /* Optionaly fill output attributes */
00339 
00340   if(object_attributes)
00341     {
00342 
00343       /* Use NFSv4 service function to build the FSAL_attr */
00344       if(nfs4_Fattr_To_FSAL_attr(object_attributes,
00345                                  &resnfs4.resarray.
00346                                  resarray_val[FSAL_SETATTR_IDX_OP_GETATTR].nfs_resop4_u.
00347                                  opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK)
00348         {
00349           FSAL_CLEAR_MASK(object_attributes->asked_attributes);
00350           FSAL_SET_MASK(object_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR);
00351 
00352           Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_setattrs);
00353         }
00354     }
00355 
00356   Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_setattrs);
00357 
00358 }