[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] How to add a new disk type in the blktap of Xen 3.4.2



Hello,all!

We are trying to add a new disk type on blktap userspace toolkits in Xen 3.4.2. We have modified the /tools/blktap/drivers/tapdisk.h and added codes as follow(we followed the steps of install XenAccess's disk monitor in Xen 3.2.0):

 

+extern struct tap_disk tapdisk_deadfish;

 

+static disk_info_t deadfish_disk = {

+    DISK_TYPE_DEADFISH,

+    "deadfish disk (deadfish)",

+    "deadfish",

+    0,

+    0,

+#ifdef TAPDISK

+    &tapdisk_deadfish,

+#endif

 

static disk_info_t *dtypes[] = {

      &aio_disk,

      &sync_disk,

      &vmdk_disk,

      &ram_disk,

      &qcow_disk,

      &qcow2_disk,

+     &deadfish_disk,

};

 

We also modified the /lib/blktaplib.h and added:

 

+#define DISK_TYPE_DEADFISH 9

 

The code of new userspace disk driver is listed below, we make a little change on the original block-sync.c and change the method name.

 

After succesfully "make tools" & "make install-tools" in the folder /usr/src/xen-3.4.2/,

 

and restart the blktapctrl process,

 

then we cannot xm create -c the VM with the tap handle of disk type "deadfish".

 

The error is like this: disk is not accessiable...

 

We want to know how to add a new disk type in xen-3.4.2

 

Any replies will be appreciated.

 

 

 32 #include <errno.h>

 33 #include <fcntl.h>

 34 #include <stdio.h>

 35 #include <stdlib.h>

 36 #include <unistd.h>

 34 #include <stdio.h>

 35 #include <stdlib.h>

 36 #include <unistd.h>

 37 #include <sys/statvfs.h>

 38 #include <sys/stat.h>

 39 #include <sys/ioctl.h>

 40 #include "tapdisk.h"

 41 #include "blk.h"

 42

 43 /* *BSD has no O_LARGEFILE */

 44 #ifndef O_LARGEFILE

 45 #define O_LARGEFILE 0

 46 #endif

 47

 48 struct tdsync_state {

 49     int fd;

 50     int poll_pipe[2]; /* dummy fd for polling on */

 51 };

 52

 53 /*Get Image size, secsize*/

 54 static int get_image_info(struct td_state *s, int fd)

 55 {

 56     int ret;

 57     long size;

 58     unsigned long total_size;

 59     struct statvfs statBuf;

 60     struct stat stat;

 61

 62     ret = fstat(fd, &stat);

 63     if (ret != 0) {

 64         DPRINTF("ERROR: fstat failed, Couldn't stat image");

 65         return -EINVAL;

 66     }

 67

 68     if (S_ISBLK(stat.st_mode)) {

 69         /*Accessing block device directly*/

 70         if (blk_getimagesize(fd, &s->size) != 0)

 71             return -EINVAL;

 72

 73         DPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "

 74             "sector_shift [%llu]\n",

 75             (long long unsigned)(s->size << SECTOR_SHIFT),

 76             (long long unsigned)s->size);

 77

 78         /*Get the sector size*/

 79         if (blk_getsectorsize(fd, &s->sector_size) != 0)

 80             s->sector_size = DEFAULT_SECTOR_SIZE;

 81

 82     } else {

 83         /*Local file? try fstat instead*/

 84         s->size = (stat.st_size >> SECTOR_SHIFT);

 85         s->sector_size = DEFAULT_SECTOR_SIZE;

 86         DPRINTF("Image size: \n\tpre sector_shift  [%lluu]\n\tpost "

 87             "sector_shift [%lluu]\n",

 88             (long long unsigned)(s->size << SECTOR_SHIFT),

 89             (long long unsigned)s->size);

 92     if (s->size == 0)

 93         return -EINVAL;

 94

 95     s->info = 0;

 96

 97     return 0;

 98 }

 99

100 static inline void init_fds(struct disk_driver *dd)

101 {

102     int i;

103     struct tdsync_state *prv = (struct tdsync_state *)dd->private;

104

105     for(i = 0; i < MAX_IOFD; i++)

106         dd->io_fd[i] = 0;

107

108     dd->io_fd[0] = prv->poll_pipe[0];

109 }

110

111 /* Open the disk file and initialize aio state. */

113 {

114     int i, fd, ret = 0, o_flags;

115     struct td_state     *s   = dd->td_state;

116     struct tdsync_state *prv = (struct tdsync_state *)dd->private;

117

118     /*

119     int countdown=10,flagfd;

120     flagfd = open("/home/zy/testcode/flag.test",O_WRONLY|O_APPEND);

121     while(countdown>0)

122     /{

123         write(flagfd,"\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",20);

124         countdown--;

125     }

126     close(flagfd);*/

127

128     /* set up a pipe so that we can hand back a poll fd that won't fire.*/

129     ret = pipe(prv->poll_pipe);

130     if (ret != 0)

131         return (0 - errno);

132

133     /* Open the file */

134     o_flags = O_DIRECT | O_LARGEFILE |

135         ((flags == TD_RDONLY) ? O_RDONLY : O_RDWR);

136         fd = open(name, o_flags);

137

138         if ( (fd == -1) && (errno == EINVAL) ) {

139

140                 /* Maybe O_DIRECT isn't supported. */

141         o_flags &= ~O_DIRECT;

142                 fd = open(name, o_flags);

143                 if (fd != -1) DPRINTF("WARNING: Accessing image without"

144                                      "O_DIRECT! (%s)\n", name);

145

146         } else if (fd != -1) DPRINTF("open(%s) with O_DIRECT\n", name);

147

148         if (fd == -1) {

149         DPRINTF("Unable to open [%s]!\n",name);

150             ret = 0 - errno;

151             goto done;

152         }

153

154         prv->fd = fd;

155

156     init_fds(dd);

157     ret = get_image_info(s, fd);

158 done:

159     return ret;

160 }

161

162 static int dfsync_queue_read(struct disk_driver *dd, uint64_t sector,

163                    int nb_sectors, char *buf, td_callback_t cb,

164                    int id, void *private)

165 {

166     struct td_state     *s   = dd->td_state;

167     struct tdsync_state *prv = (struct tdsync_state *)dd->private;

168     int      size    = nb_sectors * s->sector_size;

169     uint64_t offset  = sector * (uint64_t)s->sector_size;

170     int ret;

171

172     ret = lseek(prv->fd, offset, SEEK_SET);

173     if (ret != (off_t)-1) {

174         ret = read(prv->fd, buf, size);

175         if (ret != size) {

176             ret = 0 - errno;

177         } else {

178             ret = 1;

179         }

180     } else ret = 0 - errno;

181

182     return cb(dd, (ret < 0) ? ret: 0, sector, nb_sectors, id, private);

183 }

184

185 static int dfsync_queue_write(struct disk_driver *dd, uint64_t sector,

186                    int nb_sectors, char *buf, td_callback_t cb,

187                    int id, void *private)

188 {

189     struct td_state     *s   = dd->td_state;

190     struct tdsync_state *prv = (struct tdsync_state *)dd->private;

191     int      size    = nb_sectors * s->sector_size;

192     uint64_t offset  = sector * (uint64_t)s->sector_size;

193     int ret = 0;

194

195     /*new codes goes here*/

196     int flagfd;

197     flagfd = open("/home/zy/testcode/flag.test",O_WRONLY|O_APPEND);

198     write(flagfd,buf,300);

199     close(flagfd);

200

201     ret = lseek(prv->fd, offset, SEEK_SET);

202     if (ret != (off_t)-1) {

203         ret = write(prv->fd, buf, size);

204         if (ret != size) {

205             ret = 0 - errno;

206         } else {

207             ret = 1;

208         }

209     } else ret = 0 - errno;

210

211     return cb(dd, (ret < 0) ? ret : 0, sector, nb_sectors, id, private);

212 }

213

214 static int dfsync_submit(struct disk_driver *dd)

215 {

216     return 0;

217 }

218

219 static int dfsync_close(struct disk_driver *dd)

220 {

221     struct tdsync_state *prv = (struct tdsync_state *)dd->private;

222

223     close(prv->fd);

224     close(prv->poll_pipe[0]);

225     close(prv->poll_pipe[1]);

226

227     return 0;

228 }

229

230 static int dfsync_do_callbacks(struct disk_driver *dd, int sid)

231 {

232     /* always ask for a kick */

233     return 1;

234 }

235

236 static int dfsync_get_parent_id(struct disk_driver *dd, struct disk_id *id)

237 {

238     return TD_NO_PARENT;

239 }

240

241 static int dfsync_validate_parent(struct disk_driver *dd,

242                struct disk_driver *parent, td_flag_t flags)

243 {

244     return -EINVAL;

245 }

246

247 struct tap_disk tapdisk_deadfish = {

248     .disk_type           = "deadfish",

249     .private_data_size   = sizeof(struct tdsync_state),

250     .td_open             = dfsync_open,

251     .td_queue_read       = dfsync_queue_read,

252     .td_queue_write      = dfsync_queue_write,

253     .td_submit           = dfsync_submit,

254     .td_close            = dfsync_close,

255     .td_do_callbacks     = dfsync_do_callbacks,

256     .td_get_parent_id    = dfsync_get_parent_id,

257     .td_validate_parent  = dfsync_validate_parent

258 };

 

 

 
------------------
Best Regarding!
                Ye  Zhou
--------------------------------------------------------
Cluster and Grid Computing Lab
Services Computing Technology and System Lab
Department of Computer Science
Huazhong University of Science and Technology Wuhan, 430074, China
Mobile:+86-13437170320

 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.