A ESM implementation changes for systemd. 99/11299/1
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Thu, 24 Oct 2013 03:24:04 +0000 (12:24 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Thu, 24 Oct 2013 03:49:34 +0000 (12:49 +0900)
For systemd boot progress monitor, introduce 'mode' specifier.

Change-Id: Icb40ada8eb5aa436a38e77d9ca2446e5ac089e01
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
drivers/maru/maru_virtio_esm.c

index 27b6b88804dd202975f711ea82f04d34c9b010c4..db5f50dbc99436d421dc48ed3271b9e9e3ad4cfd 100644 (file)
@@ -49,6 +49,7 @@ MODULE_DESCRIPTION("Emulator Virtio EmulatorStatusMedium Driver");
 
 struct progress_info
 {
+       char mode;
        uint16_t percentage;
 };
 
@@ -84,61 +85,79 @@ static void vq_esm_callback(struct virtqueue *vq)
 
 static int esm_open(struct inode *i, struct file *f)
 {
-       VESM_LOG(KERN_DEBUG, "esm_open\n");
+       VESM_LOG(KERN_DEBUG, "ESM open\n");
        return 0;
 }
 
 static int esm_close(struct inode *i, struct file *f)
 {
-       VESM_LOG(KERN_DEBUG, "esm_close\n");
+       VESM_LOG(KERN_DEBUG, "ESM close\n");
        return 0;
 }
 
 static ssize_t esm_read(struct file *f, char __user *buf, size_t len, loff_t *off)
 {
-       VESM_LOG(KERN_DEBUG, "esm_read\n");
+       VESM_LOG(KERN_DEBUG, "ESM read\n");
        return 0;
 }
 
+#define BUF_SIZE 5
 static ssize_t esm_write(struct file *f, const char __user *ubuf, size_t len, loff_t *off)
 {
        int err = 0;
        ssize_t ret = 0;
-       char buf[4];
+       char mode;
+       char buf[BUF_SIZE];
 
        if(vesm == NULL) {
                VESM_LOG(KERN_ERR, "Device or driver is malfunction.\n");
-               return 0;
+               return -EFAULT;
        }
 
-       len = min((size_t)4, len);
+       len = min((size_t)BUF_SIZE, len);
 
        ret = copy_from_user(buf, ubuf, len);
        if (ret) {
-               ret = -EFAULT;
-               return ret;
+               return -EFAULT;
+       }
+
+       if (buf[len - 1] == '\n') {
+               --len;
+       }
+       if (len < 2 || len > 4) {
+               VESM_LOG(KERN_ERR, "Input Length error.\n");
+               return -EFAULT;
+       }
+
+       buf[len] = '\0';
+
+       mode = buf[0];
+       if (mode != 's' && mode != 'S' && mode != 'u' && mode != 'U') {
+               VESM_LOG(KERN_ERR, "Can not detect class character [%c]\n", mode);
+               return -EFAULT;
        }
-       buf[len - 1] = '\0';
+       vesm->progress.mode = mode;
 
-       ret = kstrtou16(buf, 10, &vesm->progress.percentage);
+       ret = kstrtou16(&buf[1], 10, &vesm->progress.percentage);
        if (ret < 0) {
-               VESM_LOG(KERN_ERR, "failed to convert string to integer.\n");
+               VESM_LOG(KERN_ERR, "Failed to convert string to integer. %s\n", &buf[1]);
                return ret;
        }
 
-       VESM_LOG(KERN_DEBUG, "boot up progress is [%u] percent done.\n", vesm->progress.percentage);
+       VESM_LOG(KERN_DEBUG, "Boot up progress is [%u] percent done at [%s].\n",
+               vesm->progress.percentage, (mode == 's' || mode == 'S' ? "system mode" : "user mode"));
 
        sg_init_one(vesm->sg, &vesm->progress, sizeof(vesm->progress));
        err = virtqueue_add_buf (vesm->vq, vesm->sg, 1, 0, &vesm->progress, GFP_ATOMIC);
        if (err < 0) {
                VESM_LOG(KERN_ERR, "%d\n", err);
-               VESM_LOG(KERN_ERR, "failed to add buffer to virtqueue.\n");
+               VESM_LOG(KERN_ERR, "Failed to add buffer to virtqueue.\n");
                return 0;
        }
 
        virtqueue_kick(vesm->vq);
 
-       VESM_LOG(KERN_DEBUG, "esm_write\n");
+       VESM_LOG(KERN_DEBUG, "ESM write\n");
        return len;
 }