Whamcloud - gitweb
LU-5435 libcfs: copy out ioctl inline buffer
[fs/lustre-release.git] / libcfs / libcfs / util / l_ioctl.c
index dfdd8ab..fe35073 100644 (file)
@@ -21,7 +21,6 @@
 #define __USE_FILE_OFFSET64
 
 #include <libcfs/libcfsutil.h>
-#include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
 
 static ioc_handler_t  do_ioctl;                 /* forward ref */
@@ -316,29 +315,46 @@ jt_ioc_dump(int argc, char **argv)
 int libcfs_ioctl_pack(struct libcfs_ioctl_data *data, char **pbuf,
                                     int max)
 {
-        char *ptr;
-        struct libcfs_ioctl_data *overlay;
-        data->ioc_len = libcfs_ioctl_packlen(data);
-        data->ioc_version = LIBCFS_IOCTL_VERSION;
-
-        if (*pbuf && libcfs_ioctl_packlen(data) > max)
-                return 1;
-        if (*pbuf == NULL) {
-                *pbuf = malloc(data->ioc_len);
-        }
-        if (!*pbuf)
-                return 1;
-        overlay = (struct libcfs_ioctl_data *)*pbuf;
-        memcpy(*pbuf, data, sizeof(*data));
-
-        ptr = overlay->ioc_bulk;
-        if (data->ioc_inlbuf1)
-                LOGL(data->ioc_inlbuf1, data->ioc_inllen1, ptr);
-        if (data->ioc_inlbuf2)
-                LOGL(data->ioc_inlbuf2, data->ioc_inllen2, ptr);
-        if (libcfs_ioctl_is_invalid(overlay))
-                return 1;
+       char *ptr;
+       struct libcfs_ioctl_data *overlay;
+       data->ioc_hdr.ioc_len = libcfs_ioctl_packlen(data);
+       data->ioc_hdr.ioc_version = LIBCFS_IOCTL_VERSION;
+
+       if (*pbuf != NULL && libcfs_ioctl_packlen(data) > max)
+               return 1;
+       if (*pbuf == NULL)
+               *pbuf = malloc(data->ioc_hdr.ioc_len);
+       if (*pbuf == NULL)
+               return 1;
+       overlay = (struct libcfs_ioctl_data *)*pbuf;
+       memcpy(*pbuf, data, sizeof(*data));
+
+       ptr = overlay->ioc_bulk;
+       if (data->ioc_inlbuf1 != NULL)
+               LOGL(data->ioc_inlbuf1, data->ioc_inllen1, ptr);
+       if (data->ioc_inlbuf2 != NULL)
+               LOGL(data->ioc_inlbuf2, data->ioc_inllen2, ptr);
+       if (libcfs_ioctl_is_invalid(overlay))
+               return 1;
 
-        return 0;
+       return 0;
 }
 
+void
+libcfs_ioctl_unpack(struct libcfs_ioctl_data *data, char *pbuf)
+{
+       struct libcfs_ioctl_data *overlay = (struct libcfs_ioctl_data *)pbuf;
+       char *ptr;
+
+       /* Preserve the caller's buffer pointers */
+       overlay->ioc_inlbuf1 = data->ioc_inlbuf1;
+       overlay->ioc_inlbuf2 = data->ioc_inlbuf2;
+
+       memcpy(data, pbuf, sizeof(*data));
+       ptr = &overlay->ioc_bulk[0];
+
+       if (data->ioc_inlbuf1 != NULL)
+               LOGU(data->ioc_inlbuf1, data->ioc_inllen1, ptr);
+       if (data->ioc_inlbuf2 != NULL)
+               LOGU(data->ioc_inlbuf2, data->ioc_inllen2, ptr);
+}