¿Uso de ioctl de biblioteca OPAL-SED?

Estoy tratando de usar las bibliotecas sed-opal agregadas en el kernel de Linux 4.11

Para hacer eso, he escrito un progtwig básico como este:

#include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> #include <linux/nvme_ioctl.h> #include <uapi/linux/sed-opal.h> #include <fcntl.h> #include <linux/types.h> int main() { int f_desc; printf("Trying to open device /dev/nvme0...\n"); f_desc = open("/dev/nvme0", O_RDWR); if(f_desc == 0) { printf("Could not open the file..\n"); } else { printf("Open call returns : %d\n", f_desc); } struct nvme_admin_cmd cmd = { .opcode = 0x81, //0x81 Security Send. 0x82 Security Receive .nsid = 0xffffffff, .cdw10 = 0x02000000, }; int ret_ioctl_value; ret_ioctl_value = ioctl(f_desc, IOC_OPAL_REVERT_TPR, &cmd); printf("ioctl returned value : %d \n", ret_ioctl_value); perror("Flush"); close(f_desc); } 

El problema surge cuando quiero utilizar los commands ioctl de la biblioteca sed-opal como se menciona en el código anterior.

 Error is like:- Trying to open device /dev/nvme0... Open call returns : 3 ioctl returned value : -1 Flush: Inappropriate ioctl for device 

¿Es esta la forma correcta de enviar los commands Security SEND / RECV?

En caso afirmativo, ¿cuál podría ser la posible causa del error?

Cualquier ayuda es apreciada. 🙂

Gracias.

 Note: - With the above code the basic NVMe protocol specific ADMIN commands works and i am able to receive response of a SMART health log page from the device. - I have built /usr/src/linux/block/ directory by Enabling the "Logic for interfacing with OPAL enabled SEDs" from the menuconfig. - Using 4.13.9 kernel level right now. 

=============================================== ====

 Edit: So it is supposed to be done as follows: open(/dev/nvme0n1"); set up opal_structures here from /uapi/linux/sed-opal.h ioctl(fd, IOC_OPAL_*, &struct_from_above); 

Intente usar sed_ioctl lugar de ioctl . que se define en 'sed-opal.h'

la syntax es similar.

 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *ioctl_ptr); 

donde como ioctl es

 int ioctl(int fd, unsigned long request, ...);