Changeset 594303b in mainline
- Timestamp:
- 2009-04-18T15:32:56Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8d049ee0
- Parents:
- 6b6e423a
- Location:
- uspace
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/init/init.c
r6b6e423a r594303b 46 46 #include <macros.h> 47 47 #include <console.h> 48 #include <string.h> 48 49 #include "init.h" 49 50 #include "version.h" … … 52 53 { 53 54 int rc = -1; 55 char *opts = ""; 54 56 57 if (str_cmp(fstype, "tmpfs") == 0) 58 opts = "restore"; 59 55 60 while (rc < 0) { 56 rc = mount(fstype, "/", "initrd", IPC_FLAG_BLOCKING);61 rc = mount(fstype, "/", "initrd", opts, IPC_FLAG_BLOCKING); 57 62 58 63 switch (rc) { -
uspace/app/tester/vfs/vfs1.c
r6b6e423a r594303b 46 46 int rc; 47 47 48 rc = mount("tmpfs", "/", "nulldev0", 0);48 rc = mount("tmpfs", "/", "nulldev0", "", 0); 49 49 switch (rc) { 50 50 case EOK: -
uspace/lib/libc/generic/vfs/vfs.c
r6b6e423a r594303b 156 156 157 157 int mount(const char *fs_name, const char *mp, const char *dev, 158 158 const char *opts, const unsigned int flags) 159 159 { 160 160 int res; … … 186 186 } 187 187 188 rc = ipc_data_write_start(vfs_phone, (void *) opts, str_size(opts)); 189 if (rc != EOK) { 190 async_wait_for(req, NULL); 191 async_serialize_end(); 192 futex_up(&vfs_phone_futex); 193 free(mpa); 194 return (int) rc; 195 } 196 188 197 rc = ipc_data_write_start(vfs_phone, (void *) fs_name, str_size(fs_name)); 189 198 if (rc != EOK) { -
uspace/lib/libc/include/vfs/vfs.h
r6b6e423a r594303b 40 40 extern char *absolutize(const char *, size_t *); 41 41 42 extern int mount(const char *, const char *, const char *, 42 extern int mount(const char *, const char *, const char *, const char *, 43 43 const unsigned int flags); 44 44 -
uspace/srv/fs/fat/fat_ops.c
r6b6e423a r594303b 756 756 int rc; 757 757 758 /* accept the mount options */ 759 ipc_callid_t callid; 760 size_t size; 761 if (!ipc_data_write_receive(&callid, &size)) { 762 ipc_answer_0(callid, EINVAL); 763 ipc_answer_0(rid, EINVAL); 764 return; 765 } 766 char *opts = malloc(size + 1); 767 if (!opts) { 768 ipc_answer_0(callid, ENOMEM); 769 ipc_answer_0(rid, ENOMEM); 770 return; 771 } 772 ipcarg_t retval = ipc_data_write_finalize(callid, opts, size); 773 if (retval != EOK) { 774 ipc_answer_0(rid, retval); 775 free(opts); 776 return; 777 } 778 opts[size] = '\0'; 779 758 780 /* initialize libblock */ 759 781 rc = block_init(dev_handle, BS_SIZE); -
uspace/srv/fs/tmpfs/tmpfs_ops.c
r6b6e423a r594303b 400 400 dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 401 401 402 /* accept the mount options */ 403 ipc_callid_t callid; 404 size_t size; 405 if (!ipc_data_write_receive(&callid, &size)) { 406 ipc_answer_0(callid, EINVAL); 407 ipc_answer_0(rid, EINVAL); 408 return; 409 } 410 char *opts = malloc(size + 1); 411 if (!opts) { 412 ipc_answer_0(callid, ENOMEM); 413 ipc_answer_0(rid, ENOMEM); 414 return; 415 } 416 ipcarg_t retval = ipc_data_write_finalize(callid, opts, size); 417 if (retval != EOK) { 418 ipc_answer_0(rid, retval); 419 free(opts); 420 return; 421 } 422 opts[size] = '\0'; 423 402 424 /* Initialize TMPFS. */ 403 425 if (!root && !tmpfs_init()) { … … 406 428 } 407 429 408 if ( dev_handle >= 0) {430 if (str_cmp(opts, "restore") == 0) { 409 431 if (tmpfs_restore(dev_handle)) 410 432 ipc_answer_3(rid, EOK, root->index, root->size, -
uspace/srv/vfs/vfs.h
r6b6e423a r594303b 255 255 extern link_t plb_head; /**< List of active PLB entries. */ 256 256 257 #define MAX_MNTOPTS_LEN 256 258 257 259 /** Holding this rwlock prevents changes in file system namespace. */ 258 260 extern rwlock_t namespace_rwlock; -
uspace/srv/vfs/vfs_ops.c
r6b6e423a r594303b 61 61 char *fs_name; /**< File system name */ 62 62 char *mp; /**< Mount point */ 63 char *opts; /**< Mount options. */ 63 64 ipc_callid_t callid; /**< Call ID waiting for the mount */ 64 65 ipc_callid_t rid; /**< Request ID */ … … 81 82 82 83 static void vfs_mount_internal(ipc_callid_t rid, dev_handle_t dev_handle, 83 fs_handle_t fs_handle, char *mp) 84 { 85 /* Resolve the path to the mountpoint. */ 84 fs_handle_t fs_handle, char *mp, char *opts) 85 { 86 86 vfs_lookup_res_t mp_res; 87 87 vfs_node_t *mp_node = NULL; 88 i nt rc;88 ipcarg_t rc; 89 89 int phone; 90 aid_t msg; 91 ipc_call_t answer; 92 93 /* Resolve the path to the mountpoint. */ 90 94 futex_down(&rootfs_futex); 91 95 if (rootfs.fs_handle) { … … 128 132 vfs_lookup_res_t mr_res; 129 133 vfs_node_t *mr_node; 130 ipcarg_t rindex;131 ipcarg_t rsize;132 ipcarg_trlnkcnt;134 fs_index_t rindex; 135 size_t rsize; 136 unsigned rlnkcnt; 133 137 134 138 /* … … 139 143 /* Tell the mountee that it is being mounted. */ 140 144 phone = vfs_grab_phone(fs_handle); 141 rc = async_req_1_3(phone, VFS_MOUNTED, 142 (ipcarg_t) dev_handle, &rindex, &rsize, &rlnkcnt); 145 msg = async_send_1(phone, VFS_MOUNTED, 146 (ipcarg_t) dev_handle, &answer); 147 /* send the mount options */ 148 rc = ipc_data_write_start(phone, (void *)opts, 149 str_size(opts)); 150 if (rc != EOK) { 151 async_wait_for(msg, NULL); 152 vfs_release_phone(phone); 153 futex_up(&rootfs_futex); 154 ipc_answer_0(rid, rc); 155 return; 156 } 157 async_wait_for(msg, &rc); 143 158 vfs_release_phone(phone); 144 159 … … 148 163 return; 149 164 } 165 166 rindex = (fs_index_t) IPC_GET_ARG1(answer); 167 rsize = (size_t) IPC_GET_ARG2(answer); 168 rlnkcnt = (unsigned) IPC_GET_ARG3(answer); 150 169 151 170 mr_res.triplet.fs_handle = fs_handle; 152 171 mr_res.triplet.dev_handle = dev_handle; 153 mr_res.triplet.index = (fs_index_t)rindex;154 mr_res.size = (size_t)rsize;155 mr_res.lnkcnt = (unsigned)rlnkcnt;172 mr_res.triplet.index = rindex; 173 mr_res.size = rsize; 174 mr_res.lnkcnt = rlnkcnt; 156 175 mr_res.type = VFS_NODE_DIRECTORY; 157 176 … … 184 203 185 204 phone = vfs_grab_phone(mp_res.triplet.fs_handle); 186 rc = async_req_4_0(phone, VFS_MOUNT,205 msg = async_send_4(phone, VFS_MOUNT, 187 206 (ipcarg_t) mp_res.triplet.dev_handle, 188 207 (ipcarg_t) mp_res.triplet.index, 189 208 (ipcarg_t) fs_handle, 190 (ipcarg_t) dev_handle); 209 (ipcarg_t) dev_handle, &answer); 210 /* send the mount options */ 211 rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); 212 if (rc != EOK) { 213 async_wait_for(msg, NULL); 214 vfs_release_phone(phone); 215 /* Mount failed, drop reference to mp_node. */ 216 if (mp_node) 217 vfs_node_put(mp_node); 218 ipc_answer_0(rid, rc); 219 return; 220 } 221 async_wait_for(msg, &rc); 191 222 vfs_release_phone(phone); 192 223 … … 217 248 218 249 /* Do the mount */ 219 vfs_mount_internal(pr->rid, pr->dev_handle, fs_handle, pr->mp); 250 vfs_mount_internal(pr->rid, pr->dev_handle, fs_handle, pr->mp, 251 pr->opts); 220 252 221 253 free(pr->fs_name); 222 254 free(pr->mp); 255 free(pr->opts); 223 256 list_remove(cur); 224 257 free(pr); … … 279 312 mp[size] = '\0'; 280 313 314 /* Now we expect to receive the mount options. */ 315 if (!ipc_data_write_receive(&callid, &size)) { 316 ipc_answer_0(callid, EINVAL); 317 ipc_answer_0(rid, EINVAL); 318 free(mp); 319 return; 320 } 321 322 /* Check the offered options size. */ 323 if (size < 0 || size > MAX_MNTOPTS_LEN) { 324 ipc_answer_0(callid, EINVAL); 325 ipc_answer_0(rid, EINVAL); 326 free(mp); 327 return; 328 } 329 330 /* Allocate buffer for the mount options. */ 331 char *opts = (char *) malloc(size + 1); 332 if (!opts) { 333 ipc_answer_0(callid, ENOMEM); 334 ipc_answer_0(rid, ENOMEM); 335 free(mp); 336 return; 337 } 338 339 /* Deliver the mount options. */ 340 retval = ipc_data_write_finalize(callid, opts, size); 341 if (retval != EOK) { 342 ipc_answer_0(rid, retval); 343 free(mp); 344 free(opts); 345 return; 346 } 347 opts[size] = '\0'; 348 281 349 /* 282 350 * Now, we expect the client to send us data with the name of the file … … 287 355 ipc_answer_0(rid, EINVAL); 288 356 free(mp); 357 free(opts); 289 358 return; 290 359 } … … 298 367 ipc_answer_0(rid, EINVAL); 299 368 free(mp); 369 free(opts); 300 370 return; 301 371 } … … 309 379 ipc_answer_0(rid, ENOMEM); 310 380 free(mp); 381 free(opts); 311 382 return; 312 383 } … … 317 388 ipc_answer_0(rid, retval); 318 389 free(mp); 390 free(opts); 319 391 free(fs_name); 320 392 return; … … 332 404 ipc_answer_0(rid, ENOTSUP); 333 405 free(mp); 406 free(opts); 334 407 free(fs_name); 335 408 return; … … 352 425 free(mp); 353 426 free(fs_name); 427 free(opts); 354 428 return; 355 429 } … … 357 431 pr->fs_name = fs_name; 358 432 pr->mp = mp; 433 pr->opts = opts; 359 434 pr->callid = callid; 360 435 pr->rid = rid; … … 369 444 free(mp); 370 445 free(fs_name); 446 free(opts); 371 447 return; 372 448 } … … 376 452 377 453 /* Do the mount */ 378 vfs_mount_internal(rid, dev_handle, fs_handle, mp );454 vfs_mount_internal(rid, dev_handle, fs_handle, mp, opts); 379 455 free(mp); 380 456 free(fs_name); 457 free(opts); 381 458 } 382 459
Note:
See TracChangeset
for help on using the changeset viewer.