userns: Modify dqget to take struct kqid
authorEric W. Biederman <ebiederm@xmission.com>
Sun, 16 Sep 2012 10:11:50 +0000 (03:11 -0700)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 18 Sep 2012 08:01:40 +0000 (01:01 -0700)
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: "Eric W. Biederman" <ebiederm@xmission.com>
fs/ocfs2/file.c
fs/ocfs2/quota_local.c
fs/quota/dquot.c
include/linux/quotaops.h

index 46a1f6d..5a4ee77 100644 (file)
@@ -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
                    && OCFS2_HAS_RO_COMPAT_FEATURE(sb,
                    OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
-                       transfer_to[USRQUOTA] = dqget(sb, attr->ia_uid,
-                                                     USRQUOTA);
+                       transfer_to[USRQUOTA] = dqget(sb, make_kqid_uid(attr->ia_uid));
                        if (!transfer_to[USRQUOTA]) {
                                status = -ESRCH;
                                goto bail_unlock;
@@ -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
                    && OCFS2_HAS_RO_COMPAT_FEATURE(sb,
                    OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
-                       transfer_to[GRPQUOTA] = dqget(sb, attr->ia_gid,
-                                                     GRPQUOTA);
+                       transfer_to[GRPQUOTA] = dqget(sb, make_kqid_gid(attr->ia_gid));
                        if (!transfer_to[GRPQUOTA]) {
                                status = -ESRCH;
                                goto bail_unlock;
index f100bf7..020f0ba 100644 (file)
@@ -501,7 +501,9 @@ static int ocfs2_recover_local_quota_file(struct inode *lqinode,
                        }
                        dqblk = (struct ocfs2_local_disk_dqblk *)(qbh->b_data +
                                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) {
                                status = -EIO;
                                mlog(ML_ERROR, "Failed to get quota structure "
index 80d3378..53e377a 100644 (file)
@@ -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
  *   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);
        struct dquot *dquot = NULL, *empty = NULL;
 
@@ -1390,7 +1392,6 @@ static int dquot_active(const struct inode *inode)
  */
 static void __dquot_initialize(struct inode *inode, int type)
 {
-       unsigned int id = 0;
        int cnt;
        struct dquot *got[MAXQUOTAS];
        struct super_block *sb = inode->i_sb;
@@ -1403,18 +1404,19 @@ static void __dquot_initialize(struct inode *inode, int type)
 
        /* First get references to structures we might need. */
        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+               struct kqid qid;
                got[cnt] = NULL;
                if (type != -1 && cnt != type)
                        continue;
                switch (cnt) {
                case USRQUOTA:
-                       id = inode->i_uid;
+                       qid = make_kqid_uid(inode->i_uid);
                        break;
                case GRPQUOTA:
-                       id = inode->i_gid;
+                       qid = make_kqid_gid(inode->i_gid);
                        break;
                }
-               got[cnt] = dqget(sb, id, cnt);
+               got[cnt] = dqget(sb, qid);
        }
 
        down_write(&sb_dqopt(sb)->dqptr_sem);
@@ -1898,9 +1900,9 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr)
                return 0;
 
        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)
-               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);
        dqput_all(transfer_to);
@@ -2381,7 +2383,7 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid,
 {
        struct dquot *dquot;
 
-       dquot = dqget(sb, qid.type, from_kqid(&init_user_ns, qid));
+       dquot = dqget(sb, qid);
        if (!dquot)
                return -ESRCH;
        do_get_dqblk(dquot, di);
@@ -2494,7 +2496,7 @@ int dquot_set_dqblk(struct super_block *sb, struct kqid qid,
        struct dquot *dquot;
        int rc;
 
-       dquot = dqget(sb, qid.type, from_kqid(&init_user_ns, qid));
+       dquot = dqget(sb, qid);
        if (!dquot) {
                rc = -ESRCH;
                goto out;
index bd3730d..1c50093 100644 (file)
@@ -44,7 +44,7 @@ void inode_sub_rsv_space(struct inode *inode, qsize_t number);
 
 void dquot_initialize(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);
 int dquot_scan_active(struct super_block *sb,
                      int (*fn)(struct dquot *dquot, unsigned long priv),