All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sage Weil <sage@newdream.net>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Sage Weil <sage@newdream.net>
Subject: [PATCH 18/20] ceph: ioctls
Date: Tue,  8 Sep 2009 15:56:39 -0700	[thread overview]
Message-ID: <1252450601-17610-19-git-send-email-sage@newdream.net> (raw)
In-Reply-To: <1252450601-17610-18-git-send-email-sage@newdream.net>

A few Ceph ioctls for getting and setting file layout (striping)
parameters.

Signed-off-by: Sage Weil <sage@newdream.net>
---
 fs/ceph/ioctl.c |   98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/ceph/ioctl.h |   20 +++++++++++
 2 files changed, 118 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..bf5a9d9
--- /dev/null
+++ b/fs/ceph/ioctl.c
@@ -0,0 +1,98 @@
+#include "ioctl.h"
+#include "super.h"
+#include "ceph_debug.h"
+
+
+/*
+ * ioctls
+ */
+
+/*
+ * get and set the file layout
+ */
+static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
+{
+	struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
+	struct ceph_ioctl_layout l;
+	int err;
+
+	err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
+	if (!err) {
+		l.stripe_unit = ceph_file_layout_su(ci->i_layout);
+		l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout);
+		l.object_size = ceph_file_layout_object_size(ci->i_layout);
+		l.data_pool = le32_to_cpu(ci->i_layout.fl_pg_pool);
+		if (copy_to_user(arg, &l, sizeof(l)))
+			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 inode *parent_inode = file->f_dentry->d_parent->d_inode;
+	struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc;
+	struct ceph_mds_request *req;
+	struct ceph_ioctl_layout l;
+	int err, i;
+
+	/* copy and validate */
+	if (copy_from_user(&l, arg, sizeof(l)))
+		return -EFAULT;
+
+	if ((l.object_size & ~PAGE_MASK) ||
+	    (l.stripe_unit & ~PAGE_MASK) ||
+	    !l.stripe_unit ||
+	    (l.object_size &&
+	     (unsigned)l.object_size % (unsigned)l.stripe_unit)) 
+		return -EINVAL;
+
+	/* make sure it's a valid data pool */
+	if (l.data_pool > 0) {
+		mutex_lock(&mdsc->mutex);
+		err = -EINVAL;
+		for (i = 0; i < mdsc->mdsmap->m_num_data_pg_pools; i++)
+			if (mdsc->mdsmap->m_data_pg_pools[i] == l.data_pool) {
+				err = 0;
+				break;
+			}
+		mutex_unlock(&mdsc->mutex);
+		if (err)
+			return err;
+	}
+
+	req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETLAYOUT,
+				       USE_AUTH_MDS);
+	if (IS_ERR(req))
+		return PTR_ERR(req);
+	req->r_inode = igrab(inode);
+	req->r_inode_drop = CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL;
+
+	req->r_args.setlayout.layout.fl_stripe_unit =
+		cpu_to_le32(l.stripe_unit);
+	req->r_args.setlayout.layout.fl_stripe_count =
+		cpu_to_le32(l.stripe_count);
+	req->r_args.setlayout.layout.fl_object_size =
+		cpu_to_le32(l.object_size);
+	req->r_args.setlayout.layout.fl_pg_pool = cpu_to_le32(l.data_pool);
+	req->r_args.setlayout.layout.fl_pg_preferred = cpu_to_le32((s32)-1);
+
+	err = ceph_mdsc_do_request(mdsc, parent_inode, req);
+	ceph_mdsc_put_request(req);
+	return err;
+}
+
+long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+	dout("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..56f5e2c
--- /dev/null
+++ b/fs/ceph/ioctl.h
@@ -0,0 +1,20 @@
+#ifndef FS_CEPH_IOCTL_H
+#define FS_CEPH_IOCTL_H
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+#define CEPH_IOCTL_MAGIC 0x97
+
+/* just use u64 to align sanely on all archs */
+struct ceph_ioctl_layout {
+	__u64 stripe_unit, stripe_count, object_size;
+	__u64 data_pool;
+};
+
+#define CEPH_IOC_GET_LAYOUT _IOR(CEPH_IOCTL_MAGIC, 1,		\
+				   struct ceph_ioctl_layout)
+#define CEPH_IOC_SET_LAYOUT _IOW(CEPH_IOCTL_MAGIC, 2,		\
+				   struct ceph_ioctl_layout)
+
+#endif
-- 
1.5.6.5


  reply	other threads:[~2009-09-08 22:58 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-08 22:56 [PATCH 00/20] ceph distributed file system client Sage Weil
2009-09-08 22:56 ` [PATCH 01/20] ceph: documentation Sage Weil
2009-09-08 22:56   ` [PATCH 02/20] ceph: on-wire types Sage Weil
2009-09-08 22:56     ` [PATCH 03/20] ceph: client types Sage Weil
2009-09-08 22:56       ` [PATCH 04/20] ceph: ref counted buffer Sage Weil
2009-09-08 22:56         ` [PATCH 05/20] ceph: super.c Sage Weil
2009-09-08 22:56           ` [PATCH 06/20] ceph: inode operations Sage Weil
2009-09-08 22:56             ` [PATCH 07/20] ceph: directory operations Sage Weil
2009-09-08 22:56               ` [PATCH 08/20] ceph: file operations Sage Weil
2009-09-08 22:56                 ` [PATCH 09/20] ceph: address space operations Sage Weil
2009-09-08 22:56                   ` [PATCH 10/20] ceph: MDS client Sage Weil
2009-09-08 22:56                     ` [PATCH 11/20] ceph: OSD client Sage Weil
2009-09-08 22:56                       ` [PATCH 12/20] ceph: CRUSH mapping algorithm Sage Weil
2009-09-08 22:56                         ` [PATCH 13/20] ceph: monitor client Sage Weil
2009-09-08 22:56                           ` [PATCH 14/20] ceph: capability management Sage Weil
2009-09-08 22:56                             ` [PATCH 15/20] ceph: snapshot management Sage Weil
2009-09-08 22:56                               ` [PATCH 16/20] ceph: messenger library Sage Weil
2009-09-08 22:56                                 ` [PATCH 17/20] ceph: nfs re-export support Sage Weil
2009-09-08 22:56                                   ` Sage Weil [this message]
2009-09-08 22:56                                     ` [PATCH 19/20] ceph: debugfs Sage Weil
2009-09-08 22:56                                       ` [PATCH 20/20] ceph: Kconfig, Makefile Sage Weil
2009-09-08 23:05                                     ` [PATCH 18/20] ceph: ioctls Randy Dunlap
2009-09-08 23:45                                       ` Sage Weil
2009-09-08 23:10 ` [PATCH 00/20] ceph distributed file system client Daniel Walker
2009-09-08 23:47   ` Sage Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1252450601-17610-19-git-send-email-sage@newdream.net \
    --to=sage@newdream.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.