nfsd: allow state with no file to appear in /proc/fs/nfsd/clients/*/states
authorNeilBrown <neilb@suse.de>
Tue, 30 Jan 2024 01:08:27 +0000 (12:08 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Fri, 1 Mar 2024 14:12:20 +0000 (09:12 -0500)
Change the "show" functions to show some content even if a file cannot
be found.  This is the case for admin-revoked state.
This is primarily useful for debugging - to ensure states are being
removed eventually.

So change several seq_printf() to seq_puts().  Some of these are needed
to keep checkpatch happy.  Others were done for consistency.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c

index 80b02b528f61d01221f4e7012880e1149321903b..41b2452824b60f8badaa320a5b174ad28670b730 100644 (file)
@@ -2554,9 +2554,9 @@ static struct nfs4_client *get_nfsdfs_clp(struct inode *inode)
 
 static void seq_quote_mem(struct seq_file *m, char *data, int len)
 {
-       seq_printf(m, "\"");
+       seq_puts(m, "\"");
        seq_escape_mem(m, data, len, ESCAPE_HEX | ESCAPE_NAP | ESCAPE_APPEND, "\"\\");
-       seq_printf(m, "\"");
+       seq_puts(m, "\"");
 }
 
 static const char *cb_state2str(int state)
@@ -2597,14 +2597,14 @@ static int client_info_show(struct seq_file *m, void *v)
                seq_puts(m, "status: unconfirmed\n");
        seq_printf(m, "seconds from last renew: %lld\n",
                ktime_get_boottime_seconds() - clp->cl_time);
-       seq_printf(m, "name: ");
+       seq_puts(m, "name: ");
        seq_quote_mem(m, clp->cl_name.data, clp->cl_name.len);
        seq_printf(m, "\nminor version: %d\n", clp->cl_minorversion);
        if (clp->cl_nii_domain.data) {
-               seq_printf(m, "Implementation domain: ");
+               seq_puts(m, "Implementation domain: ");
                seq_quote_mem(m, clp->cl_nii_domain.data,
                                        clp->cl_nii_domain.len);
-               seq_printf(m, "\nImplementation name: ");
+               seq_puts(m, "\nImplementation name: ");
                seq_quote_mem(m, clp->cl_nii_name.data, clp->cl_nii_name.len);
                seq_printf(m, "\nImplementation time: [%lld, %ld]\n",
                        clp->cl_nii_time.tv_sec, clp->cl_nii_time.tv_nsec);
@@ -2671,7 +2671,7 @@ static void nfs4_show_superblock(struct seq_file *s, struct nfsd_file *f)
 
 static void nfs4_show_owner(struct seq_file *s, struct nfs4_stateowner *oo)
 {
-       seq_printf(s, "owner: ");
+       seq_puts(s, "owner: ");
        seq_quote_mem(s, oo->so_owner.data, oo->so_owner.len);
 }
 
@@ -2689,20 +2689,13 @@ static int nfs4_show_open(struct seq_file *s, struct nfs4_stid *st)
        struct nfs4_stateowner *oo;
        unsigned int access, deny;
 
-       if (st->sc_type != SC_TYPE_OPEN && st->sc_type != SC_TYPE_LOCK)
-               return 0; /* XXX: or SEQ_SKIP? */
        ols = openlockstateid(st);
        oo = ols->st_stateowner;
        nf = st->sc_file;
 
-       spin_lock(&nf->fi_lock);
-       file = find_any_file_locked(nf);
-       if (!file)
-               goto out;
-
-       seq_printf(s, "- ");
+       seq_puts(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
-       seq_printf(s, ": { type: open, ");
+       seq_puts(s, ": { type: open, ");
 
        access = bmap_to_share_mode(ols->st_access_bmap);
        deny   = bmap_to_share_mode(ols->st_deny_bmap);
@@ -2714,14 +2707,17 @@ static int nfs4_show_open(struct seq_file *s, struct nfs4_stid *st)
                deny & NFS4_SHARE_ACCESS_READ ? "r" : "-",
                deny & NFS4_SHARE_ACCESS_WRITE ? "w" : "-");
 
