diff options
author | Christoph Hellwig <hch@lst.de> | 2009-06-15 13:53:38 +0200 |
---|---|---|
committer | Christoph Hellwig <hch@brick.lst.de> | 2009-06-15 13:53:38 +0200 |
commit | 90babde0cad8a485e5f74a2113c0425c08395a47 (patch) | |
tree | 31ac0562b0dbdbe64bbd00448c5392ef38dfe9a3 | |
parent | 0e1d8f4c549e51fd19793a154862979fdc199477 (diff) | |
download | hqemu-90babde0cad8a485e5f74a2113c0425c08395a47.zip hqemu-90babde0cad8a485e5f74a2113c0425c08395a47.tar.gz |
raw-posix: add a raw_open_common helper
raw_open and hdev_open contain the same basic logic. Add a new
raw_open_common helper containing the guts of the open routine
and call it from raw_open and hdev_open.
We use the new open_flags field in BDRVRawState to allow passing
additional open flags to raw_open_common from both.
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | block/raw-posix.c | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/block/raw-posix.c b/block/raw-posix.c index 6e8dfbd..ae2f70f 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -124,7 +124,8 @@ static int cd_open(BlockDriverState *bs); static int raw_is_inserted(BlockDriverState *bs); -static int raw_open(BlockDriverState *bs, const char *filename, int flags) +static int raw_open_common(BlockDriverState *bs, const char *filename, + int flags) { BDRVRawState *s = bs->opaque; int fd, ret; @@ -140,8 +141,6 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) s->open_flags |= O_RDONLY; bs->read_only = 1; } - if (flags & BDRV_O_CREAT) - s->open_flags |= O_CREAT | O_TRUNC; /* Use O_DSYNC for write-through caching, no flags for write-back caching, * and O_DIRECT for no caching. */ @@ -150,8 +149,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) else if (!(flags & BDRV_O_CACHE_WB)) s->open_flags |= O_DSYNC; - s->type = FTYPE_FILE; - + s->fd = -1; fd = open(filename, s->open_flags, 0644); if (fd < 0) { ret = -errno; @@ -172,6 +170,17 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) return 0; } +static int raw_open(BlockDriverState *bs, const char *filename, int flags) +{ + BDRVRawState *s = bs->opaque; + + s->type = FTYPE_FILE; + if (flags & BDRV_O_CREAT) + s->open_flags |= O_CREAT | O_TRUNC; + + return raw_open_common(bs, filename, flags); +} + /* XXX: use host sector size if necessary with: #ifdef DIOCGSECTORSIZE { @@ -949,9 +958,7 @@ kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex ma static int hdev_open(BlockDriverState *bs, const char *filename, int flags) { BDRVRawState *s = bs->opaque; - int fd, ret; - - posix_aio_init(); + int ret; #ifdef CONFIG_COCOA if (strstart(filename, "/dev/cdrom", NULL)) { @@ -979,19 +986,6 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) IOObjectRelease( mediaIterator ); } #endif - s->open_flags |= O_BINARY; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { - s->open_flags |= O_RDWR; - } else { - s->open_flags |= O_RDONLY; - bs->read_only = 1; - } - /* Use O_DSYNC for write-through caching, no flags for write-back caching, - * and O_DIRECT for no caching. */ - if ((flags & BDRV_O_NOCACHE)) - s->open_flags |= O_DIRECT; - else if (!(flags & BDRV_O_CACHE_WB)) - s->open_flags |= O_DSYNC; s->type = FTYPE_FILE; #if defined(__linux__) @@ -1015,15 +1009,11 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) s->type = FTYPE_CD; } #endif - s->fd = -1; - fd = open(filename, s->open_flags, 0644); - if (fd < 0) { - ret = -errno; - if (ret == -EROFS) - ret = -EACCES; + + ret = raw_open_common(bs, filename, flags); + if (ret) return ret; - } - s->fd = fd; + #if defined(__FreeBSD__) /* make sure the door isnt locked at this time */ if (s->type == FTYPE_CD) |