|
@@ -34,6 +34,36 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static long __validate_layout(struct ceph_mds_client *mdsc,
|
|
|
+ struct ceph_ioctl_layout *l)
|
|
|
+{
|
|
|
+ int i, err;
|
|
|
+
|
|
|
+ /* preferred_osd is no longer supported */
|
|
|
+ if (l->preferred_osd != -1)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* validate striping parameters */
|
|
|
+ if ((l->object_size & ~PAGE_MASK) ||
|
|
|
+ (l->stripe_unit & ~PAGE_MASK) ||
|
|
|
+ ((unsigned)l->object_size % (unsigned)l->stripe_unit))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* make sure it's a valid data pool */
|
|
|
+ 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;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
|
|
{
|
|
|
struct inode *inode = file->f_dentry->d_inode;
|
|
@@ -43,15 +73,11 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
|
|
struct ceph_ioctl_layout l;
|
|
|
struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
|
|
|
struct ceph_ioctl_layout nl;
|
|
|
- int err, i;
|
|
|
+ int err;
|
|
|
|
|
|
if (copy_from_user(&l, arg, sizeof(l)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
- /* preferred_osd is no longer supported */
|
|
|
- if (l.preferred_osd != -1)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
/* validate changed params against current layout */
|
|
|
err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
|
|
|
if (!err) {
|
|
@@ -71,24 +97,9 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
|
|
if (l.data_pool)
|
|
|
nl.data_pool = l.data_pool;
|
|
|
|
|
|
- if ((nl.object_size & ~PAGE_MASK) ||
|
|
|
- (nl.stripe_unit & ~PAGE_MASK) ||
|
|
|
- ((unsigned)nl.object_size % (unsigned)nl.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;
|
|
|
- }
|
|
|
+ err = __validate_layout(mdsc, &nl);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETLAYOUT,
|
|
|
USE_AUTH_MDS);
|
|
@@ -124,33 +135,16 @@ 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;
|
|
|
+ int err;
|
|
|
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;
|
|
|
- }
|
|
|
+ err = __validate_layout(mdsc, &l);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETDIRLAYOUT,
|
|
|
USE_AUTH_MDS);
|