Commit aca645a6 authored by Eric W. Biederman's avatar Eric W. Biederman

userns: Modify dqget to take struct kqid

Modify dqget to take struct kqid instead of a type and an identifier
pair.

Modify the callers of dqget in ocfs2 and dquot to take generate
a struct kqid so they can continue to call dqget.  The conversion
to create struct kqid should all be the final conversions that
are needed in those code paths.

Cc: Jan Kara <jack@suse.cz>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 431f1974
...@@ -1184,8 +1184,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -1184,8 +1184,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr)
if (attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid if (attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid
&& OCFS2_HAS_RO_COMPAT_FEATURE(sb, && OCFS2_HAS_RO_COMPAT_FEATURE(sb,
OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) { OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
transfer_to[USRQUOTA] = dqget(sb, attr->ia_uid, transfer_to[USRQUOTA] = dqget(sb, make_kqid_uid(attr->ia_uid));
USRQUOTA);
if (!transfer_to[USRQUOTA]) { if (!transfer_to[USRQUOTA]) {
status = -ESRCH; status = -ESRCH;
goto bail_unlock; goto bail_unlock;
...@@ -1194,8 +1193,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -1194,8 +1193,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr)
if (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid if (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid
&& OCFS2_HAS_RO_COMPAT_FEATURE(sb, && OCFS2_HAS_RO_COMPAT_FEATURE(sb,
OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) { OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
transfer_to[GRPQUOTA] = dqget(sb, attr->ia_gid, transfer_to[GRPQUOTA] = dqget(sb, make_kqid_gid(attr->ia_gid));
GRPQUOTA);
if (!transfer_to[GRPQUOTA]) { if (!transfer_to[GRPQUOTA]) {
status = -ESRCH; status = -ESRCH;
goto bail_unlock; goto bail_unlock;
......
...@@ -501,7 +501,9 @@ static int ocfs2_recover_local_quota_file(struct inode *lqinode, ...@@ -501,7 +501,9 @@ static int ocfs2_recover_local_quota_file(struct inode *lqinode,
} }
dqblk = (struct ocfs2_local_disk_dqblk *)(qbh->b_data + dqblk = (struct ocfs2_local_disk_dqblk *)(qbh->b_data +
ol_dqblk_block_off(sb, chunk, bit)); ol_dqblk_block_off(sb, chunk, bit));
dquot = dqget(sb, le64_to_cpu(dqblk->dqb_id), type); dquot = dqget(sb,
make_kqid(&init_user_ns, type,
le64_to_cpu(dqblk->dqb_id)));
if (!dquot) { if (!dquot) {
status = -EIO; status = -EIO;
mlog(ML_ERROR, "Failed to get quota structure " mlog(ML_ERROR, "Failed to get quota structure "
......
...@@ -829,8 +829,10 @@ static struct dquot *get_empty_dquot(struct super_block *sb, int type) ...@@ -829,8 +829,10 @@ static struct dquot *get_empty_dquot(struct super_block *sb, int type)
* a) checking for quota flags under dq_list_lock and * a) checking for quota flags under dq_list_lock and
* b) getting a reference to dquot before we release dq_list_lock * b) getting a reference to dquot before we release dq_list_lock
*/ */
struct dquot *dqget(struct super_block *sb, unsigned int id, int type) struct dquot *dqget(struct super_block *sb, struct kqid qid)
{ {
unsigned int type = qid.type;
unsigned int id = from_kqid(&init_user_ns, qid);
unsigned int hashent = hashfn(sb, id, type); unsigned int hashent = hashfn(sb, id, type);
struct dquot *dquot = NULL, *empty = NULL; struct dquot *dquot = NULL, *empty = NULL;
...@@ -1390,7 +1392,6 @@ static int dquot_active(const struct inode *inode) ...@@ -1390,7 +1392,6 @@ static int dquot_active(const struct inode *inode)
*/ */
static void __dquot_initialize(struct inode *inode, int type) static void __dquot_initialize(struct inode *inode, int type)
{ {
unsigned int id = 0;
int cnt; int cnt;
struct dquot *got[MAXQUOTAS]; struct dquot *got[MAXQUOTAS];
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
...@@ -1403,18 +1404,19 @@ static void __dquot_initialize(struct inode *inode, int type) ...@@ -1403,18 +1404,19 @@ static void __dquot_initialize(struct inode *inode, int type)
/* First get references to structures we might need. */ /* First get references to structures we might need. */
for (cnt = 0; cnt < MAXQUOTAS; cnt++) { for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
struct kqid qid;
got[cnt] = NULL; got[cnt] = NULL;
if (type != -1 && cnt != type) if (type != -1 && cnt != type)
continue; continue;
switch (cnt) { switch (cnt) {
case USRQUOTA: case USRQUOTA:
id = inode->i_uid; qid = make_kqid_uid(inode->i_uid);
break; break;
case GRPQUOTA: case GRPQUOTA:
id = inode->i_gid; qid = make_kqid_gid(inode->i_gid);
break; break;
} }
got[cnt] = dqget(sb, id, cnt); got[cnt] = dqget(sb, qid);
} }
down_write(&sb_dqopt(sb)->dqptr_sem); down_write(&sb_dqopt(sb)->dqptr_sem);
...@@ -1898,9 +1900,9 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) ...@@ -1898,9 +1900,9 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr)
return 0; return 0;
if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid)
transfer_to[USRQUOTA] = dqget(sb, iattr->ia_uid, USRQUOTA); transfer_to[USRQUOTA] = dqget(sb, make_kqid_uid(iattr->ia_uid));
if (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid) if (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)
transfer_to[GRPQUOTA] = dqget(sb, iattr->ia_gid, GRPQUOTA); transfer_to[GRPQUOTA] = dqget(sb, make_kqid_gid(iattr->ia_gid));
ret = __dquot_transfer(inode, transfer_to); ret = __dquot_transfer(inode, transfer_to);
dqput_all(transfer_to); dqput_all(transfer_to);
...@@ -2381,7 +2383,7 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid, ...@@ -2381,7 +2383,7 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid,
{ {
struct dquot *dquot; struct dquot *dquot;
dquot = dqget(sb, qid.type, from_kqid(&init_user_ns, qid)); dquot = dqget(sb, qid);
if (!dquot) if (!dquot)
return -ESRCH; return -ESRCH;
do_get_dqblk(dquot, di); do_get_dqblk(dquot, di);
...@@ -2494,7 +2496,7 @@ int dquot_set_dqblk(struct super_block *sb, struct kqid qid, ...@@ -2494,7 +2496,7 @@ int dquot_set_dqblk(struct super_block *sb, struct kqid qid,
struct dquot *dquot; struct dquot *dquot;
int rc; int rc;
dquot = dqget(sb, qid.type, from_kqid(&init_user_ns, qid)); dquot = dqget(sb, qid);
if (!dquot) { if (!dquot) {
rc = -ESRCH; rc = -ESRCH;
goto out; goto out;
......
...@@ -44,7 +44,7 @@ void inode_sub_rsv_space(struct inode *inode, qsize_t number); ...@@ -44,7 +44,7 @@ void inode_sub_rsv_space(struct inode *inode, qsize_t number);
void dquot_initialize(struct inode *inode); void dquot_initialize(struct inode *inode);
void dquot_drop(struct inode *inode); void dquot_drop(struct inode *inode);
struct dquot *dqget(struct super_block *sb, unsigned int id, int type); struct dquot *dqget(struct super_block *sb, struct kqid qid);
void dqput(struct dquot *dquot); void dqput(struct dquot *dquot);
int dquot_scan_active(struct super_block *sb, int dquot_scan_active(struct super_block *sb,
int (*fn)(struct dquot *dquot, unsigned long priv), int (*fn)(struct dquot *dquot, unsigned long priv),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment