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 #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 }