/** * @brief Gets attributes for an entry in the FSAL. * * Impelments the NFS4_OP_GETATTR operation, which gets attributes for * an entry in the FSAL. * * @param[in] op Arguments for nfs4_op * @param[in,out] data Compound request's data * @param[out] resp Results for nfs4_op * * @return per RFC5661, p. 365 * */ int nfs4_op_getattr(struct nfs_argop4 *op, compound_data_t *data, struct nfs_resop4 *resp) { GETATTR4args * const arg_GETATTR4 = &op->nfs_argop4_u.opgetattr; GETATTR4res * const res_GETATTR4 = &resp->nfs_resop4_u.opgetattr; /* This is a NFS4_OP_GETTAR */ resp->resop = NFS4_OP_GETATTR; res_GETATTR4->status = NFS4_OK; /* Do basic checks on a filehandle */ res_GETATTR4->status = nfs4_sanity_check_FH(data, NO_FILE_TYPE, false); if (res_GETATTR4->status != NFS4_OK) return res_GETATTR4->status; /* Sanity check: if no attributes are wanted, nothing is to be * done. In this case NFS4_OK is to be returned */ if (arg_GETATTR4->attr_request.bitmap4_len == 0) { res_GETATTR4->status = NFS4_OK; return res_GETATTR4->status; } /* Get only attributes that are allowed to be read */ if (!nfs4_Fattr_Check_Access_Bitmap(&arg_GETATTR4->attr_request, FATTR4_ATTR_READ)) { res_GETATTR4->status = NFS4ERR_INVAL; return res_GETATTR4->status; } nfs4_bitmap4_Remove_Unsupported(&arg_GETATTR4->attr_request); res_GETATTR4->status = cache_entry_To_Fattr(data->current_entry, &res_GETATTR4->GETATTR4res_u.resok4. obj_attributes, data, &data->currentFH, &arg_GETATTR4->attr_request); return res_GETATTR4->status; } /* nfs4_op_getattr */
/** * * nfs4_op_getattr: Gets attributes for an entry in the FSAL. * * Gets attributes for an entry in the FSAL. * * @param op [IN] pointer to nfs4_op arguments * @param data [INOUT] Pointer to the compound request's data * @param resp [IN] Pointer to nfs4_op results * * @return NFS4_OK * */ int nfs4_op_getattr(struct nfs_argop4 *op, compound_data_t * data, struct nfs_resop4 *resp) { fsal_attrib_list_t attr; cache_inode_status_t cache_status; char __attribute__ ((__unused__)) funcname[] = "nfs4_op_getattr"; /* This is a NFS4_OP_GETTAR */ resp->resop = NFS4_OP_GETATTR; /* If there is no FH */ if(nfs4_Is_Fh_Empty(&(data->currentFH))) { res_GETATTR4.status = NFS4ERR_NOFILEHANDLE; return NFS4ERR_NOFILEHANDLE; } /* If the filehandle is invalid */ if(nfs4_Is_Fh_Invalid(&(data->currentFH))) { res_GETATTR4.status = NFS4ERR_BADHANDLE; return NFS4ERR_BADHANDLE; } /* Tests if teh Filehandle is expired (for volatile filehandle) */ if(nfs4_Is_Fh_Expired(&(data->currentFH))) { res_GETATTR4.status = NFS4ERR_FHEXPIRED; return NFS4ERR_FHEXPIRED; } /* Pseudo Fs management */ if(nfs4_Is_Fh_Pseudo(&(data->currentFH))) return nfs4_op_getattr_pseudo(op, data, resp); /* If Filehandle points to a xattr object, manage it via the xattrs specific functions */ if(nfs4_Is_Fh_Xattr(&(data->currentFH))) return nfs4_op_getattr_xattr(op, data, resp); if(isFullDebug(COMPONENT_NFS_V4)) { char str[LEN_FH_STR]; sprint_fhandle4(str, &data->currentFH); LogFullDebug(COMPONENT_NFS_V4, "NFS4_OP_GETATTR: Current FH %s", str); } /* Sanity check: if no attributes are wanted, nothing is to be done. * In this case NFS4_OK is to be returned */ if(arg_GETATTR4.attr_request.bitmap4_len == 0) { res_GETATTR4.status = NFS4_OK; return res_GETATTR4.status; } /* Get only attributes that are allowed to be read */ if(!nfs4_Fattr_Check_Access_Bitmap(&arg_GETATTR4.attr_request, FATTR4_ATTR_READ)) { res_GETATTR4.status = NFS4ERR_INVAL; return res_GETATTR4.status; } if( !nfs4_bitmap4_Remove_Unsupported( &arg_GETATTR4.attr_request ) ) { res_GETATTR4.status = NFS4ERR_SERVERFAULT ; return res_GETATTR4.status; } /* * Get attributes. */ if(cache_inode_getattr(data->current_entry, &attr, data->ht, data->pclient, data->pcontext, &cache_status) == CACHE_INODE_SUCCESS) { if(nfs4_FSALattr_To_Fattr(data->pexport, &attr, &(res_GETATTR4.GETATTR4res_u.resok4.obj_attributes), data, &(data->currentFH), &(arg_GETATTR4.attr_request)) != 0) res_GETATTR4.status = NFS4ERR_SERVERFAULT; else res_GETATTR4.status = NFS4_OK; return res_GETATTR4.status; } res_GETATTR4.status = nfs4_Errno(cache_status); return res_GETATTR4.status; } /* nfs4_op_getattr */