X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Ffilesys%2Ffsutil.c;h=5f045d64a5ad076f02d686007687d0a93a082f90;hp=bf2c15466af77514211de9ca9e79b54f677ed905;hb=bb0485f5561709b2d9a97fdeda9bfa1bd55a20c9;hpb=59f738d500f51ffc5f487344865b8bed69c26281 diff --git a/src/filesys/fsutil.c b/src/filesys/fsutil.c index bf2c154..5f045d6 100644 --- a/src/filesys/fsutil.c +++ b/src/filesys/fsutil.c @@ -7,7 +7,6 @@ #include "filesys/directory.h" #include "filesys/file.h" #include "filesys/filesys.h" -#include "devices/disk.h" #include "threads/malloc.h" #include "threads/palloc.h" #include "threads/vaddr.h" @@ -25,6 +24,7 @@ fsutil_ls (char **argv UNUSED) PANIC ("root dir open failed"); while (dir_readdir (dir, name)) printf ("%s\n", name); + dir_close (dir); printf ("End of listing.\n"); } @@ -67,28 +67,29 @@ fsutil_rm (char **argv) PANIC ("%s: delete failed\n", file_name); } -/* Extracts a ustar-format tar archive from the scratch disk, hdc - or hd1:0, into the Pintos file system. */ +/* Extracts a ustar-format tar archive from the scratch block + device into the Pintos file system. */ void fsutil_extract (char **argv UNUSED) { - static disk_sector_t sector = 0; + static block_sector_t sector = 0; - struct disk *src; + struct block *src; void *header, *data; /* Allocate buffers. */ - header = malloc (DISK_SECTOR_SIZE); - data = malloc (DISK_SECTOR_SIZE); + header = malloc (BLOCK_SECTOR_SIZE); + data = malloc (BLOCK_SECTOR_SIZE); if (header == NULL || data == NULL) PANIC ("couldn't allocate buffers"); - /* Open source disk. */ - src = disk_get (1, 0); + /* Open source block device. */ + src = block_get_role (BLOCK_SCRATCH); if (src == NULL) - PANIC ("couldn't open scratch disk (hdc or hd1:0)"); + PANIC ("couldn't open scratch device"); - printf ("Extracting ustar archive from scratch disk into file system...\n"); + printf ("Extracting ustar archive from scratch device " + "into file system...\n"); for (;;) { @@ -98,7 +99,7 @@ fsutil_extract (char **argv UNUSED) int size; /* Read and parse ustar header. */ - disk_read (src, sector++, header); + block_read (src, sector++, header); error = ustar_parse_header (header, &file_name, &type, &size); if (error != NULL) PANIC ("bad ustar header in sector %"PRDSNu" (%s)", sector - 1, error); @@ -126,10 +127,10 @@ fsutil_extract (char **argv UNUSED) /* Do copy. */ while (size > 0) { - int chunk_size = (size > DISK_SECTOR_SIZE - ? DISK_SECTOR_SIZE + int chunk_size = (size > BLOCK_SECTOR_SIZE + ? BLOCK_SECTOR_SIZE : size); - disk_read (src, sector++, data); + block_read (src, sector++, data); if (file_write (dst, data, chunk_size) != chunk_size) PANIC ("%s: write failed with %d bytes unwritten", file_name, size); @@ -141,42 +142,42 @@ fsutil_extract (char **argv UNUSED) } } - /* Erase the ustar header from the start of the disk, so that - the extraction operation is idempotent. We erase two blocks - because two blocks of zeros are the ustar end-of-archive - marker. */ + /* Erase the ustar header from the start of the block device, + so that the extraction operation is idempotent. We erase + two blocks because two blocks of zeros are the ustar + end-of-archive marker. */ printf ("Erasing ustar archive...\n"); - memset (header, 0, DISK_SECTOR_SIZE); - disk_write (src, 0, header); - disk_write (src, 1, header); + memset (header, 0, BLOCK_SECTOR_SIZE); + block_write (src, 0, header); + block_write (src, 1, header); free (data); free (header); } /* Copies file FILE_NAME from the file system to the scratch - disk, in ustar format. + device, in ustar format. The first call to this function will write starting at the - beginning of the scratch disk. Later calls advance across the - disk. This position is independent of that used for + beginning of the scratch device. Later calls advance across + the device. This position is independent of that used for fsutil_extract(), so `extract' should precede all `append's. */ void fsutil_append (char **argv) { - static disk_sector_t sector = 0; + static block_sector_t sector = 0; const char *file_name = argv[1]; void *buffer; struct file *src; - struct disk *dst; + struct block *dst; off_t size; - printf ("Appending '%s' to ustar archive on scratch disk...\n", file_name); + printf ("Appending '%s' to ustar archive on scratch device...\n", file_name); /* Allocate buffer. */ - buffer = malloc (DISK_SECTOR_SIZE); + buffer = malloc (BLOCK_SECTOR_SIZE); if (buffer == NULL) PANIC ("couldn't allocate buffer"); @@ -186,35 +187,35 @@ fsutil_append (char **argv) PANIC ("%s: open failed", file_name); size = file_length (src); - /* Open target disk. */ - dst = disk_get (1, 0); + /* Open target block device. */ + dst = block_get_role (BLOCK_SCRATCH); if (dst == NULL) - PANIC ("couldn't open target disk (hdc or hd1:0)"); + PANIC ("couldn't open scratch device"); /* Write ustar header to first sector. */ if (!ustar_make_header (file_name, USTAR_REGULAR, size, buffer)) PANIC ("%s: name too long for ustar format", file_name); - disk_write (dst, sector++, buffer); + block_write (dst, sector++, buffer); /* Do copy. */ while (size > 0) { - int chunk_size = size > DISK_SECTOR_SIZE ? DISK_SECTOR_SIZE : size; - if (sector >= disk_size (dst)) - PANIC ("%s: out of space on scratch disk", file_name); + int chunk_size = size > BLOCK_SECTOR_SIZE ? BLOCK_SECTOR_SIZE : size; + if (sector >= block_size (dst)) + PANIC ("%s: out of space on scratch device", file_name); if (file_read (src, buffer, chunk_size) != chunk_size) PANIC ("%s: read failed with %"PROTd" bytes unread", file_name, size); - memset (buffer + chunk_size, 0, DISK_SECTOR_SIZE - chunk_size); - disk_write (dst, sector++, buffer); + memset (buffer + chunk_size, 0, BLOCK_SECTOR_SIZE - chunk_size); + block_write (dst, sector++, buffer); size -= chunk_size; } /* Write ustar end-of-archive marker, which is two consecutive sectors full of zeros. Don't advance our position past them, though, in case we have more files to append. */ - memset (buffer, 0, DISK_SECTOR_SIZE); - disk_write (dst, sector, buffer); - disk_write (dst, sector, buffer + 1); + memset (buffer, 0, BLOCK_SECTOR_SIZE); + block_write (dst, sector, buffer); + block_write (dst, sector, buffer + 1); /* Finish up. */ file_close (src);