Commit 39e1be64 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever
Browse files

nfsd: allow state with no file to appear in /proc/fs/nfsd/clients/*/states



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: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 1ac3629b
Loading
Loading
Loading
Loading
+58 −60
Original line number Diff line number Diff line
@@ -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" : "-");

	spin_lock(&nf->fi_lock);
	file = find_any_file_locked(nf);
	if (file) {
		nfs4_show_superblock(s, file);
	seq_printf(s, ", ");
		seq_puts(s, ", ");
		nfs4_show_fname(s, file);
	seq_printf(s, ", ");
	nfs4_show_owner(s, oo);
	seq_printf(s, " }\n");
out:
		seq_puts(s, ", ");
	}
	spin_unlock(&nf->fi_lock);
	nfs4_show_owner(s, oo);
	seq_puts(s, " }\n");
	return 0;
}

@@ -2735,15 +2731,14 @@ 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, ");

	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
@@ -2753,12 +2748,12 @@ static int nfs4_show_lock(struct seq_file *s, struct nfs4_stid *st)

		nfs4_show_superblock(s, file);
		/* XXX: open stateid? */
	seq_printf(s, ", ");
		seq_puts(s, ", ");
		nfs4_show_fname(s, file);
	seq_printf(s, ", ");
		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, ",
	seq_printf(s, "access: %s",
		   ds->dl_type == NFS4_OPEN_DELEGATE_READ ? "r" : "w");

	/* XXX: lease time, whether it's being recalled. */

	spin_lock(&nf->fi_lock);
	file = nf->fi_deleg_file;
	if (file) {
		seq_puts(s, ", ");
		nfs4_show_superblock(s, file);
	seq_printf(s, ", ");
		seq_puts(s, ", ");
		nfs4_show_fname(s, file);
	seq_printf(s, " }\n");
out:
	}
	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? */

	if (file) {
		seq_puts(s, ", ");
		nfs4_show_superblock(s, file);
	seq_printf(s, ", ");
		seq_puts(s, ", ");
		nfs4_show_fname(s, file);
	seq_printf(s, " }\n");
	}
	seq_puts(s, " }\n");

	return 0;
}