-       nfs4_show_superblock(s, file);
-       seq_printf(s, ", ");
-       nfs4_show_fname(s, file);
-       seq_printf(s, ", ");
-       nfs4_show_owner(s, oo);
-       seq_printf(s, " }\n");
-out:
+       spin_lock(&nf->fi_lock);
+       file = find_any_file_locked(nf);
+       if (file) {
+               nfs4_show_superblock(s, file);
+               seq_puts(s, ", ");
+               nfs4_show_fname(s, file);
+               seq_puts(s, ", ");
+       }
        spin_unlock(&nf->fi_lock);
+       nfs4_show_owner(s, oo);
+       seq_puts(s, " }\n");
        return 0;
 }
 
@@ -2735,30 +2731,29 @@ static int nfs4_show_lock(struct seq_file *s, struct nfs4_stid *st)
        ols = openlockstateid(st);
        oo = ols->st_stateowner;
        nf = st->sc_file;
-       spin_lock(&nf->fi_lock);
-       file = find_any_file_locked(nf);
-       if (!file)
-               goto out;
 
-       seq_printf(s, "- ");
+       seq_puts(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
-       seq_printf(s, ": { type: lock, ");
+       seq_puts(s, ": { type: lock, ");
 
-       /*
-        * 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.)
-        */
+       spin_lock(&nf->fi_lock);
+       file = find_any_file_locked(nf);
+       if (file) {
+               /*
+                * 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_fname(s, file);
-       seq_printf(s, ", ");
+               nfs4_show_superblock(s, file);
+               /* XXX: open stateid? */
+               seq_puts(s, ", ");
+               nfs4_show_fname(s, file);
+               seq_puts(s, ", ");
+       }
        nfs4_show_owner(s, oo);
-       seq_printf(s, " }\n");
-out:
+       seq_puts(s, " }\n");
        spin_unlock(&nf->fi_lock);
        return 0;
 }
@@ -2771,25 +2766,25 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
 
        ds = delegstateid(st);
        nf = st->sc_file;
-       spin_lock(&nf->fi_lock);
-       file = nf->fi_deleg_file;
-       if (!file)
-               goto out;
 
-       seq_printf(s, "- ");
+       seq_puts(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
-       seq_printf(s, ": { type: deleg, ");
+       seq_puts(s, ": { type: deleg, ");
 
-       seq_printf(s, "access: %s",
-               ds->dl_type == NFS4_OPEN_DELEGATE_READ ? "r" : "w");
+       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, ", ");
-       nfs4_show_fname(s, file);
-       seq_printf(s, " }\n");
-out:
+       spin_lock(&nf->fi_lock);
+       file = nf->fi_deleg_file;
+       if (file) {
+               seq_puts(s, ", ");
+               nfs4_show_superblock(s, file);
+               seq_puts(s, ", ");
+               nfs4_show_fname(s, file);
+       }
+       seq_puts(s, " }\n");
        spin_unlock(&nf->fi_lock);
        return 0;
 }
@@ -2802,16 +2797,19 @@ static int nfs4_show_layout(struct seq_file *s, struct nfs4_stid *st)
        ls = container_of(st, struct nfs4_layout_stateid, ls_stid);
        file = ls->ls_file;
 
-       seq_printf(s, "- ");
+       seq_puts(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
-       seq_printf(s, ": { type: layout, ");
+       seq_puts(s, ": { type: layout");
 
        /* XXX: What else would be useful? */
 
-       nfs4_show_superblock(s, file);
-       seq_printf(s, ", ");
-       nfs4_show_fname(s, file);
-       seq_printf(s, " }\n");
+       if (file) {
+               seq_puts(s, ", ");
+               nfs4_show_superblock(s, file);
+               seq_puts(s, ", ");
+               nfs4_show_fname(s, file);
+       }
+       seq_puts(s, " }\n");
 
        return 0;
 }