Skip to content

Commit

Permalink
task4
Browse files Browse the repository at this point in the history
  • Loading branch information
nizshee committed Apr 6, 2016
1 parent 01c791d commit b6edb15
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 18 deletions.
9 changes: 7 additions & 2 deletions tasks/vsd2/vsd_driver/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ static long vsd_ioctl_get_size(vsd_ioctl_get_size_arg_t __user *uarg)
static long vsd_ioctl_set_size(vsd_ioctl_set_size_arg_t __user *uarg)
{
vsd_ioctl_set_size_arg_t arg;
if (0/* TODO device is currently mapped */)
if (vsd_dev->mmap_count > 0)
return -EBUSY;

if (copy_from_user(&arg, uarg, sizeof(arg)))
Expand Down Expand Up @@ -155,6 +155,7 @@ static struct vm_operations_struct vsd_dev_vma_ops = {

static int map_vmalloc_range(struct vm_area_struct *uvma, void *kaddr, size_t size)
{
size_t delta = 0;
unsigned long uaddr = uvma->vm_start;
if (!PAGE_ALIGNED(uaddr) || !PAGE_ALIGNED(kaddr)
|| !PAGE_ALIGNED(size))
Expand All @@ -168,7 +169,11 @@ static int map_vmalloc_range(struct vm_area_struct *uvma, void *kaddr, size_t si
* continuous. So we need to map each vmalloced page separetely.
* Use vmalloc_to_page and vm_insert_page functions for this.
*/
// TODO
for (; delta < size; delta += PAGE_SIZE) {
struct page* p = vmalloc_to_page(kaddr + delta);
int res = vm_insert_page(uvma, uaddr + delta, p);
if (res) return res;
}

uvma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
return 0;
Expand Down
68 changes: 52 additions & 16 deletions tasks/vsd2/vsd_userspace/vsd_device.c
Original file line number Diff line number Diff line change
@@ -1,51 +1,87 @@
#include <sys/mman.h>

#include <stdio.h>
#include <fcntl.h>

#include "vsd_device.h"
#include "../vsd_driver/vsd_ioctl.h"

int desc = -1;

int vsd_init()
{
// TODO
return -1;
if ((desc = open("/dev/vsd", O_RDWR)) < 0) return -1;
return 0;
}

int vsd_deinit()
{
// TODO
return -1;
if (desc < 0) return -1;
close(desc);

This comment has been minimized.

Copy link
@eabatalov

eabatalov Apr 7, 2016

Collaborator

close may fail

return 0;
}

int vsd_get_size(size_t *out_size)
{
// TODO
return -1;
if (desc < 0) return -1;
vsd_ioctl_get_size_arg_t iotcl_size;
if (ioctl(desc, VSD_IOCTL_GET_SIZE, &iotcl_size)) return -1;
*out_size = iotcl_size.size;
return 0;
}

int vsd_set_size(size_t size)
{
// TODO
return -1;
if (desc < 0) return -1;
vsd_ioctl_set_size_arg_t iotcl_size;
iotcl_size.size = size;
if (ioctl(desc, VSD_IOCTL_SET_SIZE, &iotcl_size)) return -1;
return 0;
}

ssize_t vsd_read(char* dst, off_t offset, size_t size)
{
// TODO
return -1;
if (desc < 0) return -1;
if (lseek(desc, offset, SEEK_SET) < 0) {
close(desc);

This comment has been minimized.

Copy link
@eabatalov

eabatalov Apr 7, 2016

Collaborator

no need to deinit the whole lib on lseek error.
user may pass just invalid offset and get lseek error.

return -1;
}
if (read(desc, dst, size) < 0) {
close(desc);

This comment has been minimized.

Copy link
@eabatalov

eabatalov Apr 7, 2016

Collaborator

The same for read

return -1;
}
return 0;
}

ssize_t vsd_write(const char* src, off_t offset, size_t size)
{
// TODO
return -1;
if (desc < 0) return -1;
if (lseek(desc, offset, SEEK_SET) < 0) {
close(desc);
return -1;
}
if (write(desc, src, size) < 0) {
close(desc);
return -1;
}
return 0;
}

void* vsd_mmap(size_t offset)
{
// TODO
return MAP_FAILED;
size_t size;
if (desc < 0) return MAP_FAILED;
if (offset % getpagesize() != 0) return MAP_FAILED;

This comment has been minimized.

Copy link
@eabatalov

eabatalov Apr 7, 2016

Collaborator

no need to perform mmap syscall and vsd driver checks here. At least don't copy-paste them.

if (vsd_get_size(&size) < 0) return MAP_FAILED;
return mmap(NULL, size - offset, PROT_READ | PROT_WRITE, MAP_SHARED, desc, offset);
}

int vsd_munmap(void* addr, size_t offset)
{
// TODO
return -1;
size_t size;
if (desc < 0) return -1;
if ((size_t) addr % getpagesize() != 0 || offset % getpagesize() != 0)
return -1;
if (vsd_get_size(&size) < 0) return -1;
return munmap(addr, size - offset);
}

0 comments on commit b6edb15

Please sign in to comment.