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
2626
2727 char dev[32];
2828 char mnt[32];
29+ char *partdev;
2930
3031 struct ext4_blockdev bdev;
3132 struct ext4_blockdev_iface bdif;
3233 struct ext4_sblock *sb;
34+ struct ext4_lock oslocks;
3335 Qid qid;
3436 Qid qidmask;
3537 Groups groups;
@@ -45,5 +47,6 @@ enum { · 9 unmodified lines
4547 Part *openpart(char *dev, Opts *opts);
4648 void closepart(Part *p);
4749 void closeallparts(void);
50+void statallparts(void);
4851
4952 char *errno2s(int err);
ext4srv.c+40−4
@@ -3,6 +3,7 @@ · 2 unmodified lines
33 #include <fcall.h>
44 #include <thread.h>
55 #include <9p.h>
6+#include <bio.h>
67 #include "group.h"
78 #include "common.h"
89
@@ -45,6 +46,7 @@ static Opts opts = { · 36 unmodified lines
4546 };
4647 static u8int zero[65536];
4748 static char Eperm[] = "permission denied";
49+static char *srvname;
4850
4951 static char *
5052 linkresolve(Aux *a, char *s, char **value)
@@ -854,10 +856,42 @@ note(void *, char *s) · 803 unmodified lines
854856 return 0;
855857 }
856858
859+static void
860+cmdsrv(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+
857890 static void
858891 rstart(Srv *)
859892 {
860893 threadnotify(note, 1);
894+ proccreate(cmdsrv, nil, mainstacksize);
861895 }
862896
863897 static void
@@ -906,11 +940,13 @@ linkmode(char *m) · 42 unmodified lines
906940 void
907941 threadmain(int argc, char **argv)
908942 {
909− char *srv, *gr;
943+ char *gr;
910944 vlong sz;
911945 int f;
912946
913− srv = "ext4";
947+ rfork(RFNOTEG);
948+
949+ srvname = "ext4";
914950 ARGBEGIN{
915951 case 'D':
916952 chatty9p++;
@@ -926,7 +962,7 @@ nomkfs: · 9 unmodified lines
926962 opts.linkmode = linkmode(EARGF(usage()));
927963 goto nomkfs;
928964 case 's':
929− srv = EARGF(usage());
965+ srvname = EARGF(usage());
930966 goto nomkfs;
931967 case 'g':
932968 gr = EARGF(usage());
@@ -991,7 +1027,7 @@ yesmkfs: · 58 unmodified lines
9911027 if(argc != 0)
9921028 usage();
9931029
994− threadpostmountsrv(&fs, srv, nil, 0);
1030+ threadpostmountsrv(&fs, srvname, nil, 0);
9951031 threadexits(nil);
9961032 }
9971033 }
part.c+69−27
@@ -89,30 +89,6 @@ bdclose(struct ext4_blockdev *bdev) · 88 unmodified lines
8989 return 0;
9090 }
9191
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−
11692 static int
11793 getblksz(char *dev, u32int *blksz)
11894 {
@@ -241,6 +217,10 @@ mountpart(Part *p, Opts *opts) · 122 unmodified lines
241217 werrstr("mount: %s", errno2s(r));
242218 goto error;
243219 }
220+ if((r = ext4_mount_setup_locks(p->mnt, &p->oslocks)) != 0){
221+ werrstr("locks: %s", errno2s(r));
222+ goto error;
223+ }
244224 if((r = ext4_recover(p->mnt)) != 0 && r != ENOTSUP){
245225 werrstr("recover: %s", errno2s(r));
246226 goto error;
@@ -273,6 +253,24 @@ error: · 26 unmodified lines
273253 return -1;
274254 }
275255
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+
276274 Part *
277275 openpart(char *dev, Opts *opts)
278276 {
@@ -298,7 +296,7 @@ openpart(char *dev, Opts *opts) · 19 unmodified lines
298296 /* see if it's already opened */
299297 for(p = sv.ps; p != nil && p->qid.path != d->qid.path; p = p->next);
300298 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)
302300 goto error;
303301
304302 p->f = f;
@@ -309,13 +307,17 @@ openpart(char *dev, Opts *opts) · 4 unmodified lines
309307 p->bdif.bread = bdread;
310308 p->bdif.bwrite = bdwrite;
311309 p->bdif.close = bdclose;
312− p->bdif.lock = bdlock;
313− p->bdif.unlock = bdunlock;
314310 p->bdif.ph_bsize = blksz;
315311 p->bdif.ph_bcnt = d->length/blksz;
316312 p->bdif.ph_bbuf = p->blkbuf;
313+ p->oslocks.lock = plock;
314+ p->oslocks.unlock = punlock;
315+ p->oslocks.p_user = p;
317316 p->bdif.p_user = p;
318317
318+ p->partdev = (char*)(p+1) + blksz;
319+ strcpy(p->partdev, dev);
320+
319321 if(opts->fstype > 1){
320322 memset(&fs, 0, sizeof(fs));
321323 memset(&info, 0, sizeof(info));
@@ -400,3 +402,43 @@ closeallparts(void) · 78 unmodified lines
400402 _closepart(sv.ps);
401403 qunlock(&sv);
402404 }
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+}

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