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/clnt.h> 00026 #include <gssrpc/xdr.h> 00027 #else 00028 #include <rpc/rpc.h> 00029 #include <rpc/clnt.h> 00030 #include <rpc/xdr.h> 00031 #endif 00032 #include "nfs4.h" 00033 00034 #include "fsal_internal.h" 00035 #include "fsal_convert.h" 00036 #include "fsal_common.h" 00037 00038 #include "nfs_proto_functions.h" 00039 #include "fsal_nfsv4_macros.h" 00040 00070 fsal_status_t PROXYFSAL_unlink(fsal_handle_t * parentdir_handle, /* IN */ 00071 fsal_name_t * p_object_name, /* IN */ 00072 fsal_op_context_t *context, /* IN */ 00073 fsal_attrib_list_t * parentdir_attributes /* [IN/OUT ] */ 00074 ) 00075 { 00076 int rc; 00077 COMPOUND4args argnfs4; 00078 COMPOUND4res resnfs4; 00079 nfs_fh4 nfs4fh; 00080 bitmap4 bitmap; 00081 uint32_t bitmap_val[2]; 00082 component4 name; 00083 char nameval[MAXNAMLEN]; 00084 proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context; 00085 00086 #define FSAL_UNLINK_NB_OP_ALLOC 3 00087 nfs_argop4 argoparray[FSAL_UNLINK_NB_OP_ALLOC]; 00088 nfs_resop4 resoparray[FSAL_UNLINK_NB_OP_ALLOC]; 00089 uint32_t bitmap_res[2]; 00090 00091 fsal_proxy_internal_fattr_t fattr_internal; 00092 struct timeval timeout = TIMEOUTRPC; 00093 00094 /* sanity checks. 00095 * note : parentdir_attributes are optional. 00096 * parentdir_handle is mandatory, 00097 * because, we do not allow to delete FS root ! 00098 */ 00099 if(!parentdir_handle || !p_context || !p_object_name) 00100 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_unlink); 00101 00102 /* Setup results structures */ 00103 argnfs4.argarray.argarray_val = argoparray; 00104 resnfs4.resarray.resarray_val = resoparray; 00105 fsal_internal_proxy_setup_fattr(&fattr_internal); 00106 argnfs4.minorversion = 0; 00107 /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Unlink" ; */ 00108 argnfs4.tag.utf8string_val = NULL; 00109 argnfs4.tag.utf8string_len = 0; 00110 argnfs4.argarray.argarray_len = 0; 00111 00112 /* >> retrieve root handle filehandle here << */ 00113 bitmap.bitmap4_val = bitmap_val; 00114 bitmap.bitmap4_len = 2; 00115 00116 fsal_internal_proxy_create_fattr_bitmap(&bitmap); 00117 00118 if(fsal_internal_proxy_extract_fh(&nfs4fh, parentdir_handle) == FALSE) 00119 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_unlink); 00120 00121 memset((char *)&name, 0, sizeof(component4)); 00122 name.utf8string_val = nameval; 00123 name.utf8string_len = sizeof(nameval); 00124 if(fsal_internal_proxy_fsal_name_2_utf8(p_object_name, &name) == FALSE) 00125 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_unlink); 00126 00127 #define FSAL_UNLINK_IDX_OP_PUTFH 0 00128 #define FSAL_UNLINK_IDX_OP_REMOVE 1 00129 #define FSAL_UNLINK_IDX_OP_GETATTR 2 00130 00131 COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh); 00132 COMPOUNDV4_ARG_ADD_OP_REMOVE(argnfs4, name); 00133 COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap); 00134 00135 resnfs4.resarray.resarray_val[FSAL_UNLINK_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00136 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res; 00137 resnfs4.resarray.resarray_val[FSAL_UNLINK_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00138 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2; 00139 00140 resnfs4.resarray.resarray_val[FSAL_UNLINK_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00141 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val = 00142 (char *)&fattr_internal; 00143 resnfs4.resarray.resarray_val[FSAL_UNLINK_IDX_OP_GETATTR].nfs_resop4_u.opgetattr. 00144 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len = 00145 sizeof(fattr_internal); 00146 00147 TakeTokenFSCall(); 00148 00149 /* Call the NFSv4 function */ 00150 COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc); 00151 if(rc != RPC_SUCCESS) 00152 { 00153 ReleaseTokenFSCall(); 00154 00155 Return(ERR_FSAL_IO, rc, INDEX_FSAL_unlink); 00156 } 00157 00158 ReleaseTokenFSCall(); 00159 00160 if(resnfs4.status != NFS4_OK) 00161 return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_unlink); 00162 00163 /* >> get post op attributes for the parent, if they are asked, 00164 * and your filesystem didn't return them << */ 00165 00166 if(parentdir_attributes) 00167 { 00168 00169 if(nfs4_Fattr_To_FSAL_attr(parentdir_attributes, 00170 &resnfs4.resarray. 00171 resarray_val[FSAL_UNLINK_IDX_OP_GETATTR].nfs_resop4_u. 00172 opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK) 00173 { 00174 FSAL_CLEAR_MASK(parentdir_attributes->asked_attributes); 00175 FSAL_SET_MASK(parentdir_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR); 00176 00177 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_unlink); 00178 } 00179 00180 } 00181 00182 /* OK */ 00183 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_unlink); 00184 00185 }