Changeset d3b2ffa in mainline
- Timestamp:
- 2018-06-29T15:40:10Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5e904dd
- Parents:
- 1e472ee (diff), 1a9174e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 5 added
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r1e472ee rd3b2ffa 1 *.a 2 *.check.c 3 *.d 4 *.deflate 1 5 *.disasm 2 *.deflate3 *.a4 *.o5 6 *.la 6 7 *.lo 7 8 *.map 9 *.o 8 10 *.prev 11 *.pyc 9 12 *.so.* 10 *.d 11 *.pyc 12 *.check.c 13 tag 14 tags 15 common.h.new 16 deps.mk 13 /Makefile.common 17 14 /Makefile.config 18 /Makefile.common19 autotool/20 boot/distroot/21 boot/initrd.img22 15 /common.h 23 16 /config.h 24 17 /cscope.out 25 doxygen/doxygen.cfg26 doxygen/doxygen.cfg.gen27 doxygen/html/28 doxygen/latex/29 18 /hdisk.img 19 /image.boot 30 20 /image.iso 31 21 /uImage.bin 32 /image.boot 22 autotool/ 33 23 boot/arch/arm32/_link.ld 34 24 boot/arch/ia64/_link.ld … … 40 30 boot/components.zip 41 31 boot/components_desc.c 32 boot/distroot/ 42 33 boot/image.bin 43 34 boot/image.boot 44 35 boot/image.raw 36 boot/initrd.img 37 common.h.new 38 deps.mk 39 doxygen/doxygen.cfg 40 doxygen/doxygen.cfg.gen 41 doxygen/html/ 42 doxygen/latex/ 43 kernel/arch/abs32le/_link.ld 45 44 kernel/arch/amd64/_link.ld 46 45 kernel/arch/arm32/_link.ld … … 50 49 kernel/arch/ppc32/_link.ld 51 50 kernel/arch/sparc64/_link.ld 52 kernel/arch/abs32le/_link.ld53 51 kernel/generic/src/debug/real_map.bin 54 52 kernel/kernel.bin 55 53 kernel/kernel.dump 56 54 kernel/kernel.raw 55 tag 56 tags 57 tools/amd64-unknown-elf 58 tools/arm-linux-gnueabi 59 tools/binutils-*.tar.bz2 60 tools/downloads/ 61 tools/gcc-*.tar.bz2 62 tools/gdb-*.tar.gz 63 tools/i686-pc-linux-gnu 64 tools/ia64-pc-linux-gnu 65 tools/mips-linux-gnu 66 tools/mips64el-linux-gnu 67 tools/mipsel-linux-gnu 68 tools/ppc-linux-gnu 69 tools/ppc64-linux-gnu 70 tools/riscv64-unknown-linux-gnu 71 tools/sparc64-linux-gnu 72 tools/sycek/ 57 73 uspace/app/barber/barber 58 74 uspace/app/barber/images.c … … 130 146 uspace/app/vlaunch/images_desc.c 131 147 uspace/app/vlaunch/vlaunch 148 uspace/app/vol/vol 132 149 uspace/app/vterm/vterm 133 150 uspace/app/vuhid/vuh … … 135 152 uspace/app/websrv/websrv 136 153 uspace/app/wifi_supplicant/wifi_supplicant 154 uspace/dist/app/ 137 155 uspace/dist/app/barber 138 156 uspace/dist/app/bdsh … … 206 224 uspace/dist/demo.wav 207 225 uspace/dist/demo.xm 226 uspace/dist/drv/ 208 227 uspace/dist/drv/ahci/ 209 228 uspace/dist/drv/apic/ … … 217 236 uspace/dist/drv/i8042/ 218 237 uspace/dist/drv/i8259/ 238 uspace/dist/drv/icp-ic/ 219 239 uspace/dist/drv/icp/ 220 uspace/dist/drv/icp-ic/221 240 uspace/dist/drv/isa/ 222 241 uspace/dist/drv/kfb/ … … 248 267 uspace/dist/drv/vhc/ 249 268 uspace/dist/drv/virt/ 269 uspace/dist/drv/xhci/ 250 270 uspace/dist/drv/xtkbd/ 251 uspace/dist/ drv/xhci/271 uspace/dist/inc/ 252 272 uspace/dist/inc/_link.ld 253 273 uspace/dist/inc/c/ 254 274 uspace/dist/logo.tga 255 uspace/dist/app/256 uspace/dist/drv/257 uspace/dist/inc/258 275 uspace/dist/srv/ 259 276 uspace/dist/test/ … … 275 292 uspace/drv/bus/usb/usbmid/usbmid 276 293 uspace/drv/bus/usb/vhc/vhc 294 uspace/drv/bus/usb/xhci/test-xhci 277 295 uspace/drv/bus/usb/xhci/xhci 278 uspace/drv/bus/usb/xhci/test-xhci279 296 uspace/drv/char/i8042/i8042 280 297 uspace/drv/char/msim-con/msim-con … … 289 306 uspace/drv/hid/adb-mouse/adb-mouse 290 307 uspace/drv/hid/atkbd/atkbd 291 uspace/drv/hid/xtkbd/xtkbd292 308 uspace/drv/hid/ps2mouse/ps2mouse 293 309 uspace/drv/hid/usbhid/usbhid 310 uspace/drv/hid/xtkbd/xtkbd 294 311 uspace/drv/intctl/apic/apic 295 312 uspace/drv/intctl/i8259/i8259 … … 317 334 uspace/drv/test/test3/test3 318 335 uspace/drv/time/cmos-rtc/cmos-rtc 336 uspace/lib/c/arch/abs32le/_link-dlexe.ld 337 uspace/lib/c/arch/abs32le/_link-loader.ld 338 uspace/lib/c/arch/abs32le/_link-shlib.ld 339 uspace/lib/c/arch/abs32le/_link.ld 319 340 uspace/lib/c/arch/amd64/_link-dlexe.ld 320 341 uspace/lib/c/arch/amd64/_link-loader.ld … … 349 370 uspace/lib/c/arch/sparc64/_link-shlib.ld 350 371 uspace/lib/c/arch/sparc64/_link.ld 351 uspace/lib/c/arch/abs32le/_link-dlexe.ld352 uspace/lib/c/arch/abs32le/_link-loader.ld353 uspace/lib/c/arch/abs32le/_link-shlib.ld354 uspace/lib/c/arch/abs32le/_link.ld355 372 uspace/lib/c/test-libc 356 373 uspace/lib/label/test-liblabel … … 409 426 uspace/srv/vfs/vfs 410 427 uspace/srv/volsrv/volsrv 411 tools/amd64-unknown-elf412 tools/arm-linux-gnueabi413 tools/i686-pc-linux-gnu414 tools/ia64-pc-linux-gnu415 tools/mips-linux-gnu416 tools/mips64el-linux-gnu417 tools/mipsel-linux-gnu418 tools/ppc-linux-gnu419 tools/ppc64-linux-gnu420 tools/riscv64-unknown-linux-gnu421 tools/sparc64-linux-gnu422 tools/binutils-*.tar.bz2423 tools/gcc-*.tar.bz2424 tools/gdb-*.tar.gz425 tools/sycek/426 tools/downloads/ -
boot/Makefile.common
r1e472ee rd3b2ffa 217 217 $(USPACE_PATH)/app/untar/untar \ 218 218 $(USPACE_PATH)/app/usbinfo/usbinfo \ 219 $(USPACE_PATH)/app/vol/vol \ 219 220 $(USPACE_PATH)/app/vuhid/vuh \ 220 221 $(USPACE_PATH)/app/mkbd/mkbd \ -
uspace/Makefile
r1e472ee rd3b2ffa 79 79 app/untar \ 80 80 app/usbinfo \ 81 app/vol \ 81 82 app/vuhid \ 82 83 app/nic \ -
uspace/app/fdisk/fdisk.c
r1e472ee rd3b2ffa 37 37 #include <cap.h> 38 38 #include <errno.h> 39 #include <fdisk.h> 40 #include <io/label.h> 39 41 #include <nchoice.h> 40 42 #include <stdbool.h> 41 43 #include <stdio.h> 42 44 #include <stdlib.h> 43 #include <fdisk.h>44 45 #include <str.h> 46 #include <vol.h> 45 47 46 48 #define NO_LABEL_CAPTION "(No name)" … … 69 71 } devac_t; 70 72 71 static errno_t fdsk_pcnt_fs_format(vol_part_cnt_t pcnt, vol_fstype_t fstype,72 char **rstr)73 {74 errno_t rc;75 char *s;76 77 switch (pcnt) {78 case vpc_empty:79 s = str_dup("Empty");80 if (s == NULL)81 return ENOMEM;82 break;83 case vpc_fs:84 rc = fdisk_fstype_format(fstype, &s);85 if (rc != EOK)86 return ENOMEM;87 break;88 case vpc_unknown:89 s = str_dup("Unknown");90 if (s == NULL)91 return ENOMEM;92 break;93 }94 95 *rstr = s;96 return EOK;97 }98 99 73 /** Confirm user selection. */ 100 74 static errno_t fdsk_confirm(const char *msg, bool *rconfirm) … … 305 279 306 280 for (i = LT_FIRST; i < LT_LIMIT; i++) { 307 rc = fdisk_ltype_format(i, &sltype);281 rc = label_type_format(i, &sltype); 308 282 if (rc != EOK) 309 283 goto error; … … 413 387 414 388 for (i = 0; i < VOL_FSTYPE_LIMIT; i++) { 415 rc = fdisk_fstype_format(i, &sfstype);389 rc = vol_fstype_format(i, &sfstype); 416 390 if (rc != EOK) 417 391 goto error; … … 598 572 } 599 573 600 rc = fdisk_pkind_format(pinfo.pkind, &spkind);574 rc = label_pkind_format(pinfo.pkind, &spkind); 601 575 if (rc != EOK) { 602 576 printf("\nOut of memory.\n"); … … 605 579 606 580 if (pinfo.pkind != lpk_extended) { 607 rc = fdsk_pcnt_fs_format(pinfo.pcnt, pinfo.fstype, &sfstype);581 rc = vol_pcnt_fs_format(pinfo.pcnt, pinfo.fstype, &sfstype); 608 582 if (rc != EOK) { 609 583 printf("Out of memory.\n"); … … 773 747 break; 774 748 default: 775 rc = fdisk_ltype_format(linfo.ltype, &sltype);749 rc = label_type_format(linfo.ltype, &sltype); 776 750 if (rc != EOK) { 777 751 assert(rc == ENOMEM); … … 804 778 } 805 779 806 rc = fdsk_pcnt_fs_format(pinfo.pcnt, pinfo.fstype, &sfstype);780 rc = vol_pcnt_fs_format(pinfo.pcnt, pinfo.fstype, &sfstype); 807 781 if (rc != EOK) { 808 782 printf("Out of memory.\n"); … … 821 795 822 796 if ((linfo.flags & lf_ext_supp) != 0) { 823 rc = fdisk_pkind_format(pinfo.pkind, &spkind);797 rc = label_pkind_format(pinfo.pkind, &spkind); 824 798 if (rc != EOK) { 825 799 printf("\nOut of memory.\n"); -
uspace/app/sysinst/sysinst.c
r1e472ee rd3b2ffa 69 69 #define MOUNT_POINT "/inst" 70 70 71 /** Device containing HelenOS live CD */ 72 #define CD_DEV "devices/\\hw\\pci0\\00:01.0\\ata-c2\\d0" 73 74 #define CD_FS_TYPE "cdfs" 75 #define CD_FS_SRV "/srv/cdfs" 76 #define CD_MOUNT_POINT "/cdrom" 77 78 #define BOOT_FILES_SRC "/cdrom" 71 /** HelenOS live CD volume label */ 72 #define CD_VOL_LABEL "HelenOS-CD" 73 #define CD_MOUNT_POINT "/vol/" CD_VOL_LABEL 74 75 #define BOOT_FILES_SRC CD_MOUNT_POINT 79 76 #define BOOT_BLOCK_IDX 0 /* MBR */ 80 77 … … 196 193 static errno_t sysinst_copy_boot_files(void) 197 194 { 198 task_wait_t twait; 199 task_exit_t texit; 200 errno_t rc; 201 int trc; 202 203 printf("sysinst_copy_boot_files(): start filesystem server\n"); 204 rc = task_spawnl(NULL, &twait, CD_FS_SRV, CD_FS_SRV, NULL); 205 if (rc != EOK) 206 return rc; 207 208 printf("sysinst_copy_boot_files(): wait for filesystem server\n"); 209 rc = task_wait(&twait, &texit, &trc); 210 if (rc != EOK) 211 return rc; 212 213 printf("sysinst_copy_boot_files(): verify filesystem server result\n"); 214 if (texit != TASK_EXIT_NORMAL || trc != 0) { 215 printf("sysinst_fs_mount(): not successful, but could be already loaded.\n"); 216 } 217 218 printf("sysinst_copy_boot_files(): create CD mount point\n"); 219 rc = vfs_link_path(CD_MOUNT_POINT, KIND_DIRECTORY, NULL); 220 if (rc != EOK) 221 return rc; 222 223 printf("sysinst_copy_boot_files(): mount CD filesystem\n"); 224 rc = vfs_mount_path(CD_MOUNT_POINT, CD_FS_TYPE, CD_DEV, "", 0, 0); 225 if (rc != EOK) 226 return rc; 195 errno_t rc; 227 196 228 197 printf("sysinst_copy_boot_files(): copy bootloader files\n"); -
uspace/lib/c/Makefile
r1e472ee rd3b2ffa 112 112 generic/io/log.c \ 113 113 generic/io/logctl.c \ 114 generic/io/label.c \ 114 115 generic/io/kio.c \ 115 116 generic/io/klog.c \ -
uspace/lib/c/generic/vol.c
r1e472ee rd3b2ffa 235 235 } 236 236 237 /** Unmount partition (and possibly eject the media). */ 238 errno_t vol_part_eject(vol_t *vol, service_id_t sid) 239 { 240 async_exch_t *exch; 241 errno_t retval; 242 243 exch = async_exchange_begin(vol->sess); 244 retval = async_req_1_0(exch, VOL_PART_EJECT, sid); 245 async_exchange_end(exch); 246 247 if (retval != EOK) 248 return retval; 249 250 return EOK; 251 } 252 237 253 /** Erase partition (to the extent where we will consider it not containing 238 254 * a file system. … … 304 320 } 305 321 322 /** Format file system type as string. 323 * 324 * @param fstype File system type 325 * @param rstr Place to store pointer to newly allocated string 326 * @return EOK on success, ENOMEM if out of memory 327 */ 328 errno_t vol_fstype_format(vol_fstype_t fstype, char **rstr) 329 { 330 const char *sfstype; 331 char *s; 332 333 sfstype = NULL; 334 switch (fstype) { 335 case fs_exfat: 336 sfstype = "ExFAT"; 337 break; 338 case fs_fat: 339 sfstype = "FAT"; 340 break; 341 case fs_minix: 342 sfstype = "MINIX"; 343 break; 344 case fs_ext4: 345 sfstype = "Ext4"; 346 break; 347 case fs_cdfs: 348 sfstype = "ISO 9660"; 349 break; 350 } 351 352 s = str_dup(sfstype); 353 if (s == NULL) 354 return ENOMEM; 355 356 *rstr = s; 357 return EOK; 358 } 359 360 /** Format partition content / file system type as string. 361 * 362 * @param pcnt Partition content 363 * @param fstype File system type 364 * @param rstr Place to store pointer to newly allocated string 365 * @return EOK on success, ENOMEM if out of memory 366 */ 367 errno_t vol_pcnt_fs_format(vol_part_cnt_t pcnt, vol_fstype_t fstype, 368 char **rstr) 369 { 370 int rc; 371 char *s = NULL; 372 373 switch (pcnt) { 374 case vpc_empty: 375 s = str_dup("Empty"); 376 if (s == NULL) 377 return ENOMEM; 378 break; 379 case vpc_fs: 380 rc = vol_fstype_format(fstype, &s); 381 if (rc != EOK) 382 return ENOMEM; 383 break; 384 case vpc_unknown: 385 s = str_dup("Unknown"); 386 if (s == NULL) 387 return ENOMEM; 388 break; 389 } 390 391 assert(s != NULL); 392 *rstr = s; 393 return EOK; 394 } 395 306 396 /** @} 307 397 */ -
uspace/lib/c/include/ipc/vol.h
r1e472ee rd3b2ffa 42 42 VOL_PART_ADD, 43 43 VOL_PART_INFO, 44 VOL_PART_EJECT, 44 45 VOL_PART_EMPTY, 45 46 VOL_PART_LSUPP, 46 VOL_PART_MKFS ,47 VOL_PART_MKFS 47 48 } vol_request_t; 48 49 -
uspace/lib/c/include/types/vol.h
r1e472ee rd3b2ffa 37 37 38 38 #include <async.h> 39 #include <ipc/vfs.h> 39 40 #include <ipc/vol.h> 40 41 #include <stdbool.h> … … 75 76 /** Volume label */ 76 77 char label[VOL_LABEL_MAXLEN + 1]; 78 /** Current mount point */ 79 char cur_mp[MAX_PATH_LEN + 1]; /* XXX too big */ 80 /** Current mount point is automatic */ 81 bool cur_mp_auto; 77 82 } vol_part_info_t; 78 83 -
uspace/lib/c/include/vol.h
r1e472ee rd3b2ffa 37 37 38 38 #include <async.h> 39 #include <errno.h> 39 40 #include <loc.h> 40 41 #include <stdint.h> … … 47 48 extern errno_t vol_part_add(vol_t *, service_id_t); 48 49 extern errno_t vol_part_info(vol_t *, service_id_t, vol_part_info_t *); 50 extern errno_t vol_part_eject(vol_t *, service_id_t); 49 51 extern errno_t vol_part_empty(vol_t *, service_id_t); 50 52 extern errno_t vol_part_get_lsupp(vol_t *, vol_fstype_t, vol_label_supp_t *); 51 53 extern errno_t vol_part_mkfs(vol_t *, service_id_t, vol_fstype_t, const char *); 54 55 extern errno_t vol_fstype_format(vol_fstype_t, char **); 56 extern errno_t vol_pcnt_fs_format(vol_part_cnt_t, vol_fstype_t, char **); 52 57 53 58 #endif -
uspace/lib/fdisk/include/fdisk.h
r1e472ee rd3b2ffa 37 37 #define LIBFDISK_FDISK_H_ 38 38 39 #include <errno.h> 39 40 #include <loc.h> 40 41 #include <types/fdisk.h> … … 72 73 extern void fdisk_pspec_init(fdisk_part_spec_t *); 73 74 74 extern errno_t fdisk_ltype_format(label_type_t, char **);75 extern errno_t fdisk_fstype_format(vol_fstype_t, char **);76 extern errno_t fdisk_pkind_format(label_pkind_t, char **);77 78 75 extern errno_t fdisk_get_vollabel_support(fdisk_dev_t *, vol_fstype_t, 79 76 vol_label_supp_t *); -
uspace/lib/fdisk/src/fdisk.c
r1e472ee rd3b2ffa 813 813 } 814 814 815 errno_t fdisk_ltype_format(label_type_t ltype, char **rstr)816 {817 const char *sltype;818 char *s;819 820 sltype = NULL;821 switch (ltype) {822 case lt_none:823 sltype = "None";824 break;825 case lt_mbr:826 sltype = "MBR";827 break;828 case lt_gpt:829 sltype = "GPT";830 break;831 }832 833 s = str_dup(sltype);834 if (s == NULL)835 return ENOMEM;836 837 *rstr = s;838 return EOK;839 }840 841 errno_t fdisk_fstype_format(vol_fstype_t fstype, char **rstr)842 {843 const char *sfstype;844 char *s;845 846 sfstype = NULL;847 switch (fstype) {848 case fs_exfat:849 sfstype = "ExFAT";850 break;851 case fs_fat:852 sfstype = "FAT";853 break;854 case fs_minix:855 sfstype = "MINIX";856 break;857 case fs_ext4:858 sfstype = "Ext4";859 break;860 case fs_cdfs:861 sfstype = "ISO 9660";862 break;863 }864 865 s = str_dup(sfstype);866 if (s == NULL)867 return ENOMEM;868 869 *rstr = s;870 return EOK;871 }872 873 errno_t fdisk_pkind_format(label_pkind_t pkind, char **rstr)874 {875 const char *spkind;876 char *s;877 878 spkind = NULL;879 switch (pkind) {880 case lpk_primary:881 spkind = "Primary";882 break;883 case lpk_extended:884 spkind = "Extended";885 break;886 case lpk_logical:887 spkind = "Logical";888 break;889 }890 891 s = str_dup(spkind);892 if (s == NULL)893 return ENOMEM;894 895 *rstr = s;896 return EOK;897 }898 899 815 /** Get free partition index. */ 900 816 static errno_t fdisk_part_get_free_idx(fdisk_dev_t *dev, int *rindex) -
uspace/srv/volsrv/part.c
r1e472ee rd3b2ffa 51 51 52 52 static errno_t vol_part_add_locked(service_id_t); 53 static void vol_part_remove_locked(vol_part_t *); 54 static errno_t vol_part_find_by_id_ref_locked(service_id_t, vol_part_t **); 55 53 56 static LIST_INITIALIZE(vol_parts); /* of vol_part_t */ 54 57 static FIBRIL_MUTEX_INITIALIZE(vol_parts_lock); … … 68 71 }; 69 72 70 /** Check for new partitions */ 73 static const char *fstype_str(vol_fstype_t fstype) 74 { 75 struct fsname_type *fst; 76 77 fst = &fstab[0]; 78 while (fst->name != NULL) { 79 if (fst->fstype == fstype) 80 return fst->name; 81 ++fst; 82 } 83 84 assert(false); 85 return NULL; 86 } 87 88 /** Check for new and removed partitions */ 71 89 static errno_t vol_part_check_new(void) 72 90 { 73 91 bool already_known; 92 bool still_exists; 74 93 category_id_t part_cat; 75 94 service_id_t *svcs; 76 95 size_t count, i; 96 link_t *cur, *next; 97 vol_part_t *part; 77 98 errno_t rc; 78 99 … … 94 115 } 95 116 117 /* Check for new partitions */ 96 118 for (i = 0; i < count; i++) { 97 119 already_known = false; 98 120 121 // XXX Make this faster 99 122 list_foreach(vol_parts, lparts, vol_part_t, part) { 100 123 if (part->svc_id == svcs[i]) { … … 115 138 } 116 139 140 /* Check for removed partitions */ 141 cur = list_first(&vol_parts); 142 while (cur != NULL) { 143 next = list_next(cur, &vol_parts); 144 part = list_get_instance(cur, vol_part_t, lparts); 145 146 still_exists = false; 147 // XXX Make this faster 148 for (i = 0; i < count; i++) { 149 if (part->svc_id == svcs[i]) { 150 still_exists = true; 151 break; 152 } 153 } 154 155 if (!still_exists) { 156 log_msg(LOG_DEFAULT, LVL_NOTE, "Partition '%zu' is gone", 157 part->svc_id); 158 vol_part_remove_locked(part); 159 } 160 161 cur = next; 162 } 163 164 free(svcs); 165 117 166 fibril_mutex_unlock(&vol_parts_lock); 118 167 return EOK; … … 129 178 } 130 179 180 atomic_set(&part->refcnt, 1); 131 181 link_initialize(&part->lparts); 132 182 part->pcnt = vpc_empty; … … 137 187 static void vol_part_delete(vol_part_t *part) 138 188 { 189 log_msg(LOG_DEFAULT, LVL_ERROR, "Freeing partition %p", part); 139 190 if (part == NULL) 140 191 return; 141 192 193 free(part->cur_mp); 142 194 free(part->svc_name); 143 195 free(part); … … 204 256 } 205 257 258 static errno_t vol_part_mount(vol_part_t *part) 259 { 260 char *mp; 261 int err; 262 errno_t rc; 263 264 if (str_size(part->label) < 1) { 265 /* Don't mount nameless volumes */ 266 log_msg(LOG_DEFAULT, LVL_NOTE, "Not mounting nameless partition."); 267 return EOK; 268 } 269 270 log_msg(LOG_DEFAULT, LVL_NOTE, "Determine MP label='%s'", part->label); 271 err = asprintf(&mp, "/vol/%s", part->label); 272 if (err < 0) { 273 log_msg(LOG_DEFAULT, LVL_ERROR, "Out of memory"); 274 return ENOMEM; 275 } 276 277 log_msg(LOG_DEFAULT, LVL_NOTE, "Create mount point '%s'", mp); 278 rc = vfs_link_path(mp, KIND_DIRECTORY, NULL); 279 if (rc != EOK) { 280 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating mount point '%s'", 281 mp); 282 free(mp); 283 return EIO; 284 } 285 286 log_msg(LOG_DEFAULT, LVL_NOTE, "Call vfs_mount_path mp='%s' fstype='%s' svc_name='%s'", 287 mp, fstype_str(part->fstype), part->svc_name); 288 rc = vfs_mount_path(mp, fstype_str(part->fstype), 289 part->svc_name, "", 0, 0); 290 if (rc != EOK) { 291 log_msg(LOG_DEFAULT, LVL_NOTE, "Failed mounting to %s", mp); 292 } 293 log_msg(LOG_DEFAULT, LVL_NOTE, "Mount to %s -> %d\n", mp, rc); 294 295 part->cur_mp = mp; 296 part->cur_mp_auto = true; 297 298 return rc; 299 } 300 206 301 static errno_t vol_part_add_locked(service_id_t sid) 207 302 { … … 210 305 211 306 assert(fibril_mutex_is_locked(&vol_parts_lock)); 307 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_add_locked(%zu)", sid); 212 308 213 309 /* Check for duplicates */ 214 rc = vol_part_find_by_id(sid, &part); 215 if (rc == EOK) 310 rc = vol_part_find_by_id_ref_locked(sid, &part); 311 if (rc == EOK) { 312 vol_part_del_ref(part); 216 313 return EEXIST; 217 218 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_add_locked()"); 314 } 315 316 log_msg(LOG_DEFAULT, LVL_NOTE, "partition %zu is new", sid); 317 219 318 part = vol_part_new(); 220 319 if (part == NULL) … … 233 332 goto error; 234 333 334 rc = vol_part_mount(part); 335 if (rc != EOK) 336 goto error; 337 235 338 list_append(&part->lparts, &vol_parts); 236 339 … … 242 345 vol_part_delete(part); 243 346 return rc; 347 } 348 349 static void vol_part_remove_locked(vol_part_t *part) 350 { 351 assert(fibril_mutex_is_locked(&vol_parts_lock)); 352 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_remove_locked(%zu)", part->svc_id); 353 354 list_remove(&part->lparts); 355 356 log_msg(LOG_DEFAULT, LVL_NOTE, "Removed partition."); 357 vol_part_del_ref(part); 244 358 } 245 359 … … 308 422 } 309 423 310 errno_t vol_part_find_by_id(service_id_t sid, vol_part_t **rpart) 311 { 424 static errno_t vol_part_find_by_id_ref_locked(service_id_t sid, 425 vol_part_t **rpart) 426 { 427 assert(fibril_mutex_is_locked(&vol_parts_lock)); 428 312 429 list_foreach(vol_parts, lparts, vol_part_t, part) { 313 430 if (part->svc_id == sid) { 431 /* Add reference */ 432 atomic_inc(&part->refcnt); 314 433 *rpart = part; 315 /* XXX Add reference */316 434 return EOK; 317 435 } … … 319 437 320 438 return ENOENT; 439 } 440 441 errno_t vol_part_find_by_id_ref(service_id_t sid, vol_part_t **rpart) 442 { 443 errno_t rc; 444 445 fibril_mutex_lock(&vol_parts_lock); 446 rc = vol_part_find_by_id_ref_locked(sid, rpart); 447 fibril_mutex_unlock(&vol_parts_lock); 448 449 return rc; 450 } 451 452 void vol_part_del_ref(vol_part_t *part) 453 { 454 if (atomic_predec(&part->refcnt) == 0) 455 vol_part_delete(part); 456 } 457 458 errno_t vol_part_eject_part(vol_part_t *part) 459 { 460 int rc; 461 462 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_part()"); 463 464 if (part->cur_mp == NULL) { 465 log_msg(LOG_DEFAULT, LVL_DEBUG, "Attempt to mount unmounted " 466 "partition."); 467 return EINVAL; 468 } 469 470 rc = vfs_unmount_path(part->cur_mp); 471 if (rc != EOK) { 472 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed unmounting partition " 473 "from %s", part->cur_mp); 474 return rc; 475 } 476 477 if (part->cur_mp_auto) { 478 rc = vfs_unlink_path(part->cur_mp); 479 if (rc != EOK) { 480 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed deleting " 481 "mount directory %s.", part->cur_mp); 482 } 483 } 484 485 free(part->cur_mp); 486 part->cur_mp = NULL; 487 part->cur_mp_auto = false; 488 489 return EOK; 321 490 } 322 491 … … 366 535 } 367 536 537 rc = vol_part_mount(part); 538 if (rc != EOK) { 539 fibril_mutex_unlock(&vol_parts_lock); 540 return rc; 541 } 542 368 543 fibril_mutex_unlock(&vol_parts_lock); 369 544 return EOK; … … 372 547 errno_t vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo) 373 548 { 549 memset(pinfo, 0, sizeof(*pinfo)); 550 374 551 pinfo->pcnt = part->pcnt; 375 552 pinfo->fstype = part->fstype; 376 553 str_cpy(pinfo->label, sizeof(pinfo->label), part->label); 554 if (part->cur_mp != NULL) 555 str_cpy(pinfo->cur_mp, sizeof(pinfo->cur_mp), part->cur_mp); 556 pinfo->cur_mp_auto = part->cur_mp_auto; 377 557 return EOK; 378 558 } -
uspace/srv/volsrv/part.h
r1e472ee rd3b2ffa 47 47 extern errno_t vol_part_add(service_id_t); 48 48 extern errno_t vol_part_get_ids(service_id_t *, size_t, size_t *); 49 extern errno_t vol_part_find_by_id(service_id_t, vol_part_t **); 49 extern errno_t vol_part_find_by_id_ref(service_id_t, vol_part_t **); 50 extern void vol_part_del_ref(vol_part_t *); 51 extern errno_t vol_part_eject_part(vol_part_t *); 50 52 extern errno_t vol_part_empty_part(vol_part_t *); 51 53 extern errno_t vol_part_mkfs_part(vol_part_t *, vol_fstype_t, const char *); -
uspace/srv/volsrv/types/part.h
r1e472ee rd3b2ffa 39 39 40 40 #include <adt/list.h> 41 #include <atomic.h> 42 #include <stdbool.h> 41 43 #include <types/label.h> 42 44 … … 45 47 /** Link to vol_parts */ 46 48 link_t lparts; 49 /** Reference count */ 50 atomic_t refcnt; 47 51 /** Service ID */ 48 52 service_id_t svc_id; … … 55 59 /** Volume label */ 56 60 char *label; 61 /** Where volume is currently mounted */ 62 char *cur_mp; 63 /** Mounted at automatic mount point */ 64 bool cur_mp_auto; 57 65 } vol_part_t; 58 66 -
uspace/srv/volsrv/volsrv.c
r1e472ee rd3b2ffa 144 144 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_info_srv(%zu)", 145 145 sid); 146 rc = vol_part_find_by_id (sid, &part);146 rc = vol_part_find_by_id_ref(sid, &part); 147 147 if (rc != EOK) { 148 148 async_answer_0(icall_handle, ENOENT); … … 153 153 if (rc != EOK) { 154 154 async_answer_0(icall_handle, EIO); 155 return;155 goto error; 156 156 } 157 157 … … 161 161 async_answer_0(chandle, EREFUSED); 162 162 async_answer_0(icall_handle, EREFUSED); 163 return;163 goto error; 164 164 } 165 165 … … 167 167 async_answer_0(chandle, EINVAL); 168 168 async_answer_0(icall_handle, EINVAL); 169 return;169 goto error; 170 170 } 171 171 … … 175 175 async_answer_0(chandle, rc); 176 176 async_answer_0(icall_handle, rc); 177 return; 178 } 179 180 async_answer_0(icall_handle, EOK); 177 goto error; 178 } 179 180 async_answer_0(icall_handle, EOK); 181 error: 182 vol_part_del_ref(part); 183 } 184 185 static void vol_part_eject_srv(cap_call_handle_t icall_handle, ipc_call_t *icall) 186 { 187 service_id_t sid; 188 vol_part_t *part; 189 errno_t rc; 190 191 sid = IPC_GET_ARG1(*icall); 192 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_srv(%zu)", sid); 193 194 rc = vol_part_find_by_id_ref(sid, &part); 195 if (rc != EOK) { 196 async_answer_0(icall_handle, ENOENT); 197 goto error; 198 } 199 200 rc = vol_part_eject_part(part); 201 if (rc != EOK) { 202 async_answer_0(icall_handle, EIO); 203 goto error; 204 } 205 206 async_answer_0(icall_handle, EOK); 207 error: 208 vol_part_del_ref(part); 181 209 } 182 210 … … 190 218 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_empty_srv(%zu)", sid); 191 219 192 rc = vol_part_find_by_id (sid, &part);220 rc = vol_part_find_by_id_ref(sid, &part); 193 221 if (rc != EOK) { 194 222 async_answer_0(icall_handle, ENOENT); … … 199 227 if (rc != EOK) { 200 228 async_answer_0(icall_handle, EIO); 201 return; 202 } 203 204 async_answer_0(icall_handle, EOK); 229 goto error; 230 } 231 232 async_answer_0(icall_handle, EOK); 233 error: 234 vol_part_del_ref(part); 205 235 } 206 236 … … 251 281 errno_t rc; 252 282 283 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_srv()"); 284 253 285 sid = IPC_GET_ARG1(*icall); 254 286 fstype = IPC_GET_ARG2(*icall); … … 261 293 } 262 294 263 printf("vol_part_mkfs_srv: label=%p\n", label); 264 if (label != NULL) 265 printf("vol_part_mkfs_srv: label='%s'\n", label); 266 267 rc = vol_part_find_by_id(sid, &part); 295 if (label != NULL) { 296 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_srv: label='%s'", 297 label); 298 } 299 300 rc = vol_part_find_by_id_ref(sid, &part); 268 301 if (rc != EOK) { 269 302 free(label); … … 276 309 free(label); 277 310 async_answer_0(icall_handle, rc); 311 vol_part_del_ref(part); 278 312 return; 279 313 } … … 311 345 vol_part_info_srv(chandle, &call); 312 346 break; 347 case VOL_PART_EJECT: 348 vol_part_eject_srv(chandle, &call); 349 break; 313 350 case VOL_PART_EMPTY: 314 351 vol_part_empty_srv(chandle, &call);
Note:
See TracChangeset
for help on using the changeset viewer.