nfsd: show lock and deleg stateids
authorJ. Bruce Fields <bfields@redhat.com>
Fri, 10 May 2019 19:27:50 +0000 (15:27 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Jul 2019 21:52:50 +0000 (17:52 -0400)
These entries are pretty minimal for now.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index c41b4aa7c8bd4fbfd3f2fef6d21d22c4d2518950..e457bb099d0b7c38d4bf89014e40cbab53944a80 100644 (file)
@@ -2338,12 +2338,66 @@ static int nfs4_show_open(struct seq_file *s, struct nfs4_stid *st)
        seq_printf(s, ", ");
        nfs4_show_owner(s, oo);
        seq_printf(s, " }\n");
+       fput(file);
+
+       return 0;
+}
+
+static int nfs4_show_lock(struct seq_file *s, struct nfs4_stid *st)
+{
+       struct nfs4_ol_stateid *ols;
+       struct nfs4_file *nf;
+       struct file *file;
+       struct nfs4_stateowner *oo;
 
+       ols = openlockstateid(st);
+       oo = ols->st_stateowner;
+       nf = st->sc_file;
+       file = find_any_file(nf);
+
+       seq_printf(s, "- 0x%16phN: { type: lock, ", &st->sc_stateid);
+
+       /*
+        * Note: a lock stateid isn't really the same thing as a lock,
+        * it's the locking state held by one owner on a file, and there
+        * may be multiple (or no) lock ranges associated with it.
+        * (Same for the matter is true of open stateids.)
+        */
+
+       nfs4_show_superblock(s, file);
+       /* XXX: open stateid? */
+       seq_printf(s, ", ");
+       nfs4_show_owner(s, oo);
+       seq_printf(s, " }\n");
        fput(file);
 
        return 0;
 }
 
+static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
+{
+       struct nfs4_delegation *ds;
+       struct nfs4_file *nf;
+       struct file *file;
+
+       ds = delegstateid(st);
+       nf = st->sc_file;
+       file = nf->fi_deleg_file;
+
+       seq_printf(s, "- 0x%16phN: { type: deleg, ", &st->sc_stateid);
+
+       /* Kinda dead code as long as we only support read delegs: */
+       seq_printf(s, "access: %s, ",
+               ds->dl_type == NFS4_OPEN_DELEGATE_READ ? "r" : "w");
+
+       /* XXX: lease time, whether it's being recalled. */
+
+       nfs4_show_superblock(s, file);
+       seq_printf(s, " }\n");
+
+       return 0;
+}
+
 static int states_show(struct seq_file *s, void *v)
 {
        struct nfs4_stid *st = v;
@@ -2351,9 +2405,14 @@ static int states_show(struct seq_file *s, void *v)
        switch (st->sc_type) {
        case NFS4_OPEN_STID:
                return nfs4_show_open(s, st);
+       case NFS4_LOCK_STID:
+               return nfs4_show_lock(s, st);
+       case NFS4_DELEG_STID:
+               return nfs4_show_deleg(s, st);
        default:
                return 0; /* XXX: or SEQ_SKIP? */
        }
+       /* XXX: copy stateids? */
 }
 
 static struct seq_operations states_seq_ops = {