ceph: refactor SETLAYOUT and SETDIRLAYOUT ioctl checks into common helper
Both of these methods perform similar checks; move that code to a helper so that we can ensure the checks are consistent. Reviewed-by: Alex Elder <elder@inktank.com> Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
3469ac1aa3
commit
e49bf4c51c
1 changed files with 38 additions and 44 deletions
|
@ -34,6 +34,36 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
|
||||||
return err;
|
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)
|
static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
||||||
{
|
{
|
||||||
struct inode *inode = file->f_dentry->d_inode;
|
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_ioctl_layout l;
|
||||||
struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
|
struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
|
||||||
struct ceph_ioctl_layout nl;
|
struct ceph_ioctl_layout nl;
|
||||||
int err, i;
|
int err;
|
||||||
|
|
||||||
if (copy_from_user(&l, arg, sizeof(l)))
|
if (copy_from_user(&l, arg, sizeof(l)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
/* preferred_osd is no longer supported */
|
|
||||||
if (l.preferred_osd != -1)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* validate changed params against current layout */
|
/* validate changed params against current layout */
|
||||||
err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
|
err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
|
@ -71,24 +97,9 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
|
||||||
if (l.data_pool)
|
if (l.data_pool)
|
||||||
nl.data_pool = l.data_pool;
|
nl.data_pool = l.data_pool;
|
||||||
|
|
||||||
if ((nl.object_size & ~PAGE_MASK) ||
|
err = __validate_layout(mdsc, &nl);
|
||||||
(nl.stripe_unit & ~PAGE_MASK) ||
|
if (err)
|
||||||
((unsigned)nl.object_size % (unsigned)nl.stripe_unit))
|
return err;
|
||||||
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,
|
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETLAYOUT,
|
||||||
USE_AUTH_MDS);
|
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 inode *inode = file->f_dentry->d_inode;
|
||||||
struct ceph_mds_request *req;
|
struct ceph_mds_request *req;
|
||||||
struct ceph_ioctl_layout l;
|
struct ceph_ioctl_layout l;
|
||||||
int err, i;
|
int err;
|
||||||
struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
|
struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
|
||||||
|
|
||||||
/* copy and validate */
|
/* copy and validate */
|
||||||
if (copy_from_user(&l, arg, sizeof(l)))
|
if (copy_from_user(&l, arg, sizeof(l)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if ((l.object_size & ~PAGE_MASK) ||
|
err = __validate_layout(mdsc, &l);
|
||||||
(l.stripe_unit & ~PAGE_MASK) ||
|
if (err)
|
||||||
!l.stripe_unit ||
|
return err;
|
||||||
(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,
|
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETDIRLAYOUT,
|
||||||
USE_AUTH_MDS);
|
USE_AUTH_MDS);
|
||||||
|
|
Loading…
Add table
Reference in a new issue