History

SRVNAME.cmd, stats command and proper partition locking

Sigrid Solveig Haflínudóttir committed 6 years ago

Commit 3618c201 parent 28414e13 files · +112 −31Browse files

Unified · Split

3 files
  1. common.h +3 −0
  2. ext4srv.c +40 −4
  3. part.c +69 −27
common.h+3−0
@@ -26,10 +26,12 @@ struct Part { · 25 unmodified lines
26 26
27 char dev[32];27 char dev[32];
28 char mnt[32];28 char mnt[32];
29 char *partdev;
29 30
30 struct ext4_blockdev bdev;31 struct ext4_blockdev bdev;
31 struct ext4_blockdev_iface bdif;32 struct ext4_blockdev_iface bdif;
32 struct ext4_sblock *sb;33 struct ext4_sblock *sb;
34 struct ext4_lock oslocks;
33 Qid qid;35 Qid qid;
34 Qid qidmask;36 Qid qidmask;
35 Groups groups;37 Groups groups;
@@ -45,5 +47,6 @@ enum { · 9 unmodified lines
45Part *openpart(char *dev, Opts *opts);47Part *openpart(char *dev, Opts *opts);
46void closepart(Part *p);48void closepart(Part *p);
47void closeallparts(void);49void closeallparts(void);
50void statallparts(void);
48 51
49char *errno2s(int err);52char *errno2s(int err);
ext4srv.c+40−4
@@ -3,6 +3,7 @@ · 2 unmodified lines
3#include <fcall.h>3#include <fcall.h>
4#include <thread.h>4#include <thread.h>
5#include <9p.h>5#include <9p.h>
6#include <bio.h>
6#include "group.h"7#include "group.h"
7#include "common.h"8#include "common.h"
8 9
@@ -45,6 +46,7 @@ static Opts opts = { · 36 unmodified lines
45};46};
46static u8int zero[65536];47static u8int zero[65536];
47static char Eperm[] = "permission denied";48static char Eperm[] = "permission denied";
49static char *srvname;
48 50
49static char *51static char *
50linkresolve(Aux *a, char *s, char **value)52linkresolve(Aux *a, char *s, char **value)
@@ -854,10 +856,42 @@ note(void *, char *s) · 803 unmodified lines
854 return 0;856 return 0;
855}857}
856 858
859static void
860cmdsrv(void *)
861{
862 char s[32], *c, *a[16];
863 int f, p[2], n;
864 Biobuf b;
865
866 if(pipe(p) < 0)
867 sysfatal("%r");
868 snprint(s, sizeof(s), "#s/%s.cmd", srvname);
869 if((f = create(s, ORCLOSE|OWRITE, 0660)) < 0){
870 remove(s);
871 if((f = create(s, ORCLOSE|OWRITE, 0660)) < 0)
872 sysfatal("%r");
873 }
874 if(fprint(f, "%d", p[0]) < 1)
875 sysfatal("srv write");
876
877 dup(p[1], 0);
878 close(p[1]);
879 close(p[0]);
880
881 Binit(&b, 0, OREAD);
882 for(; (c = Brdstr(&b, '\n', 1)) != nil; free(c)){
883 if((n = tokenize(c, a, nelem(a))) < 1)
884 continue;
885 if(strcmp(a[0], "stats") == 0)
886 statallparts();
887 }
888}
889
857static void890static void
858rstart(Srv *)891rstart(Srv *)
859{892{
860 threadnotify(note, 1);893 threadnotify(note, 1);
894 proccreate(cmdsrv, nil, mainstacksize);
861}895}
862 896
863static void897static void
@@ -906,11 +940,13 @@ linkmode(char *m) · 42 unmodified lines
906void940void
907threadmain(int argc, char **argv)941threadmain(int argc, char **argv)
908{942{
909 char *srv, *gr;943 char *gr;
910 vlong sz;944 vlong sz;
911 int f;945 int f;
912 946
913 srv = "ext4";947 rfork(RFNOTEG);
948
949 srvname = "ext4";
914 ARGBEGIN{950 ARGBEGIN{
915 case 'D':951 case 'D':
916 chatty9p++;952 chatty9p++;
@@ -926,7 +962,7 @@ nomkfs: · 9 unmodified lines
926 opts.linkmode = linkmode(EARGF(usage()));962 opts.linkmode = linkmode(EARGF(usage()));
927 goto nomkfs;963 goto nomkfs;
928 case 's':964 case 's':
929 srv = EARGF(usage());965 srvname = EARGF(usage());
930 goto nomkfs;966 goto nomkfs;
931 case 'g':967 case 'g':
932 gr = EARGF(usage());968 gr = EARGF(usage());
@@ -991,7 +1027,7 @@ yesmkfs: · 58 unmodified lines
991 if(argc != 0)1027 if(argc != 0)
992 usage();1028 usage();
993 1029
994 threadpostmountsrv(&fs, srv, nil, 0);1030 threadpostmountsrv(&fs, srvname, nil, 0);
995 threadexits(nil);1031 threadexits(nil);
996 }1032 }
997}1033}
part.c+69−27
@@ -89,30 +89,6 @@ bdclose(struct ext4_blockdev *bdev) · 88 unmodified lines
89 return 0;89 return 0;
90}90}
91 91
92static int
93bdlock(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
104static int
105bdunlock(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
116static int92static int
117getblksz(char *dev, u32int *blksz)93getblksz(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
256static void
257plock(void *aux)
258{
259 Part *p;
260
261 p = aux;
262 qlock(p);
263}
264
265static void
266punlock(void *aux)
267{
268 Part *p;
269
270 p = aux;
271 qunlock(p);
272}
273
276Part *274Part *
277openpart(char *dev, Opts *opts)275openpart(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
406void
407statallparts(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}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t