Skip to content

Commit

Permalink
zuf: Support for dynamic-debug of zusFSs
Browse files Browse the repository at this point in the history
 [THIS PATCH will be changed or dropped before final submission]

In zus we support dynamic-debug prints. ie user can
turn on and off the prints at run time by writing
to some special files.

The API is exactly the same as the Kernel's dynamic-prints
only the special file that we perform read/write on is:
	/sys/fs/zuf/ddbg

But otherwise it is identical to Kernel.

The Kernel code is a thin wrapper to dispatch to/from
the read/write of /sys/fs/zuf/ddbg file to the zus
server.
The heavy lifting is done by the zus project build system
and core code. See zus project how this is done

This facility is dispatched on the mount-thread and not
the regular ZTs. Because it is available globally before
any mounts.

Signed-off-by: Boaz Harrosh <[email protected]>
  • Loading branch information
Boaz17 committed Sep 25, 2019
1 parent 8459afe commit 7f35b92
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 0 deletions.
3 changes: 3 additions & 0 deletions fs/zuf/_extern.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ int zufc_release(struct inode *inode, struct file *file);
int zufc_mmap(struct file *file, struct vm_area_struct *vma);
const char *zuf_op_name(enum e_zufs_operation op);

int __zufc_dispatch_mount(struct zuf_root_info *zri,
enum e_mount_operation op,
struct zufs_ioc_mount *zim);
int zufc_dispatch_mount(struct zuf_root_info *zri, struct zus_fs_info *zus_zfi,
enum e_mount_operation operation,
struct zufs_ioc_mount *zim);
Expand Down
76 changes: 76 additions & 0 deletions fs/zuf/zuf-root.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,81 @@ static void _fs_type_free(struct zuf_fs_type *zft)
}
#endif /*CONFIG_LOCKDEP*/

#define DDBG_MAX_BUF_SIZE (8 * PAGE_SIZE)
/* We use ppos as a cookie for the dynamic debug ID we want to read from */
static ssize_t _zus_ddbg_read(struct file *file, char __user *buf, size_t len,
loff_t *ppos)
{
struct zufs_ioc_mount *zim;
size_t buf_size = (DDBG_MAX_BUF_SIZE <= len) ? DDBG_MAX_BUF_SIZE : len;
size_t zim_size = sizeof(zim->hdr) + sizeof(zim->zdi);
ssize_t err;

zim = vzalloc(zim_size + buf_size);
if (unlikely(!zim))
return -ENOMEM;

/* null terminate the 1st character in the buffer, hence the '+ 1' */
zim->hdr.in_len = zim_size + 1;
zim->hdr.out_len = zim_size + buf_size;
zim->zdi.len = buf_size;
zim->zdi.id = *ppos;
*ppos = 0;

err = __zufc_dispatch_mount(ZRI(file->f_inode->i_sb), ZUFS_M_DDBG_RD,
zim);
if (unlikely(err)) {
zuf_err("error dispatching contorl message => %ld\n", err);
goto out;
}

err = simple_read_from_buffer(buf, zim->zdi.len, ppos, zim->zdi.msg,
buf_size);
if (unlikely(err <= 0))
goto out;

*ppos = zim->zdi.id;
out:
vfree(zim);
return err;
}

static ssize_t _zus_ddbg_write(struct file *file, const char __user *buf,
size_t len, loff_t *ofst)
{
struct _ddbg_info {
struct zufs_ioc_mount zim;
char buf[512];
} ddi = {};
ssize_t err;

if (unlikely(512 < len)) {
zuf_err("ddbg control message to long\n");
return -EINVAL;
}

memset(&ddi, 0, sizeof(ddi));
if (copy_from_user(ddi.zim.zdi.msg, buf, len))
return -EFAULT;

ddi.zim.hdr.in_len = sizeof(ddi);
ddi.zim.hdr.out_len = sizeof(ddi.zim);
err = __zufc_dispatch_mount(ZRI(file->f_inode->i_sb), ZUFS_M_DDBG_WR,
&ddi.zim);
if (unlikely(err)) {
zuf_err("error dispatching contorl message => %ld\n", err);
return err;
}

return len;
}

static const struct file_operations _zus_ddbg_ops = {
.open = nonseekable_open,
.read = _zus_ddbg_read,
.write = _zus_ddbg_write,
.llseek = no_llseek,
};

static ssize_t _state_read(struct file *file, char __user *buf, size_t len,
loff_t *ppos)
Expand Down Expand Up @@ -338,6 +413,7 @@ static int zufr_fill_super(struct super_block *sb, void *data, int silent)
static struct tree_descr zufr_files[] = {
[2] = {"state", &_state_ops, S_IFREG | 0400},
[3] = {"registered_fs", &_registered_fs_ops, S_IFREG | 0400},
[4] = {"ddbg", &_zus_ddbg_ops, S_IFREG | 0600},
{""},
};
struct zuf_root_info *zri;
Expand Down

0 comments on commit 7f35b92

Please sign in to comment.