ceph: add CEPH_MDS_OP_SETDIRLAYOUT and associated ioctl.
Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
Родитель
010e3b48fc
Коммит
571dba52a3
|
@ -91,6 +91,68 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set a layout policy on a directory inode. All items in the tree
|
||||||
|
* rooted at this inode will inherit this layout on creation,
|
||||||
|
* (It doesn't apply retroactively )
|
||||||
|
* unless a subdirectory has its own layout policy.
|
||||||
|
*/
|
||||||
|
static long ceph_ioctl_set_layout_policy (struct file *file, void __user *arg)
|
||||||
|
{
|
||||||
|
struct inode *inode = file->f_dentry->d_inode;
|
||||||
|
struct ceph_mds_request *req;
|
||||||
|
struct ceph_ioctl_layout l;
|
||||||
|
int err, i;
|
||||||
|
struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
|
||||||
|
|
||||||
|
/* 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_SETDIRLAYOUT,
|
||||||
|
USE_AUTH_MDS);
|
||||||
|
|
||||||
|
if (IS_ERR(req))
|
||||||
|
return PTR_ERR(req);
|
||||||
|
req->r_inode = igrab(inode);
|
||||||
|
|
||||||
|
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(l.preferred_osd);
|
||||||
|
|
||||||
|
err = ceph_mdsc_do_request(mdsc, inode, req);
|
||||||
|
ceph_mdsc_put_request(req);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return object name, size/offset information, and location (OSD
|
* Return object name, size/offset information, and location (OSD
|
||||||
* number, network address) for a given file offset.
|
* number, network address) for a given file offset.
|
||||||
|
@ -177,11 +239,15 @@ long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
case CEPH_IOC_SET_LAYOUT:
|
case CEPH_IOC_SET_LAYOUT:
|
||||||
return ceph_ioctl_set_layout(file, (void __user *)arg);
|
return ceph_ioctl_set_layout(file, (void __user *)arg);
|
||||||
|
|
||||||
|
case CEPH_IOC_SET_LAYOUT_POLICY:
|
||||||
|
return ceph_ioctl_set_layout_policy(file, (void __user *)arg);
|
||||||
|
|
||||||
case CEPH_IOC_GET_DATALOC:
|
case CEPH_IOC_GET_DATALOC:
|
||||||
return ceph_ioctl_get_dataloc(file, (void __user *)arg);
|
return ceph_ioctl_get_dataloc(file, (void __user *)arg);
|
||||||
|
|
||||||
case CEPH_IOC_LAZYIO:
|
case CEPH_IOC_LAZYIO:
|
||||||
return ceph_ioctl_lazyio(file);
|
return ceph_ioctl_lazyio(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#define CEPH_IOCTL_MAGIC 0x97
|
#define CEPH_IOCTL_MAGIC 0x98
|
||||||
|
|
||||||
/* just use u64 to align sanely on all archs */
|
/* just use u64 to align sanely on all archs */
|
||||||
struct ceph_ioctl_layout {
|
struct ceph_ioctl_layout {
|
||||||
|
@ -17,6 +17,8 @@ struct ceph_ioctl_layout {
|
||||||
struct ceph_ioctl_layout)
|
struct ceph_ioctl_layout)
|
||||||
#define CEPH_IOC_SET_LAYOUT _IOW(CEPH_IOCTL_MAGIC, 2, \
|
#define CEPH_IOC_SET_LAYOUT _IOW(CEPH_IOCTL_MAGIC, 2, \
|
||||||
struct ceph_ioctl_layout)
|
struct ceph_ioctl_layout)
|
||||||
|
#define CEPH_IOC_SET_LAYOUT_POLICY _IOW(CEPH_IOCTL_MAGIC, 5, \
|
||||||
|
struct ceph_ioctl_layout)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract identity, address of the OSD and object storing a given
|
* Extract identity, address of the OSD and object storing a given
|
||||||
|
|
|
@ -299,6 +299,7 @@ enum {
|
||||||
CEPH_MDS_OP_SETATTR = 0x01108,
|
CEPH_MDS_OP_SETATTR = 0x01108,
|
||||||
CEPH_MDS_OP_SETFILELOCK= 0x01109,
|
CEPH_MDS_OP_SETFILELOCK= 0x01109,
|
||||||
CEPH_MDS_OP_GETFILELOCK= 0x00110,
|
CEPH_MDS_OP_GETFILELOCK= 0x00110,
|
||||||
|
CEPH_MDS_OP_SETDIRLAYOUT=0x0110a,
|
||||||
|
|
||||||
CEPH_MDS_OP_MKNOD = 0x01201,
|
CEPH_MDS_OP_MKNOD = 0x01201,
|
||||||
CEPH_MDS_OP_LINK = 0x01202,
|
CEPH_MDS_OP_LINK = 0x01202,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче