lkml.org 
[lkml]   [2008]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 17/19] ceph: ioctls
    Date
    A few Ceph ioctls for getting and setting file layout (striping)
    parameters.

    Signed-off-by: Sage Weil <sage@newdream.net>
    ---
    fs/ceph/ioctl.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
    fs/ceph/ioctl.h | 12 +++++++++
    2 files changed, 84 insertions(+), 0 deletions(-)
    create mode 100644 fs/ceph/ioctl.c
    create mode 100644 fs/ceph/ioctl.h

    diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c
    new file mode 100644
    index 0000000..ccbd0d6
    --- /dev/null
    +++ b/fs/ceph/ioctl.c
    @@ -0,0 +1,72 @@
    +#include "ioctl.h"
    +#include "super.h"
    +#include "ceph_debug.h"
    +
    +int ceph_debug_ioctl = -1;
    +#define DOUT_MASK DOUT_MASK_IOCTL
    +#define DOUT_VAR ceph_debug_ioctl
    +#define DOUT_PREFIX "ioctl: "
    +
    +
    +/*
    + * ioctls
    + */
    +
    +static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
    +{
    + struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
    + int err;
    +
    + err = ceph_do_getattr(file->f_dentry, CEPH_STAT_MASK_LAYOUT);
    + if (!err) {
    + if (copy_to_user(arg, &ci->i_layout, sizeof(ci->i_layout)))
    + return -EFAULT;
    + }
    +
    + return err;
    +}
    +
    +static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
    +{
    + struct inode *inode = file->f_dentry->d_inode;
    + struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
    + char *path;
    + int pathlen;
    + struct ceph_mds_request *req;
    + struct ceph_mds_request_head *reqh;
    + u64 pathbase;
    + struct ceph_file_layout layout;
    + int err;
    +
    + /* copy and validate */
    + if (copy_from_user(&layout, arg, sizeof(layout)))
    + return -EFAULT;
    +
    + /* set */
    + path = ceph_build_path(file->f_dentry, &pathlen, &pathbase, 0);
    + if (IS_ERR(path))
    + return PTR_ERR(path);
    + req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_LSETLAYOUT,
    + pathbase, path, 0, NULL,
    + file->f_dentry, USE_ANY_MDS);
    + kfree(path);
    + reqh = req->r_request->front.iov_base;
    + reqh->args.setlayout.layout = layout;
    + ceph_mdsc_lease_release(mdsc, inode, NULL, CEPH_LOCK_ICONTENT);
    + err = ceph_mdsc_do_request(mdsc, req);
    + ceph_mdsc_put_request(req);
    + return err;
    +}
    +
    +long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    +{
    + dout(10, "ioctl file %p cmd %u arg %lu\n", file, cmd, arg);
    + switch (cmd) {
    + case CEPH_IOC_GET_LAYOUT:
    + return ceph_ioctl_get_layout(file, (void __user *)arg);
    +
    + case CEPH_IOC_SET_LAYOUT:
    + return ceph_ioctl_set_layout(file, (void __user *)arg);
    + }
    + return -ENOTTY;
    +}
    diff --git a/fs/ceph/ioctl.h b/fs/ceph/ioctl.h
    new file mode 100644
    index 0000000..537c27b
    --- /dev/null
    +++ b/fs/ceph/ioctl.h
    @@ -0,0 +1,12 @@
    +#ifndef FS_CEPH_IOCTL_H
    +#define FS_CEPH_IOCTL_H
    +
    +#include <linux/ioctl.h>
    +#include "types.h"
    +
    +#define CEPH_IOCTL_MAGIC 0x97
    +
    +#define CEPH_IOC_GET_LAYOUT _IOR(CEPH_IOCTL_MAGIC, 1, struct ceph_file_layout)
    +#define CEPH_IOC_SET_LAYOUT _IOW(CEPH_IOCTL_MAGIC, 2, struct ceph_file_layout)
    +
    +#endif
    --
    1.5.6.5


    \
     
     \ /
      Last update: 2008-11-14 02:25    [W:0.023 / U:0.404 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site