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 "fsal_nfsv4_macros.h" 00038 00080 fsal_status_t PROXYFSAL_rename(fsal_handle_t * old_parent, /* IN */ 00081 fsal_name_t * p_old_name, /* IN */ 00082 fsal_handle_t * new_parent, /* IN */ 00083 fsal_name_t * p_new_name, /* IN */ 00084 fsal_op_context_t *context, /* IN */ 00085 fsal_attrib_list_t * src_dir_attributes, /* [ IN/OUT ] */ 00086 fsal_attrib_list_t * tgt_dir_attributes /* [ IN/OUT ] */ 00087 ) 00088 { 00089 00090 int rc; 00091 00092 COMPOUND4args argnfs4; 00093 COMPOUND4res resnfs4; 00094 nfs_fh4 nfs4fh_old; 00095 nfs_fh4 nfs4fh_new; 00096 bitmap4 bitmap_old; 00097 uint32_t bitmap_val_old[2]; 00098 bitmap4 bitmap_new; 00099 uint32_t bitmap_val_new[2]; 00100 component4 oldname; 00101 char oldnameval[MAXNAMLEN]; 00102 component4 newname; 00103 char newnameval[MAXNAMLEN]; 00104 proxyfsal_handle_t * old_parentdir_handle = (proxyfsal_handle_t *)old_parent; 00105 proxyfsal_handle_t * new_parentdir_handle = (proxyfsal_handle_t *)new_parent; 00106 proxyfsal_op_context_t * p_context = (proxyfsal_op_context_t *)context; 00107 00108 #define FSAL_RENAME_NB_OP_ALLOC 7 00109 nfs_argop4 argoparray[FSAL_RENAME_NB_OP_ALLOC]; 00110 nfs_resop4 resoparray[FSAL_RENAME_NB_OP_ALLOC]; 00111 uint32_t bitmap_res_old[2]; 00112 uint32_t bitmap_res_new[2]; 00113 00114 fsal_proxy_internal_fattr_t fattr_internal_new; 00115 fsal_proxy_internal_fattr_t fattr_internal_old; 00116 struct timeval timeout = TIMEOUTRPC; 00117 00118 /* sanity checks. 00119 * note : src/tgt_dir_attributes are optional. 00120 */ 00121 if(!old_parentdir_handle || 00122 !new_parentdir_handle || !p_old_name || !p_new_name || !p_context) 00123 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_rename); 00124 00125 /* Setup results structures */ 00126 argnfs4.argarray.argarray_val = argoparray; 00127 resnfs4.resarray.resarray_val = resoparray; 00128 fsal_internal_proxy_setup_fattr(&fattr_internal_new); 00129 fsal_internal_proxy_setup_fattr(&fattr_internal_old); 00130 argnfs4.minorversion = 0; 00131 /* argnfs4.tag.utf8string_val = "GANESHA NFSv4 Proxy: Rename" ; */ 00132 argnfs4.tag.utf8string_val = NULL; 00133 argnfs4.tag.utf8string_len = 0; 00134 argnfs4.argarray.argarray_len = 0; 00135 00136 /* Prepare the structures */ 00137 bitmap_old.bitmap4_val = bitmap_val_old; 00138 bitmap_old.bitmap4_len = 2; 00139 00140 fsal_internal_proxy_create_fattr_bitmap(&bitmap_old); 00141 00142 if(fsal_internal_proxy_extract_fh(&nfs4fh_old, old_parent) == FALSE) 00143 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_rename); 00144 00145 memset((char *)&oldname, 0, sizeof(component4)); 00146 oldname.utf8string_val = oldnameval; 00147 oldname.utf8string_len = sizeof(oldnameval); 00148 if(fsal_internal_proxy_fsal_name_2_utf8(p_old_name, &oldname) == FALSE) 00149 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_rename); 00150 00151 bitmap_new.bitmap4_val = bitmap_val_new; 00152 bitmap_new.bitmap4_len = 2; 00153 fsal_internal_proxy_create_fattr_bitmap(&bitmap_new); 00154 00155 if(fsal_internal_proxy_extract_fh(&nfs4fh_new, new_parent) == FALSE) 00156 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_rename); 00157 00158 memset((char *)&newname, 0, sizeof(component4)); 00159 newname.utf8string_val = newnameval; 00160 newname.utf8string_len = sizeof(newnameval); 00161 if(fsal_internal_proxy_fsal_name_2_utf8(p_new_name, &newname) == FALSE) 00162 Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_rename); 00163 00164 #define FSAL_RENAME_IDX_OP_PUTFH_OLD 0 00165 #define FSAL_RENAME_IDX_OP_SAVEFH 1 00166 #define FSAL_RENAME_IDX_OP_PUTFH_NEW 2 00167 #define FSAL_RENAME_IDX_OP_RENAME 3 00168 #define FSAL_RENAME_IDX_OP_GETATTR_NEW 4 00169 #define FSAL_RENAME_IDX_OP_RESTOREFH 5 00170 #define FSAL_RENAME_IDX_OP_GETATTR_OLD 6 00171 00172 COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh_old); 00173 COMPOUNDV4_ARG_ADD_OP_SAVEFH(argnfs4); 00174 COMPOUNDV4_ARG_ADD_OP_PUTFH(argnfs4, nfs4fh_new); 00175 COMPOUNDV4_ARG_ADD_OP_RENAME(argnfs4, oldname, newname); 00176 COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap_new); 00177 COMPOUNDV4_ARG_ADD_OP_RESTOREFH(argnfs4); 00178 COMPOUNDV4_ARG_ADD_OP_GETATTR(argnfs4, bitmap_old); 00179 00180 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_NEW].nfs_resop4_u.opgetattr. 00181 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res_new; 00182 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_NEW].nfs_resop4_u.opgetattr. 00183 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2; 00184 00185 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_NEW].nfs_resop4_u.opgetattr. 00186 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val = 00187 (char *)&fattr_internal_new; 00188 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_NEW].nfs_resop4_u.opgetattr. 00189 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len = 00190 sizeof(fattr_internal_new); 00191 00192 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_OLD].nfs_resop4_u.opgetattr. 00193 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_val = bitmap_res_old; 00194 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_OLD].nfs_resop4_u.opgetattr. 00195 GETATTR4res_u.resok4.obj_attributes.attrmask.bitmap4_len = 2; 00196 00197 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_OLD].nfs_resop4_u.opgetattr. 00198 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_val = 00199 (char *)&fattr_internal_old; 00200 resnfs4.resarray.resarray_val[FSAL_RENAME_IDX_OP_GETATTR_OLD].nfs_resop4_u.opgetattr. 00201 GETATTR4res_u.resok4.obj_attributes.attr_vals.attrlist4_len = 00202 sizeof(fattr_internal_old); 00203 00204 TakeTokenFSCall(); 00205 00206 /* Call the NFSv4 function */ 00207 COMPOUNDV4_EXECUTE(p_context, argnfs4, resnfs4, rc); 00208 if(rc != RPC_SUCCESS) 00209 { 00210 ReleaseTokenFSCall(); 00211 00212 Return(ERR_FSAL_IO, rc, INDEX_FSAL_rename); 00213 } 00214 00215 ReleaseTokenFSCall(); 00216 00217 if(resnfs4.status != NFS4_OK) 00218 return fsal_internal_proxy_error_convert(resnfs4.status, INDEX_FSAL_rename); 00219 00220 /* >> get last parent post op attributes if asked 00221 * For example : << */ 00222 00223 if(src_dir_attributes) 00224 { 00225 if(nfs4_Fattr_To_FSAL_attr(src_dir_attributes, 00226 &resnfs4.resarray.resarray_val 00227 [FSAL_RENAME_IDX_OP_GETATTR_OLD].nfs_resop4_u. 00228 opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK) 00229 { 00230 FSAL_CLEAR_MASK(src_dir_attributes->asked_attributes); 00231 FSAL_SET_MASK(src_dir_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR); 00232 00233 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_rename); 00234 } 00235 00236 } 00237 00238 /* >> get new parent post op attributes if asked 00239 * For example : << */ 00240 00241 if(tgt_dir_attributes) 00242 { 00243 if(nfs4_Fattr_To_FSAL_attr(tgt_dir_attributes, 00244 &resnfs4.resarray.resarray_val 00245 [FSAL_RENAME_IDX_OP_GETATTR_NEW].nfs_resop4_u. 00246 opgetattr.GETATTR4res_u.resok4.obj_attributes) != NFS4_OK) 00247 { 00248 FSAL_CLEAR_MASK(tgt_dir_attributes->asked_attributes); 00249 FSAL_SET_MASK(tgt_dir_attributes->asked_attributes, FSAL_ATTR_RDATTR_ERR); 00250 00251 Return(ERR_FSAL_INVAL, 0, INDEX_FSAL_rename); 00252 } 00253 00254 } 00255 00256 /* OK */ 00257 Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_rename); 00258 00259 }