| @@ -89,30 +89,6 @@ bdclose(struct ext4_blockdev *bdev) · 88 unmodified lines |
| 89 | 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 | 92 | static int |
| 117 | 93 | getblksz(char *dev, u32int *blksz) |
| 118 | 94 | { |
| @@ -241,6 +217,10 @@ mountpart(Part *p, Opts *opts) · 122 unmodified lines |
| 241 | 217 | werrstr("mount: %s", errno2s(r)); |
| 242 | 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 | 224 | if((r = ext4_recover(p->mnt)) != 0 && r != ENOTSUP){ |
| 245 | 225 | werrstr("recover: %s", errno2s(r)); |
| 246 | 226 | goto error; |
| @@ -273,6 +253,24 @@ error: · 26 unmodified lines |
| 273 | 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 | 274 | Part * |
| 277 | 275 | openpart(char *dev, Opts *opts) |
| 278 | 276 | { |
| @@ -298,7 +296,7 @@ openpart(char *dev, Opts *opts) · 19 unmodified lines |
| 298 | 296 | /* see if it's already opened */ |
| 299 | 297 | for(p = sv.ps; p != nil && p->qid.path != d->qid.path; p = p->next); |
| 300 | 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 | 300 | goto error; |
| 303 | 301 | |
| 304 | 302 | p->f = f; |
| @@ -309,13 +307,17 @@ openpart(char *dev, Opts *opts) · 4 unmodified lines |
| 309 | 307 | p->bdif.bread = bdread; |
| 310 | 308 | p->bdif.bwrite = bdwrite; |
| 311 | 309 | p->bdif.close = bdclose; |
| 312 | | − p->bdif.lock = bdlock; |
| 313 | | − p->bdif.unlock = bdunlock; |
| 314 | 310 | p->bdif.ph_bsize = blksz; |
| 315 | 311 | p->bdif.ph_bcnt = d->length/blksz; |
| 316 | 312 | p->bdif.ph_bbuf = p->blkbuf; |
| 313 | + p->oslocks.lock = plock; |
| 314 | + p->oslocks.unlock = punlock; |
| 315 | + p->oslocks.p_user = p; |
| 317 | 316 | p->bdif.p_user = p; |
| 318 | 317 | |
| 318 | + p->partdev = (char*)(p+1) + blksz; |
| 319 | + strcpy(p->partdev, dev); |
| 320 | + |
| 319 | 321 | if(opts->fstype > 1){ |
| 320 | 322 | memset(&fs, 0, sizeof(fs)); |
| 321 | 323 | memset(&info, 0, sizeof(info)); |
| @@ -400,3 +402,43 @@ closeallparts(void) · 78 unmodified lines |
| 400 | 402 | _closepart(sv.ps); |
| 401 | 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 | +} |