Commit 90babde0cad8a485e5f74a2113c0425c08395a47
Committed by
Christoph Hellwig
1 parent
0e1d8f4c
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>
Showing
1 changed file
with
19 additions
and
29 deletions
block/raw-posix.c
@@ -124,7 +124,8 @@ static int cd_open(BlockDriverState *bs); | @@ -124,7 +124,8 @@ static int cd_open(BlockDriverState *bs); | ||
124 | 124 | ||
125 | static int raw_is_inserted(BlockDriverState *bs); | 125 | static int raw_is_inserted(BlockDriverState *bs); |
126 | 126 | ||
127 | -static int raw_open(BlockDriverState *bs, const char *filename, int flags) | 127 | +static int raw_open_common(BlockDriverState *bs, const char *filename, |
128 | + int flags) | ||
128 | { | 129 | { |
129 | BDRVRawState *s = bs->opaque; | 130 | BDRVRawState *s = bs->opaque; |
130 | int fd, ret; | 131 | int fd, ret; |
@@ -140,8 +141,6 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | @@ -140,8 +141,6 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | ||
140 | s->open_flags |= O_RDONLY; | 141 | s->open_flags |= O_RDONLY; |
141 | bs->read_only = 1; | 142 | bs->read_only = 1; |
142 | } | 143 | } |
143 | - if (flags & BDRV_O_CREAT) | ||
144 | - s->open_flags |= O_CREAT | O_TRUNC; | ||
145 | 144 | ||
146 | /* Use O_DSYNC for write-through caching, no flags for write-back caching, | 145 | /* Use O_DSYNC for write-through caching, no flags for write-back caching, |
147 | * and O_DIRECT for no caching. */ | 146 | * and O_DIRECT for no caching. */ |
@@ -150,8 +149,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | @@ -150,8 +149,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | ||
150 | else if (!(flags & BDRV_O_CACHE_WB)) | 149 | else if (!(flags & BDRV_O_CACHE_WB)) |
151 | s->open_flags |= O_DSYNC; | 150 | s->open_flags |= O_DSYNC; |
152 | 151 | ||
153 | - s->type = FTYPE_FILE; | ||
154 | - | 152 | + s->fd = -1; |
155 | fd = open(filename, s->open_flags, 0644); | 153 | fd = open(filename, s->open_flags, 0644); |
156 | if (fd < 0) { | 154 | if (fd < 0) { |
157 | ret = -errno; | 155 | ret = -errno; |
@@ -172,6 +170,17 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | @@ -172,6 +170,17 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | ||
172 | return 0; | 170 | return 0; |
173 | } | 171 | } |
174 | 172 | ||
173 | +static int raw_open(BlockDriverState *bs, const char *filename, int flags) | ||
174 | +{ | ||
175 | + BDRVRawState *s = bs->opaque; | ||
176 | + | ||
177 | + s->type = FTYPE_FILE; | ||
178 | + if (flags & BDRV_O_CREAT) | ||
179 | + s->open_flags |= O_CREAT | O_TRUNC; | ||
180 | + | ||
181 | + return raw_open_common(bs, filename, flags); | ||
182 | +} | ||
183 | + | ||
175 | /* XXX: use host sector size if necessary with: | 184 | /* XXX: use host sector size if necessary with: |
176 | #ifdef DIOCGSECTORSIZE | 185 | #ifdef DIOCGSECTORSIZE |
177 | { | 186 | { |
@@ -949,9 +958,7 @@ kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex ma | @@ -949,9 +958,7 @@ kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex ma | ||
949 | static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | 958 | static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
950 | { | 959 | { |
951 | BDRVRawState *s = bs->opaque; | 960 | BDRVRawState *s = bs->opaque; |
952 | - int fd, ret; | ||
953 | - | ||
954 | - posix_aio_init(); | 961 | + int ret; |
955 | 962 | ||
956 | #ifdef CONFIG_COCOA | 963 | #ifdef CONFIG_COCOA |
957 | if (strstart(filename, "/dev/cdrom", NULL)) { | 964 | if (strstart(filename, "/dev/cdrom", NULL)) { |
@@ -979,19 +986,6 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | @@ -979,19 +986,6 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | ||
979 | IOObjectRelease( mediaIterator ); | 986 | IOObjectRelease( mediaIterator ); |
980 | } | 987 | } |
981 | #endif | 988 | #endif |
982 | - s->open_flags |= O_BINARY; | ||
983 | - if ((flags & BDRV_O_ACCESS) == O_RDWR) { | ||
984 | - s->open_flags |= O_RDWR; | ||
985 | - } else { | ||
986 | - s->open_flags |= O_RDONLY; | ||
987 | - bs->read_only = 1; | ||
988 | - } | ||
989 | - /* Use O_DSYNC for write-through caching, no flags for write-back caching, | ||
990 | - * and O_DIRECT for no caching. */ | ||
991 | - if ((flags & BDRV_O_NOCACHE)) | ||
992 | - s->open_flags |= O_DIRECT; | ||
993 | - else if (!(flags & BDRV_O_CACHE_WB)) | ||
994 | - s->open_flags |= O_DSYNC; | ||
995 | 989 | ||
996 | s->type = FTYPE_FILE; | 990 | s->type = FTYPE_FILE; |
997 | #if defined(__linux__) | 991 | #if defined(__linux__) |
@@ -1015,15 +1009,11 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | @@ -1015,15 +1009,11 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | ||
1015 | s->type = FTYPE_CD; | 1009 | s->type = FTYPE_CD; |
1016 | } | 1010 | } |
1017 | #endif | 1011 | #endif |
1018 | - s->fd = -1; | ||
1019 | - fd = open(filename, s->open_flags, 0644); | ||
1020 | - if (fd < 0) { | ||
1021 | - ret = -errno; | ||
1022 | - if (ret == -EROFS) | ||
1023 | - ret = -EACCES; | 1012 | + |
1013 | + ret = raw_open_common(bs, filename, flags); | ||
1014 | + if (ret) | ||
1024 | return ret; | 1015 | return ret; |
1025 | - } | ||
1026 | - s->fd = fd; | 1016 | + |
1027 | #if defined(__FreeBSD__) | 1017 | #if defined(__FreeBSD__) |
1028 | /* make sure the door isnt locked at this time */ | 1018 | /* make sure the door isnt locked at this time */ |
1029 | if (s->type == FTYPE_CD) | 1019 | if (s->type == FTYPE_CD) |