|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [mini-os master] use alloc_file_type() and get_file_from_fd() in blkfront
commit 3b221172f1ee04327388c463e94be875cc1dfde2
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Sun Jan 16 09:33:22 2022 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Jan 18 18:26:43 2022 +0000
use alloc_file_type() and get_file_from_fd() in blkfront
Allocate the file type dynamically via alloc_file_type().
Instead of directly accessing the files[] array use get_file_from_fd().
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
---
blkfront.c | 93 ++++++++++++++++++++++++++++++++++++++++--------------
include/blkfront.h | 5 ---
include/lib.h | 3 +-
lib/sys.c | 24 --------------
4 files changed, 70 insertions(+), 55 deletions(-)
diff --git a/blkfront.c b/blkfront.c
index e3f42be..8f14089 100644
--- a/blkfront.c
+++ b/blkfront.c
@@ -59,10 +59,10 @@ void blkfront_handler(evtchn_port_t port, struct pt_regs
*regs, void *data)
{
#ifdef HAVE_LIBC
struct blkfront_dev *dev = data;
- int fd = dev->fd;
+ struct file *file = get_file_from_fd(dev->fd);
- if (fd != -1)
- files[fd].read = true;
+ if ( file )
+ file->read = true;
#endif
wake_up(&blkfront_queue);
}
@@ -483,9 +483,14 @@ int blkfront_aio_poll(struct blkfront_dev *dev)
moretodo:
#ifdef HAVE_LIBC
- if (dev->fd != -1) {
- files[dev->fd].read = false;
- mb(); /* Make sure to let the handler set read to 1 before we start
looking at the ring */
+ {
+ struct file *file = get_file_from_fd(dev->fd);
+
+ if ( file )
+ {
+ file->read = false;
+ mb(); /* Make sure to let the handler set read to 1 before we
start looking at the ring */
+ }
}
#endif
@@ -554,22 +559,11 @@ moretodo:
}
#ifdef HAVE_LIBC
-int blkfront_open(struct blkfront_dev *dev)
+static int blkfront_posix_rwop(struct file *file, uint8_t *buf, size_t count,
+ bool write)
{
- /* Silently prevent multiple opens */
- if(dev->fd != -1) {
- return dev->fd;
- }
- dev->fd = alloc_fd(FTYPE_BLK);
- printk("blk_open(%s) -> %d\n", dev->nodename, dev->fd);
- files[dev->fd].dev = dev;
- return dev->fd;
-}
-
-int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write)
-{
- struct blkfront_dev* dev = files[fd].dev;
- off_t offset = files[fd].offset;
+ struct blkfront_dev *dev = file->dev;
+ off_t offset = file->offset;
struct blkfront_aiocb aiocb;
unsigned long long disksize = dev->info.sectors * dev->info.sector_size;
unsigned int blocksize = dev->info.sector_size;
@@ -711,14 +705,24 @@ int blkfront_posix_rwop(int fd, uint8_t* buf, size_t
count, int write)
}
free(copybuf);
- files[fd].offset += rc;
+ file->offset += rc;
return rc;
}
-int blkfront_posix_fstat(int fd, struct stat* buf)
+static int blkfront_posix_read(struct file *file, void *buf, size_t nbytes)
{
- struct blkfront_dev* dev = files[fd].dev;
+ return blkfront_posix_rwop(file, buf, nbytes, false);
+}
+
+static int blkfront_posix_write(struct file *file, const void *buf, size_t
nbytes)
+{
+ return blkfront_posix_rwop(file, (void *)buf, nbytes, true);
+}
+
+static int blkfront_posix_fstat(struct file *file, struct stat *buf)
+{
+ struct blkfront_dev *dev = file->dev;
buf->st_mode = dev->info.mode;
buf->st_uid = 0;
@@ -728,4 +732,45 @@ int blkfront_posix_fstat(int fd, struct stat* buf)
return 0;
}
+
+static int blkfront_close_fd(struct file *file)
+{
+ shutdown_blkfront(file->dev);
+
+ return 0;
+}
+
+static const struct file_ops blk_ops = {
+ .name = "blk",
+ .read = blkfront_posix_read,
+ .write = blkfront_posix_write,
+ .lseek = lseek_default,
+ .close = blkfront_close_fd,
+ .fstat = blkfront_posix_fstat,
+ .select_rd = select_read_flag,
+};
+
+static unsigned int ftype_blk;
+
+__attribute__((constructor))
+static void blkfron_initialize(void)
+{
+ ftype_blk = alloc_file_type(&blk_ops);
+}
+
+int blkfront_open(struct blkfront_dev *dev)
+{
+ struct file *file;
+
+ /* Silently prevent multiple opens */
+ if ( dev->fd != -1 )
+ return dev->fd;
+
+ dev->fd = alloc_fd(ftype_blk);
+ printk("blk_open(%s) -> %d\n", dev->nodename, dev->fd);
+ file = get_file_from_fd(dev->fd);
+ file->dev = dev;
+
+ return dev->fd;
+}
#endif
diff --git a/include/blkfront.h b/include/blkfront.h
index 3528af9..7f84a0a 100644
--- a/include/blkfront.h
+++ b/include/blkfront.h
@@ -28,17 +28,12 @@ struct blkfront_info
};
struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info);
#ifdef HAVE_LIBC
-#include <sys/stat.h>
/* POSIX IO functions:
* use blkfront_open() to get a file descriptor to the block device
* Don't use the other blkfront posix functions here directly, instead use
* read(), write(), lseek() and fstat() on the file descriptor
*/
int blkfront_open(struct blkfront_dev *dev);
-int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write);
-#define blkfront_posix_write(fd, buf, count) blkfront_posix_rwop(fd,
(uint8_t*)buf, count, 1)
-#define blkfront_posix_read(fd, buf, count) blkfront_posix_rwop(fd,
(uint8_t*)buf, count, 0)
-int blkfront_posix_fstat(int fd, struct stat* buf);
#endif
void blkfront_aio(struct blkfront_aiocb *aiocbp, int write);
#define blkfront_aio_read(aiocbp) blkfront_aio(aiocbp, 0)
diff --git a/include/lib.h b/include/lib.h
index 9b7eaae..2f472b0 100644
--- a/include/lib.h
+++ b/include/lib.h
@@ -166,8 +166,7 @@ extern struct wait_queue_head event_queue;
#define FTYPE_FB 6
#define FTYPE_KBD 7
#define FTYPE_TAP 8
-#define FTYPE_BLK 9
-#define FTYPE_N 10
+#define FTYPE_N 9
#define FTYPE_SPARE 16
struct file {
diff --git a/lib/sys.c b/lib/sys.c
index 9973058..cfb5ac1 100644
--- a/lib/sys.c
+++ b/lib/sys.c
@@ -343,11 +343,6 @@ int read(int fd, void *buf, size_t nbytes)
}
return ret * sizeof(union xenfb_in_event);
}
-#endif
-#ifdef CONFIG_BLKFRONT
- case FTYPE_BLK: {
- return blkfront_posix_read(fd, buf, nbytes);
- }
#endif
default:
break;
@@ -392,10 +387,6 @@ int write(int fd, const void *buf, size_t nbytes)
case FTYPE_TAP:
netfront_xmit(files[fd].dev, (void*) buf, nbytes);
return nbytes;
-#endif
-#ifdef CONFIG_BLKFRONT
- case FTYPE_BLK:
- return blkfront_posix_write(fd, buf, nbytes);
#endif
default:
break;
@@ -455,10 +446,6 @@ off_t lseek(int fd, off_t offset, int whence)
return ops->lseek(file, offset, whence);
switch(file->type) {
-#ifdef CONFIG_BLKFRONT
- case FTYPE_BLK:
- break;
-#endif
case FTYPE_FILE:
break;
default:
@@ -505,11 +492,6 @@ int close(int fd)
shutdown_netfront(files[fd].dev);
break;
#endif
-#ifdef CONFIG_BLKFRONT
- case FTYPE_BLK:
- shutdown_blkfront(files[fd].dev);
- break;
-#endif
#ifdef CONFIG_KBDFRONT
case FTYPE_KBD:
shutdown_kbdfront(files[fd].dev);
@@ -591,10 +573,6 @@ int fstat(int fd, struct stat *buf)
buf->st_ctime = time(NULL);
return 0;
}
-#ifdef CONFIG_BLKFRONT
- case FTYPE_BLK:
- return blkfront_posix_fstat(fd, buf);
-#endif
default:
break;
}
@@ -710,7 +688,6 @@ static const char *const file_types[] = {
[FTYPE_CONSOLE] = "console",
[FTYPE_SOCKET] = "socket",
[FTYPE_TAP] = "net",
- [FTYPE_BLK] = "blk",
[FTYPE_KBD] = "kbd",
[FTYPE_FB] = "fb",
};
@@ -896,7 +873,6 @@ static int select_poll(int nfds, fd_set *readfds, fd_set
*writefds, fd_set *exce
FD_CLR(i, exceptfds);
break;
case FTYPE_TAP:
- case FTYPE_BLK:
case FTYPE_KBD:
case FTYPE_FB:
if (FD_ISSET(i, readfds)) {
--
generated by git-patchbot for /home/xen/git/mini-os.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |