| @@ -89,30 +89,6 @@ bdclose(struct ext4_blockdev *bdev) · 88 unmodified lines |
| 89 | return 0; | 89 | return 0; |
| 90 | } | 90 | } |
| 91 | | 91 | |
| 92 | static int | | |
| 93 | bdlock(struct ext4_blockdev *bdev) | | |
| 94 | { | | |
| 95 | Part *p; | | |
| 96 | | | |
| 97 | p = BDEV2PART(bdev); | | |
| 98 | TRACE("bdlock %p\n", p); | | |
| 99 | qlock(p); | | |
| 100 | | | |
| 101 | return 0; | | |
| 102 | } | | |
| 103 | | | |
| 104 | static int | | |
| 105 | bdunlock(struct ext4_blockdev *bdev) | | |
| 106 | { | | |
| 107 | Part *p; | | |
| 108 | | | |
| 109 | p = BDEV2PART(bdev); | | |
| 110 | TRACE("bdunlock %p\n", p); | | |
| 111 | qunlock(p); | | |
| 112 | | | |
| 113 | return 0; | | |
| 114 | } | | |
| 115 | | | |
| 116 | static int | 92 | static int |
| 117 | getblksz(char *dev, u32int *blksz) | 93 | getblksz(char *dev, u32int *blksz) |
| 118 | { | 94 | { |
| @@ -241,6 +217,10 @@ mountpart(Part *p, Opts *opts) · 122 unmodified lines |
| 241 | werrstr("mount: %s", errno2s(r)); | 217 | werrstr("mount: %s", errno2s(r)); |
| 242 | goto error; | 218 | goto error; |
| 243 | } | 219 | } |
| | 220 | if((r = ext4_mount_setup_locks(p->mnt, &p->oslocks)) != 0){ |
| | 221 | werrstr("locks: %s", errno2s(r)); |
| | 222 | goto error; |
| | 223 | } |
| 244 | if((r = ext4_recover(p->mnt)) != 0 && r != ENOTSUP){ | 224 | if((r = ext4_recover(p->mnt)) != 0 && r != ENOTSUP){ |
| 245 | werrstr("recover: %s", errno2s(r)); | 225 | werrstr("recover: %s", errno2s(r)); |
| 246 | goto error; | 226 | goto error; |
| @@ -273,6 +253,24 @@ error: · 26 unmodified lines |
| 273 | return -1; | 253 | return -1; |
| 274 | } | 254 | } |
| 275 | | 255 | |
| | 256 | static void |
| | 257 | plock(void *aux) |
| | 258 | { |
| | 259 | Part *p; |
| | 260 | |
| | 261 | p = aux; |
| | 262 | qlock(p); |
| | 263 | } |
| | 264 | |
| | 265 | static void |
| | 266 | punlock(void *aux) |
| | 267 | { |
| | 268 | Part *p; |
| | 269 | |
| | 270 | p = aux; |
| | 271 | qunlock(p); |
| | 272 | } |
| | 273 | |
| 276 | Part * | 274 | Part * |
| 277 | openpart(char *dev, Opts *opts) | 275 | openpart(char *dev, Opts *opts) |
| 278 | { | 276 | { |
| @@ -298,7 +296,7 @@ openpart(char *dev, Opts *opts) · 19 unmodified lines |
| 298 | /* see if it's already opened */ | 296 | /* see if it's already opened */ |
| 299 | for(p = sv.ps; p != nil && p->qid.path != d->qid.path; p = p->next); | 297 | for(p = sv.ps; p != nil && p->qid.path != d->qid.path; p = p->next); |
| 300 | if(p == nil){ /* no? then make one */ | 298 | if(p == nil){ /* no? then make one */ |
| 301 | if(getblksz(dev, &blksz) != 0 || (p = calloc(1, sizeof(*p)+blksz)) == nil) | 299 | if(getblksz(dev, &blksz) != 0 || (p = calloc(1, sizeof(*p)+blksz+strlen(dev)+1)) == nil) |
| 302 | goto error; | 300 | goto error; |
| 303 | | 301 | |
| 304 | p->f = f; | 302 | p->f = f; |
| @@ -309,13 +307,17 @@ openpart(char *dev, Opts *opts) · 4 unmodified lines |
| 309 | p->bdif.bread = bdread; | 307 | p->bdif.bread = bdread; |
| 310 | p->bdif.bwrite = bdwrite; | 308 | p->bdif.bwrite = bdwrite; |
| 311 | p->bdif.close = bdclose; | 309 | p->bdif.close = bdclose; |
| 312 | p->bdif.lock = bdlock; | | |
| 313 | p->bdif.unlock = bdunlock; | | |
| 314 | p->bdif.ph_bsize = blksz; | 310 | p->bdif.ph_bsize = blksz; |
| 315 | p->bdif.ph_bcnt = d->length/blksz; | 311 | p->bdif.ph_bcnt = d->length/blksz; |
| 316 | p->bdif.ph_bbuf = p->blkbuf; | 312 | p->bdif.ph_bbuf = p->blkbuf; |
| | 313 | p->oslocks.lock = plock; |
| | 314 | p->oslocks.unlock = punlock; |
| | 315 | p->oslocks.p_user = p; |
| 317 | p->bdif.p_user = p; | 316 | p->bdif.p_user = p; |
| 318 | | 317 | |
| | 318 | p->partdev = (char*)(p+1) + blksz; |
| | 319 | strcpy(p->partdev, dev); |
| | 320 | |
| 319 | if(opts->fstype > 1){ | 321 | if(opts->fstype > 1){ |
| 320 | memset(&fs, 0, sizeof(fs)); | 322 | memset(&fs, 0, sizeof(fs)); |
| 321 | memset(&info, 0, sizeof(info)); | 323 | memset(&info, 0, sizeof(info)); |
| @@ -400,3 +402,43 @@ closeallparts(void) · 78 unmodified lines |
| 400 | _closepart(sv.ps); | 402 | _closepart(sv.ps); |
| 401 | qunlock(&sv); | 403 | qunlock(&sv); |
| 402 | } | 404 | } |
| | 405 | |
| | 406 | void |
| | 407 | statallparts(void) |
| | 408 | { |
| | 409 | struct ext4_mount_stats s; |
| | 410 | uvlong div; |
| | 411 | Part *p; |
| | 412 | int r; |
| | 413 | |
| | 414 | qlock(&sv); |
| | 415 | for(p = sv.ps; p != nil; p = p->next){ |
| | 416 | if((r = ext4_mount_point_stats(p->mnt, &s)) != 0){ |
| | 417 | print("error: %s: %s\n", p->partdev, errno2s(r)); |
| | 418 | }else{ |
| | 419 | print( |
| | 420 | "%s (inodes) free %ud, used %ud, total %ud\n", |
| | 421 | p->partdev, |
| | 422 | s.free_inodes_count, |
| | 423 | s.inodes_count-s.free_inodes_count, |
| | 424 | s.inodes_count |
| | 425 | ); |
| | 426 | print( |
| | 427 | "%s (blocks) free %llud, used %llud, total %llud, each %ud\n", |
| | 428 | p->partdev, |
| | 429 | s.free_blocks_count, |
| | 430 | s.blocks_count-s.free_blocks_count, |
| | 431 | s.blocks_count, s.block_size |
| | 432 | ); |
| | 433 | div = 1024/(s.block_size/1024); |
| | 434 | print( |
| | 435 | "%s (MB) free %llud, used %llud, total %llud\n", |
| | 436 | p->partdev, |
| | 437 | s.free_blocks_count/div, |
| | 438 | (s.blocks_count-s.free_blocks_count)/div, |
| | 439 | s.blocks_count/div |
| | 440 | ); |
| | 441 | } |
| | 442 | } |
| | 443 | qunlock(&sv); |
| | 444 | } |