Commit 90babde0cad8a485e5f74a2113c0425c08395a47

Authored by Christoph Hellwig
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)