diff options
Diffstat (limited to 'fs/quota')
-rw-r--r-- | fs/quota/dquot.c | 63 | ||||
-rw-r--r-- | fs/quota/quota_tree.c | 22 | ||||
-rw-r--r-- | fs/quota/quota_v1.c | 12 | ||||
-rw-r--r-- | fs/quota/quota_v2.c | 26 |
4 files changed, 67 insertions, 56 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 53e377a59b05..efaeed35476f 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -267,7 +267,7 @@ hashfn(const struct super_block *sb, unsigned int id, int type) | |||
267 | static inline void insert_dquot_hash(struct dquot *dquot) | 267 | static inline void insert_dquot_hash(struct dquot *dquot) |
268 | { | 268 | { |
269 | struct hlist_head *head; | 269 | struct hlist_head *head; |
270 | head = dquot_hash + hashfn(dquot->dq_sb, dquot->dq_id, dquot->dq_type); | 270 | head = dquot_hash + hashfn(dquot->dq_sb, from_kqid(&init_user_ns, dquot->dq_id), dquot->dq_id.type); |
271 | hlist_add_head(&dquot->dq_hash, head); | 271 | hlist_add_head(&dquot->dq_hash, head); |
272 | } | 272 | } |
273 | 273 | ||
@@ -279,13 +279,13 @@ static inline void remove_dquot_hash(struct dquot *dquot) | |||
279 | static struct dquot *find_dquot(unsigned int hashent, struct super_block *sb, | 279 | static struct dquot *find_dquot(unsigned int hashent, struct super_block *sb, |
280 | unsigned int id, int type) | 280 | unsigned int id, int type) |
281 | { | 281 | { |
282 | struct kqid qid = make_kqid(&init_user_ns, type, id); | ||
282 | struct hlist_node *node; | 283 | struct hlist_node *node; |
283 | struct dquot *dquot; | 284 | struct dquot *dquot; |
284 | 285 | ||
285 | hlist_for_each (node, dquot_hash+hashent) { | 286 | hlist_for_each (node, dquot_hash+hashent) { |
286 | dquot = hlist_entry(node, struct dquot, dq_hash); | 287 | dquot = hlist_entry(node, struct dquot, dq_hash); |
287 | if (dquot->dq_sb == sb && dquot->dq_id == id && | 288 | if (dquot->dq_sb == sb && qid_eq(dquot->dq_id, qid)) |
288 | dquot->dq_type == type) | ||
289 | return dquot; | 289 | return dquot; |
290 | } | 290 | } |
291 | return NULL; | 291 | return NULL; |
@@ -351,7 +351,7 @@ int dquot_mark_dquot_dirty(struct dquot *dquot) | |||
351 | spin_lock(&dq_list_lock); | 351 | spin_lock(&dq_list_lock); |
352 | if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags)) { | 352 | if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags)) { |
353 | list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)-> | 353 | list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)-> |
354 | info[dquot->dq_type].dqi_dirty_list); | 354 | info[dquot->dq_id.type].dqi_dirty_list); |
355 | ret = 0; | 355 | ret = 0; |
356 | } | 356 | } |
357 | spin_unlock(&dq_list_lock); | 357 | spin_unlock(&dq_list_lock); |
@@ -410,17 +410,17 @@ int dquot_acquire(struct dquot *dquot) | |||
410 | mutex_lock(&dquot->dq_lock); | 410 | mutex_lock(&dquot->dq_lock); |
411 | mutex_lock(&dqopt->dqio_mutex); | 411 | mutex_lock(&dqopt->dqio_mutex); |
412 | if (!test_bit(DQ_READ_B, &dquot->dq_flags)) | 412 | if (!test_bit(DQ_READ_B, &dquot->dq_flags)) |
413 | ret = dqopt->ops[dquot->dq_type]->read_dqblk(dquot); | 413 | ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot); |
414 | if (ret < 0) | 414 | if (ret < 0) |
415 | goto out_iolock; | 415 | goto out_iolock; |
416 | set_bit(DQ_READ_B, &dquot->dq_flags); | 416 | set_bit(DQ_READ_B, &dquot->dq_flags); |
417 | /* Instantiate dquot if needed */ | 417 | /* Instantiate dquot if needed */ |
418 | if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) { | 418 | if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) { |
419 | ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot); | 419 | ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot); |
420 | /* Write the info if needed */ | 420 | /* Write the info if needed */ |
421 | if (info_dirty(&dqopt->info[dquot->dq_type])) { | 421 | if (info_dirty(&dqopt->info[dquot->dq_id.type])) { |
422 | ret2 = dqopt->ops[dquot->dq_type]->write_file_info( | 422 | ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info( |
423 | dquot->dq_sb, dquot->dq_type); | 423 | dquot->dq_sb, dquot->dq_id.type); |
424 | } | 424 | } |
425 | if (ret < 0) | 425 | if (ret < 0) |
426 | goto out_iolock; | 426 | goto out_iolock; |
@@ -455,7 +455,7 @@ int dquot_commit(struct dquot *dquot) | |||
455 | /* Inactive dquot can be only if there was error during read/init | 455 | /* Inactive dquot can be only if there was error during read/init |
456 | * => we have better not writing it */ | 456 | * => we have better not writing it */ |
457 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) | 457 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) |
458 | ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot); | 458 | ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot); |
459 | else | 459 | else |
460 | ret = -EIO; | 460 | ret = -EIO; |
461 | out_sem: | 461 | out_sem: |
@@ -477,12 +477,12 @@ int dquot_release(struct dquot *dquot) | |||
477 | if (atomic_read(&dquot->dq_count) > 1) | 477 | if (atomic_read(&dquot->dq_count) > 1) |
478 | goto out_dqlock; | 478 | goto out_dqlock; |
479 | mutex_lock(&dqopt->dqio_mutex); | 479 | mutex_lock(&dqopt->dqio_mutex); |
480 | if (dqopt->ops[dquot->dq_type]->release_dqblk) { | 480 | if (dqopt->ops[dquot->dq_id.type]->release_dqblk) { |
481 | ret = dqopt->ops[dquot->dq_type]->release_dqblk(dquot); | 481 | ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot); |
482 | /* Write the info */ | 482 | /* Write the info */ |
483 | if (info_dirty(&dqopt->info[dquot->dq_type])) { | 483 | if (info_dirty(&dqopt->info[dquot->dq_id.type])) { |
484 | ret2 = dqopt->ops[dquot->dq_type]->write_file_info( | 484 | ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info( |
485 | dquot->dq_sb, dquot->dq_type); | 485 | dquot->dq_sb, dquot->dq_id.type); |
486 | } | 486 | } |
487 | if (ret >= 0) | 487 | if (ret >= 0) |
488 | ret = ret2; | 488 | ret = ret2; |
@@ -521,7 +521,7 @@ restart: | |||
521 | list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) { | 521 | list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) { |
522 | if (dquot->dq_sb != sb) | 522 | if (dquot->dq_sb != sb) |
523 | continue; | 523 | continue; |
524 | if (dquot->dq_type != type) | 524 | if (dquot->dq_id.type != type) |
525 | continue; | 525 | continue; |
526 | /* Wait for dquot users */ | 526 | /* Wait for dquot users */ |
527 | if (atomic_read(&dquot->dq_count)) { | 527 | if (atomic_read(&dquot->dq_count)) { |
@@ -741,7 +741,8 @@ void dqput(struct dquot *dquot) | |||
741 | #ifdef CONFIG_QUOTA_DEBUG | 741 | #ifdef CONFIG_QUOTA_DEBUG |
742 | if (!atomic_read(&dquot->dq_count)) { | 742 | if (!atomic_read(&dquot->dq_count)) { |
743 | quota_error(dquot->dq_sb, "trying to free free dquot of %s %d", | 743 | quota_error(dquot->dq_sb, "trying to free free dquot of %s %d", |
744 | quotatypes[dquot->dq_type], dquot->dq_id); | 744 | quotatypes[dquot->dq_id.type], |
745 | from_kqid(&init_user_ns, dquot->dq_id)); | ||
745 | BUG(); | 746 | BUG(); |
746 | } | 747 | } |
747 | #endif | 748 | #endif |
@@ -752,7 +753,7 @@ we_slept: | |||
752 | /* We have more than one user... nothing to do */ | 753 | /* We have more than one user... nothing to do */ |
753 | atomic_dec(&dquot->dq_count); | 754 | atomic_dec(&dquot->dq_count); |
754 | /* Releasing dquot during quotaoff phase? */ | 755 | /* Releasing dquot during quotaoff phase? */ |
755 | if (!sb_has_quota_active(dquot->dq_sb, dquot->dq_type) && | 756 | if (!sb_has_quota_active(dquot->dq_sb, dquot->dq_id.type) && |
756 | atomic_read(&dquot->dq_count) == 1) | 757 | atomic_read(&dquot->dq_count) == 1) |
757 | wake_up(&dquot->dq_wait_unused); | 758 | wake_up(&dquot->dq_wait_unused); |
758 | spin_unlock(&dq_list_lock); | 759 | spin_unlock(&dq_list_lock); |
@@ -815,7 +816,7 @@ static struct dquot *get_empty_dquot(struct super_block *sb, int type) | |||
815 | INIT_LIST_HEAD(&dquot->dq_dirty); | 816 | INIT_LIST_HEAD(&dquot->dq_dirty); |
816 | init_waitqueue_head(&dquot->dq_wait_unused); | 817 | init_waitqueue_head(&dquot->dq_wait_unused); |
817 | dquot->dq_sb = sb; | 818 | dquot->dq_sb = sb; |
818 | dquot->dq_type = type; | 819 | dquot->dq_id.type = type; |
819 | atomic_set(&dquot->dq_count, 1); | 820 | atomic_set(&dquot->dq_count, 1); |
820 | 821 | ||
821 | return dquot; | 822 | return dquot; |
@@ -859,7 +860,7 @@ we_slept: | |||
859 | } | 860 | } |
860 | dquot = empty; | 861 | dquot = empty; |
861 | empty = NULL; | 862 | empty = NULL; |
862 | dquot->dq_id = id; | 863 | dquot->dq_id = qid; |
863 | /* all dquots go on the inuse_list */ | 864 | /* all dquots go on the inuse_list */ |
864 | put_inuse(dquot); | 865 | put_inuse(dquot); |
865 | /* hash it first so it can be found */ | 866 | /* hash it first so it can be found */ |
@@ -1219,8 +1220,8 @@ static void prepare_warning(struct dquot_warn *warn, struct dquot *dquot, | |||
1219 | return; | 1220 | return; |
1220 | warn->w_type = warntype; | 1221 | warn->w_type = warntype; |
1221 | warn->w_sb = dquot->dq_sb; | 1222 | warn->w_sb = dquot->dq_sb; |
1222 | warn->w_dq_id = dquot->dq_id; | 1223 | warn->w_dq_id = from_kqid(&init_user_ns, dquot->dq_id); |
1223 | warn->w_dq_type = dquot->dq_type; | 1224 | warn->w_dq_type = dquot->dq_id.type; |
1224 | } | 1225 | } |
1225 | 1226 | ||
1226 | /* | 1227 | /* |
@@ -1245,7 +1246,7 @@ static void flush_warnings(struct dquot_warn *warn) | |||
1245 | 1246 | ||
1246 | static int ignore_hardlimit(struct dquot *dquot) | 1247 | static int ignore_hardlimit(struct dquot *dquot) |
1247 | { | 1248 | { |
1248 | struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type]; | 1249 | struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; |
1249 | 1250 | ||
1250 | return capable(CAP_SYS_RESOURCE) && | 1251 | return capable(CAP_SYS_RESOURCE) && |
1251 | (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || | 1252 | (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || |
@@ -1258,7 +1259,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, | |||
1258 | { | 1259 | { |
1259 | qsize_t newinodes = dquot->dq_dqb.dqb_curinodes + inodes; | 1260 | qsize_t newinodes = dquot->dq_dqb.dqb_curinodes + inodes; |
1260 | 1261 | ||
1261 | if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_type) || | 1262 | if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type) || |
1262 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) | 1263 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) |
1263 | return 0; | 1264 | return 0; |
1264 | 1265 | ||
@@ -1283,7 +1284,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, | |||
1283 | dquot->dq_dqb.dqb_itime == 0) { | 1284 | dquot->dq_dqb.dqb_itime == 0) { |
1284 | prepare_warning(warn, dquot, QUOTA_NL_ISOFTWARN); | 1285 | prepare_warning(warn, dquot, QUOTA_NL_ISOFTWARN); |
1285 | dquot->dq_dqb.dqb_itime = get_seconds() + | 1286 | dquot->dq_dqb.dqb_itime = get_seconds() + |
1286 | sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace; | 1287 | sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type].dqi_igrace; |
1287 | } | 1288 | } |
1288 | 1289 | ||
1289 | return 0; | 1290 | return 0; |
@@ -1296,7 +1297,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, | |||
1296 | qsize_t tspace; | 1297 | qsize_t tspace; |
1297 | struct super_block *sb = dquot->dq_sb; | 1298 | struct super_block *sb = dquot->dq_sb; |
1298 | 1299 | ||
1299 | if (!sb_has_quota_limits_enabled(sb, dquot->dq_type) || | 1300 | if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) || |
1300 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) | 1301 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) |
1301 | return 0; | 1302 | return 0; |
1302 | 1303 | ||
@@ -1327,7 +1328,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, | |||
1327 | if (!prealloc) { | 1328 | if (!prealloc) { |
1328 | prepare_warning(warn, dquot, QUOTA_NL_BSOFTWARN); | 1329 | prepare_warning(warn, dquot, QUOTA_NL_BSOFTWARN); |
1329 | dquot->dq_dqb.dqb_btime = get_seconds() + | 1330 | dquot->dq_dqb.dqb_btime = get_seconds() + |
1330 | sb_dqopt(sb)->info[dquot->dq_type].dqi_bgrace; | 1331 | sb_dqopt(sb)->info[dquot->dq_id.type].dqi_bgrace; |
1331 | } | 1332 | } |
1332 | else | 1333 | else |
1333 | /* | 1334 | /* |
@@ -1346,7 +1347,7 @@ static int info_idq_free(struct dquot *dquot, qsize_t inodes) | |||
1346 | 1347 | ||
1347 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || | 1348 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || |
1348 | dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit || | 1349 | dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit || |
1349 | !sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_type)) | 1350 | !sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type)) |
1350 | return QUOTA_NL_NOWARN; | 1351 | return QUOTA_NL_NOWARN; |
1351 | 1352 | ||
1352 | newinodes = dquot->dq_dqb.dqb_curinodes - inodes; | 1353 | newinodes = dquot->dq_dqb.dqb_curinodes - inodes; |
@@ -2362,9 +2363,9 @@ static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
2362 | 2363 | ||
2363 | memset(di, 0, sizeof(*di)); | 2364 | memset(di, 0, sizeof(*di)); |
2364 | di->d_version = FS_DQUOT_VERSION; | 2365 | di->d_version = FS_DQUOT_VERSION; |
2365 | di->d_flags = dquot->dq_type == USRQUOTA ? | 2366 | di->d_flags = dquot->dq_id.type == USRQUOTA ? |
2366 | FS_USER_QUOTA : FS_GROUP_QUOTA; | 2367 | FS_USER_QUOTA : FS_GROUP_QUOTA; |
2367 | di->d_id = dquot->dq_id; | 2368 | di->d_id = from_kqid_munged(current_user_ns(), dquot->dq_id); |
2368 | 2369 | ||
2369 | spin_lock(&dq_data_lock); | 2370 | spin_lock(&dq_data_lock); |
2370 | di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit); | 2371 | di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit); |
@@ -2403,7 +2404,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
2403 | { | 2404 | { |
2404 | struct mem_dqblk *dm = &dquot->dq_dqb; | 2405 | struct mem_dqblk *dm = &dquot->dq_dqb; |
2405 | int check_blim = 0, check_ilim = 0; | 2406 | int check_blim = 0, check_ilim = 0; |
2406 | struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type]; | 2407 | struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; |
2407 | 2408 | ||
2408 | if (di->d_fieldmask & ~VFS_FS_DQ_MASK) | 2409 | if (di->d_fieldmask & ~VFS_FS_DQ_MASK) |
2409 | return -EINVAL; | 2410 | return -EINVAL; |
diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c index e41c1becf096..d65877fbe8f4 100644 --- a/fs/quota/quota_tree.c +++ b/fs/quota/quota_tree.c | |||
@@ -22,9 +22,10 @@ MODULE_LICENSE("GPL"); | |||
22 | 22 | ||
23 | #define __QUOTA_QT_PARANOIA | 23 | #define __QUOTA_QT_PARANOIA |
24 | 24 | ||
25 | static int get_index(struct qtree_mem_dqinfo *info, qid_t id, int depth) | 25 | static int get_index(struct qtree_mem_dqinfo *info, struct kqid qid, int depth) |
26 | { | 26 | { |
27 | unsigned int epb = info->dqi_usable_bs >> 2; | 27 | unsigned int epb = info->dqi_usable_bs >> 2; |
28 | qid_t id = from_kqid(&init_user_ns, qid); | ||
28 | 29 | ||
29 | depth = info->dqi_qtree_depth - depth - 1; | 30 | depth = info->dqi_qtree_depth - depth - 1; |
30 | while (depth--) | 31 | while (depth--) |
@@ -244,7 +245,7 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info, | |||
244 | /* This is enough as the block is already zeroed and the entry | 245 | /* This is enough as the block is already zeroed and the entry |
245 | * list is empty... */ | 246 | * list is empty... */ |
246 | info->dqi_free_entry = blk; | 247 | info->dqi_free_entry = blk; |
247 | mark_info_dirty(dquot->dq_sb, dquot->dq_type); | 248 | mark_info_dirty(dquot->dq_sb, dquot->dq_id.type); |
248 | } | 249 | } |
249 | /* Block will be full? */ | 250 | /* Block will be full? */ |
250 | if (le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info)) { | 251 | if (le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info)) { |
@@ -357,7 +358,7 @@ static inline int dq_insert_tree(struct qtree_mem_dqinfo *info, | |||
357 | */ | 358 | */ |
358 | int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) | 359 | int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) |
359 | { | 360 | { |
360 | int type = dquot->dq_type; | 361 | int type = dquot->dq_id.type; |
361 | struct super_block *sb = dquot->dq_sb; | 362 | struct super_block *sb = dquot->dq_sb; |
362 | ssize_t ret; | 363 | ssize_t ret; |
363 | char *ddquot = getdqbuf(info->dqi_entry_size); | 364 | char *ddquot = getdqbuf(info->dqi_entry_size); |
@@ -538,8 +539,9 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info, | |||
538 | ddquot += info->dqi_entry_size; | 539 | ddquot += info->dqi_entry_size; |
539 | } | 540 | } |
540 | if (i == qtree_dqstr_in_blk(info)) { | 541 | if (i == qtree_dqstr_in_blk(info)) { |
541 | quota_error(dquot->dq_sb, "Quota for id %u referenced " | 542 | quota_error(dquot->dq_sb, |
542 | "but not present", dquot->dq_id); | 543 | "Quota for id %u referenced but not present", |
544 | from_kqid(&init_user_ns, dquot->dq_id)); | ||
543 | ret = -EIO; | 545 | ret = -EIO; |
544 | goto out_buf; | 546 | goto out_buf; |
545 | } else { | 547 | } else { |
@@ -589,7 +591,7 @@ static inline loff_t find_dqentry(struct qtree_mem_dqinfo *info, | |||
589 | 591 | ||
590 | int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) | 592 | int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) |
591 | { | 593 | { |
592 | int type = dquot->dq_type; | 594 | int type = dquot->dq_id.type; |
593 | struct super_block *sb = dquot->dq_sb; | 595 | struct super_block *sb = dquot->dq_sb; |
594 | loff_t offset; | 596 | loff_t offset; |
595 | char *ddquot; | 597 | char *ddquot; |
@@ -607,8 +609,10 @@ int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) | |||
607 | offset = find_dqentry(info, dquot); | 609 | offset = find_dqentry(info, dquot); |
608 | if (offset <= 0) { /* Entry not present? */ | 610 | if (offset <= 0) { /* Entry not present? */ |
609 | if (offset < 0) | 611 | if (offset < 0) |
610 | quota_error(sb, "Can't read quota structure " | 612 | quota_error(sb,"Can't read quota structure " |
611 | "for id %u", dquot->dq_id); | 613 | "for id %u", |
614 | from_kqid(&init_user_ns, | ||
615 | dquot->dq_id)); | ||
612 | dquot->dq_off = 0; | 616 | dquot->dq_off = 0; |
613 | set_bit(DQ_FAKE_B, &dquot->dq_flags); | 617 | set_bit(DQ_FAKE_B, &dquot->dq_flags); |
614 | memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk)); | 618 | memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk)); |
@@ -626,7 +630,7 @@ int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) | |||
626 | if (ret >= 0) | 630 | if (ret >= 0) |
627 | ret = -EIO; | 631 | ret = -EIO; |
628 | quota_error(sb, "Error while reading quota structure for id %u", | 632 | quota_error(sb, "Error while reading quota structure for id %u", |
629 | dquot->dq_id); | 633 | from_kqid(&init_user_ns, dquot->dq_id)); |
630 | set_bit(DQ_FAKE_B, &dquot->dq_flags); | 634 | set_bit(DQ_FAKE_B, &dquot->dq_flags); |
631 | memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk)); | 635 | memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk)); |
632 | kfree(ddquot); | 636 | kfree(ddquot); |
diff --git a/fs/quota/quota_v1.c b/fs/quota/quota_v1.c index 34b37a67bb16..469c6848b322 100644 --- a/fs/quota/quota_v1.c +++ b/fs/quota/quota_v1.c | |||
@@ -54,7 +54,7 @@ static void v1_mem2disk_dqblk(struct v1_disk_dqblk *d, struct mem_dqblk *m) | |||
54 | 54 | ||
55 | static int v1_read_dqblk(struct dquot *dquot) | 55 | static int v1_read_dqblk(struct dquot *dquot) |
56 | { | 56 | { |
57 | int type = dquot->dq_type; | 57 | int type = dquot->dq_id.type; |
58 | struct v1_disk_dqblk dqblk; | 58 | struct v1_disk_dqblk dqblk; |
59 | 59 | ||
60 | if (!sb_dqopt(dquot->dq_sb)->files[type]) | 60 | if (!sb_dqopt(dquot->dq_sb)->files[type]) |
@@ -63,7 +63,8 @@ static int v1_read_dqblk(struct dquot *dquot) | |||
63 | /* Set structure to 0s in case read fails/is after end of file */ | 63 | /* Set structure to 0s in case read fails/is after end of file */ |
64 | memset(&dqblk, 0, sizeof(struct v1_disk_dqblk)); | 64 | memset(&dqblk, 0, sizeof(struct v1_disk_dqblk)); |
65 | dquot->dq_sb->s_op->quota_read(dquot->dq_sb, type, (char *)&dqblk, | 65 | dquot->dq_sb->s_op->quota_read(dquot->dq_sb, type, (char *)&dqblk, |
66 | sizeof(struct v1_disk_dqblk), v1_dqoff(dquot->dq_id)); | 66 | sizeof(struct v1_disk_dqblk), |
67 | v1_dqoff(from_kqid(&init_user_ns, dquot->dq_id))); | ||
67 | 68 | ||
68 | v1_disk2mem_dqblk(&dquot->dq_dqb, &dqblk); | 69 | v1_disk2mem_dqblk(&dquot->dq_dqb, &dqblk); |
69 | if (dquot->dq_dqb.dqb_bhardlimit == 0 && | 70 | if (dquot->dq_dqb.dqb_bhardlimit == 0 && |
@@ -78,12 +79,13 @@ static int v1_read_dqblk(struct dquot *dquot) | |||
78 | 79 | ||
79 | static int v1_commit_dqblk(struct dquot *dquot) | 80 | static int v1_commit_dqblk(struct dquot *dquot) |
80 | { | 81 | { |
81 | short type = dquot->dq_type; | 82 | short type = dquot->dq_id.type; |
82 | ssize_t ret; | 83 | ssize_t ret; |
83 | struct v1_disk_dqblk dqblk; | 84 | struct v1_disk_dqblk dqblk; |
84 | 85 | ||
85 | v1_mem2disk_dqblk(&dqblk, &dquot->dq_dqb); | 86 | v1_mem2disk_dqblk(&dqblk, &dquot->dq_dqb); |
86 | if (dquot->dq_id == 0) { | 87 | if (((type == USRQUOTA) && uid_eq(dquot->dq_id.uid, GLOBAL_ROOT_UID)) || |
88 | ((type == GRPQUOTA) && gid_eq(dquot->dq_id.gid, GLOBAL_ROOT_GID))) { | ||
87 | dqblk.dqb_btime = | 89 | dqblk.dqb_btime = |
88 | sb_dqopt(dquot->dq_sb)->info[type].dqi_bgrace; | 90 | sb_dqopt(dquot->dq_sb)->info[type].dqi_bgrace; |
89 | dqblk.dqb_itime = | 91 | dqblk.dqb_itime = |
@@ -93,7 +95,7 @@ static int v1_commit_dqblk(struct dquot *dquot) | |||
93 | if (sb_dqopt(dquot->dq_sb)->files[type]) | 95 | if (sb_dqopt(dquot->dq_sb)->files[type]) |
94 | ret = dquot->dq_sb->s_op->quota_write(dquot->dq_sb, type, | 96 | ret = dquot->dq_sb->s_op->quota_write(dquot->dq_sb, type, |
95 | (char *)&dqblk, sizeof(struct v1_disk_dqblk), | 97 | (char *)&dqblk, sizeof(struct v1_disk_dqblk), |
96 | v1_dqoff(dquot->dq_id)); | 98 | v1_dqoff(from_kqid(&init_user_ns, dquot->dq_id))); |
97 | if (ret != sizeof(struct v1_disk_dqblk)) { | 99 | if (ret != sizeof(struct v1_disk_dqblk)) { |
98 | quota_error(dquot->dq_sb, "dquota write failed"); | 100 | quota_error(dquot->dq_sb, "dquota write failed"); |
99 | if (ret >= 0) | 101 | if (ret >= 0) |
diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c index f1ab3604db5a..02751ec695c5 100644 --- a/fs/quota/quota_v2.c +++ b/fs/quota/quota_v2.c | |||
@@ -196,7 +196,7 @@ static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot) | |||
196 | struct v2r0_disk_dqblk *d = dp; | 196 | struct v2r0_disk_dqblk *d = dp; |
197 | struct mem_dqblk *m = &dquot->dq_dqb; | 197 | struct mem_dqblk *m = &dquot->dq_dqb; |
198 | struct qtree_mem_dqinfo *info = | 198 | struct qtree_mem_dqinfo *info = |
199 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 199 | sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; |
200 | 200 | ||
201 | d->dqb_ihardlimit = cpu_to_le32(m->dqb_ihardlimit); | 201 | d->dqb_ihardlimit = cpu_to_le32(m->dqb_ihardlimit); |
202 | d->dqb_isoftlimit = cpu_to_le32(m->dqb_isoftlimit); | 202 | d->dqb_isoftlimit = cpu_to_le32(m->dqb_isoftlimit); |
@@ -206,7 +206,7 @@ static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot) | |||
206 | d->dqb_bsoftlimit = cpu_to_le32(v2_stoqb(m->dqb_bsoftlimit)); | 206 | d->dqb_bsoftlimit = cpu_to_le32(v2_stoqb(m->dqb_bsoftlimit)); |
207 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); | 207 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); |
208 | d->dqb_btime = cpu_to_le64(m->dqb_btime); | 208 | d->dqb_btime = cpu_to_le64(m->dqb_btime); |
209 | d->dqb_id = cpu_to_le32(dquot->dq_id); | 209 | d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id)); |
210 | if (qtree_entry_unused(info, dp)) | 210 | if (qtree_entry_unused(info, dp)) |
211 | d->dqb_itime = cpu_to_le64(1); | 211 | d->dqb_itime = cpu_to_le64(1); |
212 | } | 212 | } |
@@ -215,11 +215,13 @@ static int v2r0_is_id(void *dp, struct dquot *dquot) | |||
215 | { | 215 | { |
216 | struct v2r0_disk_dqblk *d = dp; | 216 | struct v2r0_disk_dqblk *d = dp; |
217 | struct qtree_mem_dqinfo *info = | 217 | struct qtree_mem_dqinfo *info = |
218 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 218 | sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; |
219 | 219 | ||
220 | if (qtree_entry_unused(info, dp)) | 220 | if (qtree_entry_unused(info, dp)) |
221 | return 0; | 221 | return 0; |
222 | return le32_to_cpu(d->dqb_id) == dquot->dq_id; | 222 | return qid_eq(make_kqid(&init_user_ns, dquot->dq_id.type, |
223 | le32_to_cpu(d->dqb_id)), | ||
224 | dquot->dq_id); | ||
223 | } | 225 | } |
224 | 226 | ||
225 | static void v2r1_disk2memdqb(struct dquot *dquot, void *dp) | 227 | static void v2r1_disk2memdqb(struct dquot *dquot, void *dp) |
@@ -247,7 +249,7 @@ static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot) | |||
247 | struct v2r1_disk_dqblk *d = dp; | 249 | struct v2r1_disk_dqblk *d = dp; |
248 | struct mem_dqblk *m = &dquot->dq_dqb; | 250 | struct mem_dqblk *m = &dquot->dq_dqb; |
249 | struct qtree_mem_dqinfo *info = | 251 | struct qtree_mem_dqinfo *info = |
250 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 252 | sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; |
251 | 253 | ||
252 | d->dqb_ihardlimit = cpu_to_le64(m->dqb_ihardlimit); | 254 | d->dqb_ihardlimit = cpu_to_le64(m->dqb_ihardlimit); |
253 | d->dqb_isoftlimit = cpu_to_le64(m->dqb_isoftlimit); | 255 | d->dqb_isoftlimit = cpu_to_le64(m->dqb_isoftlimit); |
@@ -257,7 +259,7 @@ static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot) | |||
257 | d->dqb_bsoftlimit = cpu_to_le64(v2_stoqb(m->dqb_bsoftlimit)); | 259 | d->dqb_bsoftlimit = cpu_to_le64(v2_stoqb(m->dqb_bsoftlimit)); |
258 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); | 260 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); |
259 | d->dqb_btime = cpu_to_le64(m->dqb_btime); | 261 | d->dqb_btime = cpu_to_le64(m->dqb_btime); |
260 | d->dqb_id = cpu_to_le32(dquot->dq_id); | 262 | d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id)); |
261 | if (qtree_entry_unused(info, dp)) | 263 | if (qtree_entry_unused(info, dp)) |
262 | d->dqb_itime = cpu_to_le64(1); | 264 | d->dqb_itime = cpu_to_le64(1); |
263 | } | 265 | } |
@@ -266,26 +268,28 @@ static int v2r1_is_id(void *dp, struct dquot *dquot) | |||
266 | { | 268 | { |
267 | struct v2r1_disk_dqblk *d = dp; | 269 | struct v2r1_disk_dqblk *d = dp; |
268 | struct qtree_mem_dqinfo *info = | 270 | struct qtree_mem_dqinfo *info = |
269 | sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv; | 271 | sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; |
270 | 272 | ||
271 | if (qtree_entry_unused(info, dp)) | 273 | if (qtree_entry_unused(info, dp)) |
272 | return 0; | 274 | return 0; |
273 | return le32_to_cpu(d->dqb_id) == dquot->dq_id; | 275 | return qid_eq(make_kqid(&init_user_ns, dquot->dq_id.type, |
276 | le32_to_cpu(d->dqb_id)), | ||
277 | dquot->dq_id); | ||
274 | } | 278 | } |
275 | 279 | ||
276 | static int v2_read_dquot(struct dquot *dquot) | 280 | static int v2_read_dquot(struct dquot *dquot) |
277 | { | 281 | { |
278 | return qtree_read_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv, dquot); | 282 | return qtree_read_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, dquot); |
279 | } | 283 | } |
280 | 284 | ||
281 | static int v2_write_dquot(struct dquot *dquot) | 285 | static int v2_write_dquot(struct dquot *dquot) |
282 | { | 286 | { |
283 | return qtree_write_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv, dquot); | 287 | return qtree_write_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, dquot); |
284 | } | 288 | } |
285 | 289 | ||
286 | static int v2_release_dquot(struct dquot *dquot) | 290 | static int v2_release_dquot(struct dquot *dquot) |
287 | { | 291 | { |
288 | return qtree_release_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_type)->dqi_priv, dquot); | 292 | return qtree_release_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, dquot); |
289 | } | 293 | } |
290 | 294 | ||
291 | static int v2_free_file_info(struct super_block *sb, int type) | 295 | static int v2_free_file_info(struct super_block *sb, int type) |