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 | 124 | |
| 125 | 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 | 130 | BDRVRawState *s = bs->opaque; |
| 130 | 131 | int fd, ret; |
| ... | ... | @@ -140,8 +141,6 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
| 140 | 141 | s->open_flags |= O_RDONLY; |
| 141 | 142 | bs->read_only = 1; |
| 142 | 143 | } |
| 143 | - if (flags & BDRV_O_CREAT) | |
| 144 | - s->open_flags |= O_CREAT | O_TRUNC; | |
| 145 | 144 | |
| 146 | 145 | /* Use O_DSYNC for write-through caching, no flags for write-back caching, |
| 147 | 146 | * and O_DIRECT for no caching. */ |
| ... | ... | @@ -150,8 +149,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
| 150 | 149 | else if (!(flags & BDRV_O_CACHE_WB)) |
| 151 | 150 | s->open_flags |= O_DSYNC; |
| 152 | 151 | |
| 153 | - s->type = FTYPE_FILE; | |
| 154 | - | |
| 152 | + s->fd = -1; | |
| 155 | 153 | fd = open(filename, s->open_flags, 0644); |
| 156 | 154 | if (fd < 0) { |
| 157 | 155 | ret = -errno; |
| ... | ... | @@ -172,6 +170,17 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
| 172 | 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 | 184 | /* XXX: use host sector size if necessary with: |
| 176 | 185 | #ifdef DIOCGSECTORSIZE |
| 177 | 186 | { |
| ... | ... | @@ -949,9 +958,7 @@ kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex ma |
| 949 | 958 | static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 950 | 959 | { |
| 951 | 960 | BDRVRawState *s = bs->opaque; |
| 952 | - int fd, ret; | |
| 953 | - | |
| 954 | - posix_aio_init(); | |
| 961 | + int ret; | |
| 955 | 962 | |
| 956 | 963 | #ifdef CONFIG_COCOA |
| 957 | 964 | if (strstart(filename, "/dev/cdrom", NULL)) { |
| ... | ... | @@ -979,19 +986,6 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 979 | 986 | IOObjectRelease( mediaIterator ); |
| 980 | 987 | } |
| 981 | 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 | 990 | s->type = FTYPE_FILE; |
| 997 | 991 | #if defined(__linux__) |
| ... | ... | @@ -1015,15 +1009,11 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 1015 | 1009 | s->type = FTYPE_CD; |
| 1016 | 1010 | } |
| 1017 | 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 | 1015 | return ret; |
| 1025 | - } | |
| 1026 | - s->fd = fd; | |
| 1016 | + | |
| 1027 | 1017 | #if defined(__FreeBSD__) |
| 1028 | 1018 | /* make sure the door isnt locked at this time */ |
| 1029 | 1019 | if (s->type == FTYPE_CD) | ... | ... |