nfs-ganesha 1.4

fsal_rename.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 "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 }