nfs-ganesha 1.4

fsal_unlink.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/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 }