1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#include <linux/errno.h>
57#include <linux/kernel.h>
58#include <linux/fs.h>
59#include <linux/mount.h>
60#include <linux/mm.h>
61#include <linux/time.h>
62#include <linux/types.h>
63#include <linux/string.h>
64#include <linux/fcntl.h>
65#include <linux/stat.h>
66#include <linux/tty.h>
67#include <linux/file.h>
68#include <linux/slab.h>
69#include <linux/sysctl.h>
70#include <linux/init.h>
71#include <linux/module.h>
72#include <linux/proc_fs.h>
73#include <linux/security.h>
74#include <linux/kmod.h>
75#include <linux/namei.h>
76#include <linux/buffer_head.h>
77#include <linux/capability.h>
78#include <linux/quotaops.h>
79#include <linux/writeback.h>
80#ifdef CONFIG_QUOTA_NETLINK_INTERFACE
81#include <net/netlink.h>
82#include <net/genetlink.h>
83#endif
84
85#include <asm/uaccess.h>
86
87#define __DQUOT_PARANOIA
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128static DEFINE_SPINLOCK(dq_list_lock);
129DEFINE_SPINLOCK(dq_data_lock);
130
131static char *quotatypes[] = INITQFNAMES;
132static struct quota_format_type *quota_formats;
133static struct quota_module_name module_names[] = INIT_QUOTA_MODULE_NAMES;
134
135
136static struct kmem_cache *dquot_cachep;
137
138int register_quota_format(struct quota_format_type *fmt)
139{
140 spin_lock(&dq_list_lock);
141 fmt->qf_next = quota_formats;
142 quota_formats = fmt;
143 spin_unlock(&dq_list_lock);
144 return 0;
145}
146
147void unregister_quota_format(struct quota_format_type *fmt)
148{
149 struct quota_format_type **actqf;
150
151 spin_lock(&dq_list_lock);
152 for (actqf = "a_formats; *actqf && *actqf != fmt; actqf = &(*actqf)->qf_next);
153 if (*actqf)
154 *actqf = (*actqf)->qf_next;
155 spin_unlock(&dq_list_lock);
156}
157
158static struct quota_format_type *find_quota_format(int id)
159{
160 struct quota_format_type *actqf;
161
162 spin_lock(&dq_list_lock);
163 for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next);
164 if (!actqf || !try_module_get(actqf->qf_owner)) {
165 int qm;
166
167 spin_unlock(&dq_list_lock);
168
169 for (qm = 0; module_names[qm].qm_fmt_id && module_names[qm].qm_fmt_id != id; qm++);
170 if (!module_names[qm].qm_fmt_id || request_module(module_names[qm].qm_mod_name))
171 return NULL;
172
173 spin_lock(&dq_list_lock);
174 for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next);
175 if (actqf && !try_module_get(actqf->qf_owner))
176 actqf = NULL;
177 }
178 spin_unlock(&dq_list_lock);
179 return actqf;
180}
181
182static void put_quota_format(struct quota_format_type *fmt)
183{
184 module_put(fmt->qf_owner);
185}
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207static LIST_HEAD(inuse_list);
208static LIST_HEAD(free_dquots);
209static unsigned int dq_hash_bits, dq_hash_mask;
210static struct hlist_head *dquot_hash;
211
212struct dqstats dqstats;
213
214static void dqput(struct dquot *dquot);
215
216static inline unsigned int
217hashfn(const struct super_block *sb, unsigned int id, int type)
218{
219 unsigned long tmp;
220
221 tmp = (((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type);
222 return (tmp + (tmp >> dq_hash_bits)) & dq_hash_mask;
223}
224
225
226
227
228static inline void insert_dquot_hash(struct dquot *dquot)
229{
230 struct hlist_head *head = dquot_hash + hashfn(dquot->dq_sb, dquot->dq_id, dquot->dq_type);
231 hlist_add_head(&dquot->dq_hash, head);
232}
233
234static inline void remove_dquot_hash(struct dquot *dquot)
235{
236 hlist_del_init(&dquot->dq_hash);
237}
238
239static inline struct dquot *find_dquot(unsigned int hashent, struct super_block *sb, unsigned int id, int type)
240{
241 struct hlist_node *node;
242 struct dquot *dquot;
243
244 hlist_for_each (node, dquot_hash+hashent) {
245 dquot = hlist_entry(node, struct dquot, dq_hash);
246 if (dquot->dq_sb == sb && dquot->dq_id == id && dquot->dq_type == type)
247 return dquot;
248 }
249 return NODQUOT;
250}
251
252
253static inline void put_dquot_last(struct dquot *dquot)
254{
255 list_add_tail(&dquot->dq_free, &free_dquots);
256 dqstats.free_dquots++;
257}
258
259static inline void remove_free_dquot(struct dquot *dquot)
260{
261 if (list_empty(&dquot->dq_free))
262 return;
263 list_del_init(&dquot->dq_free);
264 dqstats.free_dquots--;
265}
266
267static inline void put_inuse(struct dquot *dquot)
268{
269
270
271 list_add_tail(&dquot->dq_inuse, &inuse_list);
272 dqstats.allocated_dquots++;
273}
274
275static inline void remove_inuse(struct dquot *dquot)
276{
277 dqstats.allocated_dquots--;
278 list_del(&dquot->dq_inuse);
279}
280
281
282
283
284static void wait_on_dquot(struct dquot *dquot)
285{
286 mutex_lock(&dquot->dq_lock);
287 mutex_unlock(&dquot->dq_lock);
288}
289
290static inline int dquot_dirty(struct dquot *dquot)
291{
292 return test_bit(DQ_MOD_B, &dquot->dq_flags);
293}
294
295static inline int mark_dquot_dirty(struct dquot *dquot)
296{
297 return dquot->dq_sb->dq_op->mark_dirty(dquot);
298}
299
300int dquot_mark_dquot_dirty(struct dquot *dquot)
301{
302 spin_lock(&dq_list_lock);
303 if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags))
304 list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)->
305 info[dquot->dq_type].dqi_dirty_list);
306 spin_unlock(&dq_list_lock);
307 return 0;
308}
309
310
311static inline int clear_dquot_dirty(struct dquot *dquot)
312{
313 if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags))
314 return 0;
315 list_del_init(&dquot->dq_dirty);
316 return 1;
317}
318
319void mark_info_dirty(struct super_block *sb, int type)
320{
321 set_bit(DQF_INFO_DIRTY_B, &sb_dqopt(sb)->info[type].dqi_flags);
322}
323EXPORT_SYMBOL(mark_info_dirty);
324
325
326
327
328
329int dquot_acquire(struct dquot *dquot)
330{
331 int ret = 0, ret2 = 0;
332 struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
333
334 mutex_lock(&dquot->dq_lock);
335 mutex_lock(&dqopt->dqio_mutex);
336 if (!test_bit(DQ_READ_B, &dquot->dq_flags))
337 ret = dqopt->ops[dquot->dq_type]->read_dqblk(dquot);
338 if (ret < 0)
339 goto out_iolock;
340 set_bit(DQ_READ_B, &dquot->dq_flags);
341
342 if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) {
343 ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
344
345 if (info_dirty(&dqopt->info[dquot->dq_type]))
346 ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
347 if (ret < 0)
348 goto out_iolock;
349 if (ret2 < 0) {
350 ret = ret2;
351 goto out_iolock;
352 }
353 }
354 set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
355out_iolock:
356 mutex_unlock(&dqopt->dqio_mutex);
357 mutex_unlock(&dquot->dq_lock);
358 return ret;
359}
360
361
362
363
364int dquot_commit(struct dquot *dquot)
365{
366 int ret = 0, ret2 = 0;
367 struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
368
369 mutex_lock(&dqopt->dqio_mutex);
370 spin_lock(&dq_list_lock);
371 if (!clear_dquot_dirty(dquot)) {
372 spin_unlock(&dq_list_lock);
373 goto out_sem;
374 }
375 spin_unlock(&dq_list_lock);
376
377
378 if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
379 ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
380 if (info_dirty(&dqopt->info[dquot->dq_type]))
381 ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
382 if (ret >= 0)
383 ret = ret2;
384 }
385out_sem:
386 mutex_unlock(&dqopt->dqio_mutex);
387 return ret;
388}
389
390
391
392
393int dquot_release(struct dquot *dquot)
394{
395 int ret = 0, ret2 = 0;
396 struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
397
398 mutex_lock(&dquot->dq_lock);
399
400 if (atomic_read(&dquot->dq_count) > 1)
401 goto out_dqlock;
402 mutex_lock(&dqopt->dqio_mutex);
403 if (dqopt->ops[dquot->dq_type]->release_dqblk) {
404 ret = dqopt->ops[dquot->dq_type]->release_dqblk(dquot);
405
406 if (info_dirty(&dqopt->info[dquot->dq_type]))
407 ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
408 if (ret >= 0)
409 ret = ret2;
410 }
411 clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
412 mutex_unlock(&dqopt->dqio_mutex);
413out_dqlock:
414 mutex_unlock(&dquot->dq_lock);
415 return ret;
416}
417
418
419
420
421
422
423
424static void invalidate_dquots(struct super_block *sb, int type)
425{
426 struct dquot *dquot, *tmp;
427
428restart:
429 spin_lock(&dq_list_lock);
430 list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) {
431 if (dquot->dq_sb != sb)
432 continue;
433 if (dquot->dq_type != type)
434 continue;
435
436 if (atomic_read(&dquot->dq_count)) {
437 DEFINE_WAIT(wait);
438
439 atomic_inc(&dquot->dq_count);
440 prepare_to_wait(&dquot->dq_wait_unused, &wait,
441 TASK_UNINTERRUPTIBLE);
442 spin_unlock(&dq_list_lock);
443
444
445
446
447
448
449
450 if (atomic_read(&dquot->dq_count) > 1)
451 schedule();
452 finish_wait(&dquot->dq_wait_unused, &wait);
453 dqput(dquot);
454
455
456
457 goto restart;
458 }
459
460
461
462
463 remove_dquot_hash(dquot);
464 remove_free_dquot(dquot);
465 remove_inuse(dquot);
466 kmem_cache_free(dquot_cachep, dquot);
467 }
468 spin_unlock(&dq_list_lock);
469}
470
471int vfs_quota_sync(struct super_block *sb, int type)
472{
473 struct list_head *dirty;
474 struct dquot *dquot;
475 struct quota_info *dqopt = sb_dqopt(sb);
476 int cnt;
477
478 mutex_lock(&dqopt->dqonoff_mutex);
479 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
480 if (type != -1 && cnt != type)
481 continue;
482 if (!sb_has_quota_enabled(sb, cnt))
483 continue;
484 spin_lock(&dq_list_lock);
485 dirty = &dqopt->info[cnt].dqi_dirty_list;
486 while (!list_empty(dirty)) {
487 dquot = list_first_entry(dirty, struct dquot, dq_dirty);
488
489 if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
490 clear_dquot_dirty(dquot);
491 continue;
492 }
493
494
495
496 atomic_inc(&dquot->dq_count);
497 dqstats.lookups++;
498 spin_unlock(&dq_list_lock);
499 sb->dq_op->write_dquot(dquot);
500 dqput(dquot);
501 spin_lock(&dq_list_lock);
502 }
503 spin_unlock(&dq_list_lock);
504 }
505
506 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
507 if ((cnt == type || type == -1) && sb_has_quota_enabled(sb, cnt)
508 && info_dirty(&dqopt->info[cnt]))
509 sb->dq_op->write_info(sb, cnt);
510 spin_lock(&dq_list_lock);
511 dqstats.syncs++;
512 spin_unlock(&dq_list_lock);
513 mutex_unlock(&dqopt->dqonoff_mutex);
514
515 return 0;
516}
517
518
519static void prune_dqcache(int count)
520{
521 struct list_head *head;
522 struct dquot *dquot;
523
524 head = free_dquots.prev;
525 while (head != &free_dquots && count) {
526 dquot = list_entry(head, struct dquot, dq_free);
527 remove_dquot_hash(dquot);
528 remove_free_dquot(dquot);
529 remove_inuse(dquot);
530 kmem_cache_free(dquot_cachep, dquot);
531 count--;
532 head = free_dquots.prev;
533 }
534}
535
536
537
538
539
540
541static int shrink_dqcache_memory(int nr, gfp_t gfp_mask)
542{
543 if (nr) {
544 spin_lock(&dq_list_lock);
545 prune_dqcache(nr);
546 spin_unlock(&dq_list_lock);
547 }
548 return (dqstats.free_dquots / 100) * sysctl_vfs_cache_pressure;
549}
550
551static struct shrinker dqcache_shrinker = {
552 .shrink = shrink_dqcache_memory,
553 .seeks = DEFAULT_SEEKS,
554};
555
556
557
558
559
560
561static void dqput(struct dquot *dquot)
562{
563 int ret;
564
565 if (!dquot)
566 return;
567#ifdef __DQUOT_PARANOIA
568 if (!atomic_read(&dquot->dq_count)) {
569 printk("VFS: dqput: trying to free free dquot\n");
570 printk("VFS: device %s, dquot of %s %d\n",
571 dquot->dq_sb->s_id,
572 quotatypes[dquot->dq_type],
573 dquot->dq_id);
574 BUG();
575 }
576#endif
577
578 spin_lock(&dq_list_lock);
579 dqstats.drops++;
580 spin_unlock(&dq_list_lock);
581we_slept:
582 spin_lock(&dq_list_lock);
583 if (atomic_read(&dquot->dq_count) > 1) {
584
585 atomic_dec(&dquot->dq_count);
586
587 if (!sb_has_quota_enabled(dquot->dq_sb, dquot->dq_type) &&
588 atomic_read(&dquot->dq_count) == 1)
589 wake_up(&dquot->dq_wait_unused);
590 spin_unlock(&dq_list_lock);
591 return;
592 }
593
594 if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
595 spin_unlock(&dq_list_lock);
596
597 ret = dquot->dq_sb->dq_op->write_dquot(dquot);
598 if (ret < 0) {
599 printk(KERN_ERR "VFS: cannot write quota structure on "
600 "device %s (error %d). Quota may get out of "
601 "sync!\n", dquot->dq_sb->s_id, ret);
602
603
604
605
606 spin_lock(&dq_list_lock);
607 clear_dquot_dirty(dquot);
608 spin_unlock(&dq_list_lock);
609 }
610 goto we_slept;
611 }
612
613 clear_dquot_dirty(dquot);
614 if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
615 spin_unlock(&dq_list_lock);
616 dquot->dq_sb->dq_op->release_dquot(dquot);
617 goto we_slept;
618 }
619 atomic_dec(&dquot->dq_count);
620#ifdef __DQUOT_PARANOIA
621
622 BUG_ON(!list_empty(&dquot->dq_free));
623#endif
624 put_dquot_last(dquot);
625 spin_unlock(&dq_list_lock);
626}
627
628static struct dquot *get_empty_dquot(struct super_block *sb, int type)
629{
630 struct dquot *dquot;
631
632 dquot = kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
633 if(!dquot)
634 return NODQUOT;
635
636 mutex_init(&dquot->dq_lock);
637 INIT_LIST_HEAD(&dquot->dq_free);
638 INIT_LIST_HEAD(&dquot->dq_inuse);
639 INIT_HLIST_NODE(&dquot->dq_hash);
640 INIT_LIST_HEAD(&dquot->dq_dirty);
641 init_waitqueue_head(&dquot->dq_wait_unused);
642 dquot->dq_sb = sb;
643 dquot->dq_type = type;
644 atomic_set(&dquot->dq_count, 1);
645
646 return dquot;
647}
648
649
650
651
652
653static struct dquot *dqget(struct super_block *sb, unsigned int id, int type)
654{
655 unsigned int hashent = hashfn(sb, id, type);
656 struct dquot *dquot, *empty = NODQUOT;
657
658 if (!sb_has_quota_enabled(sb, type))
659 return NODQUOT;
660we_slept:
661 spin_lock(&dq_list_lock);
662 if ((dquot = find_dquot(hashent, sb, id, type)) == NODQUOT) {
663 if (empty == NODQUOT) {
664 spin_unlock(&dq_list_lock);
665 if ((empty = get_empty_dquot(sb, type)) == NODQUOT)
666 schedule();
667 goto we_slept;
668 }
669 dquot = empty;
670 dquot->dq_id = id;
671
672 put_inuse(dquot);
673
674 insert_dquot_hash(dquot);
675 dqstats.lookups++;
676 spin_unlock(&dq_list_lock);
677 } else {
678 if (!atomic_read(&dquot->dq_count))
679 remove_free_dquot(dquot);
680 atomic_inc(&dquot->dq_count);
681 dqstats.cache_hits++;
682 dqstats.lookups++;
683 spin_unlock(&dq_list_lock);
684 if (empty)
685 kmem_cache_free(dquot_cachep, empty);
686 }
687
688
689 wait_on_dquot(dquot);
690
691 if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && sb->dq_op->acquire_dquot(dquot) < 0) {
692 dqput(dquot);
693 return NODQUOT;
694 }
695#ifdef __DQUOT_PARANOIA
696 BUG_ON(!dquot->dq_sb);
697#endif
698
699 return dquot;
700}
701
702static int dqinit_needed(struct inode *inode, int type)
703{
704 int cnt;
705
706 if (IS_NOQUOTA(inode))
707 return 0;
708 if (type != -1)
709 return inode->i_dquot[type] == NODQUOT;
710 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
711 if (inode->i_dquot[cnt] == NODQUOT)
712 return 1;
713 return 0;
714}
715
716
717static void add_dquot_ref(struct super_block *sb, int type)
718{
719 struct inode *inode, *old_inode = NULL;
720
721 spin_lock(&inode_lock);
722 list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
723 if (!atomic_read(&inode->i_writecount))
724 continue;
725 if (!dqinit_needed(inode, type))
726 continue;
727 if (inode->i_state & (I_FREEING|I_WILL_FREE))
728 continue;
729
730 __iget(inode);
731 spin_unlock(&inode_lock);
732
733 iput(old_inode);
734 sb->dq_op->initialize(inode, type);
735
736
737
738
739
740 old_inode = inode;
741 spin_lock(&inode_lock);
742 }
743 spin_unlock(&inode_lock);
744 iput(old_inode);
745}
746
747
748static inline int dqput_blocks(struct dquot *dquot)
749{
750 if (atomic_read(&dquot->dq_count) <= 1)
751 return 1;
752 return 0;
753}
754
755
756
757static int remove_inode_dquot_ref(struct inode *inode, int type,
758 struct list_head *tofree_head)
759{
760 struct dquot *dquot = inode->i_dquot[type];
761
762 inode->i_dquot[type] = NODQUOT;
763 if (dquot != NODQUOT) {
764 if (dqput_blocks(dquot)) {
765#ifdef __DQUOT_PARANOIA
766 if (atomic_read(&dquot->dq_count) != 1)
767 printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count));
768#endif
769 spin_lock(&dq_list_lock);
770 list_add(&dquot->dq_free, tofree_head);
771 spin_unlock(&dq_list_lock);
772 return 1;
773 }
774 else
775 dqput(dquot);
776 }
777 return 0;
778}
779
780
781
782static void put_dquot_list(struct list_head *tofree_head)
783{
784 struct list_head *act_head;
785 struct dquot *dquot;
786
787 act_head = tofree_head->next;
788
789 while (act_head != tofree_head) {
790 dquot = list_entry(act_head, struct dquot, dq_free);
791 act_head = act_head->next;
792 list_del_init(&dquot->dq_free);
793 dqput(dquot);
794 }
795}
796
797static void remove_dquot_ref(struct super_block *sb, int type,
798 struct list_head *tofree_head)
799{
800 struct inode *inode;
801
802 spin_lock(&inode_lock);
803 list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
804 if (!IS_NOQUOTA(inode))
805 remove_inode_dquot_ref(inode, type, tofree_head);
806 }
807 spin_unlock(&inode_lock);
808}
809
810
811static void drop_dquot_ref(struct super_block *sb, int type)
812{
813 LIST_HEAD(tofree_head);
814
815 if (sb->dq_op) {
816 down_write(&sb_dqopt(sb)->dqptr_sem);
817 remove_dquot_ref(sb, type, &tofree_head);
818 up_write(&sb_dqopt(sb)->dqptr_sem);
819 put_dquot_list(&tofree_head);
820 }
821}
822
823static inline void dquot_incr_inodes(struct dquot *dquot, unsigned long number)
824{
825 dquot->dq_dqb.dqb_curinodes += number;
826}
827
828static inline void dquot_incr_space(struct dquot *dquot, qsize_t number)
829{
830 dquot->dq_dqb.dqb_curspace += number;
831}
832
833static inline void dquot_decr_inodes(struct dquot *dquot, unsigned long number)
834{
835 if (dquot->dq_dqb.dqb_curinodes > number)
836 dquot->dq_dqb.dqb_curinodes -= number;
837 else
838 dquot->dq_dqb.dqb_curinodes = 0;
839 if (dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit)
840 dquot->dq_dqb.dqb_itime = (time_t) 0;
841 clear_bit(DQ_INODES_B, &dquot->dq_flags);
842}
843
844static inline void dquot_decr_space(struct dquot *dquot, qsize_t number)
845{
846 if (dquot->dq_dqb.dqb_curspace > number)
847 dquot->dq_dqb.dqb_curspace -= number;
848 else
849 dquot->dq_dqb.dqb_curspace = 0;
850 if (toqb(dquot->dq_dqb.dqb_curspace) <= dquot->dq_dqb.dqb_bsoftlimit)
851 dquot->dq_dqb.dqb_btime = (time_t) 0;
852 clear_bit(DQ_BLKS_B, &dquot->dq_flags);
853}
854
855static int warning_issued(struct dquot *dquot, const int warntype)
856{
857 int flag = (warntype == QUOTA_NL_BHARDWARN ||
858 warntype == QUOTA_NL_BSOFTLONGWARN) ? DQ_BLKS_B :
859 ((warntype == QUOTA_NL_IHARDWARN ||
860 warntype == QUOTA_NL_ISOFTLONGWARN) ? DQ_INODES_B : 0);
861
862 if (!flag)
863 return 0;
864 return test_and_set_bit(flag, &dquot->dq_flags);
865}
866
867#ifdef CONFIG_PRINT_QUOTA_WARNING
868static int flag_print_warnings = 1;
869
870static inline int need_print_warning(struct dquot *dquot)
871{
872 if (!flag_print_warnings)
873 return 0;
874
875 switch (dquot->dq_type) {
876 case USRQUOTA:
877 return current->fsuid == dquot->dq_id;
878 case GRPQUOTA:
879 return in_group_p(dquot->dq_id);
880 }
881 return 0;
882}
883
884
885static void print_warning(struct dquot *dquot, const int warntype)
886{
887 char *msg = NULL;
888 struct tty_struct *tty;
889
890 if (warntype == QUOTA_NL_IHARDBELOW ||
891 warntype == QUOTA_NL_ISOFTBELOW ||
892 warntype == QUOTA_NL_BHARDBELOW ||
893 warntype == QUOTA_NL_BSOFTBELOW || !need_print_warning(dquot))
894 return;
895
896 tty = get_current_tty();
897 if (!tty)
898 return;
899 tty_write_message(tty, dquot->dq_sb->s_id);
900 if (warntype == QUOTA_NL_ISOFTWARN || warntype == QUOTA_NL_BSOFTWARN)
901 tty_write_message(tty, ": warning, ");
902 else
903 tty_write_message(tty, ": write failed, ");
904 tty_write_message(tty, quotatypes[dquot->dq_type]);
905 switch (warntype) {
906 case QUOTA_NL_IHARDWARN:
907 msg = " file limit reached.\r\n";
908 break;
909 case QUOTA_NL_ISOFTLONGWARN:
910 msg = " file quota exceeded too long.\r\n";
911 break;
912 case QUOTA_NL_ISOFTWARN:
913 msg = " file quota exceeded.\r\n";
914 break;
915 case QUOTA_NL_BHARDWARN:
916 msg = " block limit reached.\r\n";
917 break;
918 case QUOTA_NL_BSOFTLONGWARN:
919 msg = " block quota exceeded too long.\r\n";
920 break;
921 case QUOTA_NL_BSOFTWARN:
922 msg = " block quota exceeded.\r\n";
923 break;
924 }
925 tty_write_message(tty, msg);
926 tty_kref_put(tty);
927}
928#endif
929
930#ifdef CONFIG_QUOTA_NETLINK_INTERFACE
931
932
933static struct genl_family quota_genl_family = {
934 .id = GENL_ID_GENERATE,
935 .hdrsize = 0,
936 .name = "VFS_DQUOT",
937 .version = 1,
938 .maxattr = QUOTA_NL_A_MAX,
939};
940
941
942static void send_warning(const struct dquot *dquot, const char warntype)
943{
944 static atomic_t seq;
945 struct sk_buff *skb;
946 void *msg_head;
947 int ret;
948 int msg_size = 4 * nla_total_size(sizeof(u32)) +
949 2 * nla_total_size(sizeof(u64));
950
951
952
953
954 skb = genlmsg_new(msg_size, GFP_NOFS);
955 if (!skb) {
956 printk(KERN_ERR
957 "VFS: Not enough memory to send quota warning.\n");
958 return;
959 }
960 msg_head = genlmsg_put(skb, 0, atomic_add_return(1, &seq),
961 "a_genl_family, 0, QUOTA_NL_C_WARNING);
962 if (!msg_head) {
963 printk(KERN_ERR
964 "VFS: Cannot store netlink header in quota warning.\n");
965 goto err_out;
966 }
967 ret = nla_put_u32(skb, QUOTA_NL_A_QTYPE, dquot->dq_type);
968 if (ret)
969 goto attr_err_out;
970 ret = nla_put_u64(skb, QUOTA_NL_A_EXCESS_ID, dquot->dq_id);
971 if (ret)
972 goto attr_err_out;
973 ret = nla_put_u32(skb, QUOTA_NL_A_WARNING, warntype);
974 if (ret)
975 goto attr_err_out;
976 ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MAJOR,
977 MAJOR(dquot->dq_sb->s_dev));
978 if (ret)
979 goto attr_err_out;
980 ret = nla_put_u32(skb, QUOTA_NL_A_DEV_MINOR,
981 MINOR(dquot->dq_sb->s_dev));
982 if (ret)
983 goto attr_err_out;
984 ret = nla_put_u64(skb, QUOTA_NL_A_CAUSED_ID, current->user->uid);
985 if (ret)
986 goto attr_err_out;
987 genlmsg_end(skb, msg_head);
988
989 ret = genlmsg_multicast(skb, 0, quota_genl_family.id, GFP_NOFS);
990 if (ret < 0 && ret != -ESRCH)
991 printk(KERN_ERR
992 "VFS: Failed to send notification message: %d\n", ret);
993 return;
994attr_err_out:
995 printk(KERN_ERR "VFS: Not enough space to compose quota message!\n");
996err_out:
997 kfree_skb(skb);
998}
999#endif
1000
1001static inline void flush_warnings(struct dquot * const *dquots, char *warntype)
1002{
1003 int i;
1004
1005 for (i = 0; i < MAXQUOTAS; i++)
1006 if (dquots[i] != NODQUOT && warntype[i] != QUOTA_NL_NOWARN &&
1007 !warning_issued(dquots[i], warntype[i])) {
1008#ifdef CONFIG_PRINT_QUOTA_WARNING
1009 print_warning(dquots[i], warntype[i]);
1010#endif
1011#ifdef CONFIG_QUOTA_NETLINK_INTERFACE
1012 send_warning(dquots[i], warntype[i]);
1013#endif
1014 }
1015}
1016
1017static inline char ignore_hardlimit(struct dquot *dquot)
1018{
1019 struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type];
1020
1021 return capable(CAP_SYS_RESOURCE) &&
1022 (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || !(info->dqi_flags & V1_DQF_RSQUASH));
1023}
1024
1025
1026static int check_idq(struct dquot *dquot, ulong inodes, char *warntype)
1027{
1028 *warntype = QUOTA_NL_NOWARN;
1029 if (inodes <= 0 || test_bit(DQ_FAKE_B, &dquot->dq_flags))
1030 return QUOTA_OK;
1031
1032 if (dquot->dq_dqb.dqb_ihardlimit &&
1033 (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_ihardlimit &&
1034 !ignore_hardlimit(dquot)) {
1035 *warntype = QUOTA_NL_IHARDWARN;
1036 return NO_QUOTA;
1037 }
1038
1039 if (dquot->dq_dqb.dqb_isoftlimit &&
1040 (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_isoftlimit &&
1041 dquot->dq_dqb.dqb_itime && get_seconds() >= dquot->dq_dqb.dqb_itime &&
1042 !ignore_hardlimit(dquot)) {
1043 *warntype = QUOTA_NL_ISOFTLONGWARN;
1044 return NO_QUOTA;
1045 }
1046
1047 if (dquot->dq_dqb.dqb_isoftlimit &&
1048 (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_isoftlimit &&
1049 dquot->dq_dqb.dqb_itime == 0) {
1050 *warntype = QUOTA_NL_ISOFTWARN;
1051 dquot->dq_dqb.dqb_itime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace;
1052 }
1053
1054 return QUOTA_OK;
1055}
1056
1057
1058static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *warntype)
1059{
1060 *warntype = QUOTA_NL_NOWARN;
1061 if (space <= 0 || test_bit(DQ_FAKE_B, &dquot->dq_flags))
1062 return QUOTA_OK;
1063
1064 if (dquot->dq_dqb.dqb_bhardlimit &&
1065 toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bhardlimit &&
1066 !ignore_hardlimit(dquot)) {
1067 if (!prealloc)
1068 *warntype = QUOTA_NL_BHARDWARN;
1069 return NO_QUOTA;
1070 }
1071
1072 if (dquot->dq_dqb.dqb_bsoftlimit &&
1073 toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bsoftlimit &&
1074 dquot->dq_dqb.dqb_btime && get_seconds() >= dquot->dq_dqb.dqb_btime &&
1075 !ignore_hardlimit(dquot)) {
1076 if (!prealloc)
1077 *warntype = QUOTA_NL_BSOFTLONGWARN;
1078 return NO_QUOTA;
1079 }
1080
1081 if (dquot->dq_dqb.dqb_bsoftlimit &&
1082 toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bsoftlimit &&
1083 dquot->dq_dqb.dqb_btime == 0) {
1084 if (!prealloc) {
1085 *warntype = QUOTA_NL_BSOFTWARN;
1086 dquot->dq_dqb.dqb_btime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_bgrace;
1087 }
1088 else
1089
1090
1091
1092
1093 return NO_QUOTA;
1094 }
1095
1096 return QUOTA_OK;
1097}
1098
1099static int info_idq_free(struct dquot *dquot, ulong inodes)
1100{
1101 if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
1102 dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit)
1103 return QUOTA_NL_NOWARN;
1104
1105 if (dquot->dq_dqb.dqb_curinodes - inodes <= dquot->dq_dqb.dqb_isoftlimit)
1106 return QUOTA_NL_ISOFTBELOW;
1107 if (dquot->dq_dqb.dqb_curinodes >= dquot->dq_dqb.dqb_ihardlimit &&
1108 dquot->dq_dqb.dqb_curinodes - inodes < dquot->dq_dqb.dqb_ihardlimit)
1109 return QUOTA_NL_IHARDBELOW;
1110 return QUOTA_NL_NOWARN;
1111}
1112
1113static int info_bdq_free(struct dquot *dquot, qsize_t space)
1114{
1115 if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
1116 toqb(dquot->dq_dqb.dqb_curspace) <= dquot->dq_dqb.dqb_bsoftlimit)
1117 return QUOTA_NL_NOWARN;
1118
1119 if (toqb(dquot->dq_dqb.dqb_curspace - space) <=
1120 dquot->dq_dqb.dqb_bsoftlimit)
1121 return QUOTA_NL_BSOFTBELOW;
1122 if (toqb(dquot->dq_dqb.dqb_curspace) >= dquot->dq_dqb.dqb_bhardlimit &&
1123 toqb(dquot->dq_dqb.dqb_curspace - space) <
1124 dquot->dq_dqb.dqb_bhardlimit)
1125 return QUOTA_NL_BHARDBELOW;
1126 return QUOTA_NL_NOWARN;
1127}
1128
1129
1130
1131
1132int dquot_initialize(struct inode *inode, int type)
1133{
1134 unsigned int id = 0;
1135 int cnt, ret = 0;
1136
1137
1138
1139 if (IS_NOQUOTA(inode))
1140 return 0;
1141 down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1142
1143 if (IS_NOQUOTA(inode))
1144 goto out_err;
1145 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1146 if (type != -1 && cnt != type)
1147 continue;
1148 if (inode->i_dquot[cnt] == NODQUOT) {
1149 switch (cnt) {
1150 case USRQUOTA:
1151 id = inode->i_uid;
1152 break;
1153 case GRPQUOTA:
1154 id = inode->i_gid;
1155 break;
1156 }
1157 inode->i_dquot[cnt] = dqget(inode->i_sb, id, cnt);
1158 }
1159 }
1160out_err:
1161 up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1162 return ret;
1163}
1164
1165
1166
1167
1168
1169int dquot_drop(struct inode *inode)
1170{
1171 int cnt;
1172
1173 down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1174 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1175 if (inode->i_dquot[cnt] != NODQUOT) {
1176 dqput(inode->i_dquot[cnt]);
1177 inode->i_dquot[cnt] = NODQUOT;
1178 }
1179 }
1180 up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1181 return 0;
1182}
1183
1184
1185void vfs_dq_drop(struct inode *inode)
1186{
1187
1188
1189
1190 if (!IS_NOQUOTA(inode) && inode->i_sb && inode->i_sb->dq_op
1191 && inode->i_sb->dq_op->drop) {
1192 int cnt;
1193
1194
1195
1196
1197
1198 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1199 if (inode->i_dquot[cnt] != NODQUOT)
1200 break;
1201 if (cnt < MAXQUOTAS)
1202 inode->i_sb->dq_op->drop(inode);
1203 }
1204}
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218int dquot_alloc_space(struct inode *inode, qsize_t number, int warn)
1219{
1220 int cnt, ret = NO_QUOTA;
1221 char warntype[MAXQUOTAS];
1222
1223
1224
1225 if (IS_NOQUOTA(inode)) {
1226out_add:
1227 inode_add_bytes(inode, number);
1228 return QUOTA_OK;
1229 }
1230 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1231 warntype[cnt] = QUOTA_NL_NOWARN;
1232
1233 down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1234 if (IS_NOQUOTA(inode)) {
1235 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1236 goto out_add;
1237 }
1238 spin_lock(&dq_data_lock);
1239 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1240 if (inode->i_dquot[cnt] == NODQUOT)
1241 continue;
1242 if (check_bdq(inode->i_dquot[cnt], number, warn, warntype+cnt) == NO_QUOTA)
1243 goto warn_put_all;
1244 }
1245 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1246 if (inode->i_dquot[cnt] == NODQUOT)
1247 continue;
1248 dquot_incr_space(inode->i_dquot[cnt], number);
1249 }
1250 inode_add_bytes(inode, number);
1251 ret = QUOTA_OK;
1252warn_put_all:
1253 spin_unlock(&dq_data_lock);
1254 if (ret == QUOTA_OK)
1255
1256 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1257 if (inode->i_dquot[cnt])
1258 mark_dquot_dirty(inode->i_dquot[cnt]);
1259 flush_warnings(inode->i_dquot, warntype);
1260 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1261 return ret;
1262}
1263
1264
1265
1266
1267int dquot_alloc_inode(const struct inode *inode, unsigned long number)
1268{
1269 int cnt, ret = NO_QUOTA;
1270 char warntype[MAXQUOTAS];
1271
1272
1273
1274 if (IS_NOQUOTA(inode))
1275 return QUOTA_OK;
1276 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1277 warntype[cnt] = QUOTA_NL_NOWARN;
1278 down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1279 if (IS_NOQUOTA(inode)) {
1280 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1281 return QUOTA_OK;
1282 }
1283 spin_lock(&dq_data_lock);
1284 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1285 if (inode->i_dquot[cnt] == NODQUOT)
1286 continue;
1287 if (check_idq(inode->i_dquot[cnt], number, warntype+cnt) == NO_QUOTA)
1288 goto warn_put_all;
1289 }
1290
1291 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1292 if (inode->i_dquot[cnt] == NODQUOT)
1293 continue;
1294 dquot_incr_inodes(inode->i_dquot[cnt], number);
1295 }
1296 ret = QUOTA_OK;
1297warn_put_all:
1298 spin_unlock(&dq_data_lock);
1299 if (ret == QUOTA_OK)
1300
1301 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1302 if (inode->i_dquot[cnt])
1303 mark_dquot_dirty(inode->i_dquot[cnt]);
1304 flush_warnings(inode->i_dquot, warntype);
1305 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1306 return ret;
1307}
1308
1309
1310
1311
1312int dquot_free_space(struct inode *inode, qsize_t number)
1313{
1314 unsigned int cnt;
1315 char warntype[MAXQUOTAS];
1316
1317
1318
1319 if (IS_NOQUOTA(inode)) {
1320out_sub:
1321 inode_sub_bytes(inode, number);
1322 return QUOTA_OK;
1323 }
1324
1325 down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1326
1327 if (IS_NOQUOTA(inode)) {
1328 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1329 goto out_sub;
1330 }
1331 spin_lock(&dq_data_lock);
1332 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1333 if (inode->i_dquot[cnt] == NODQUOT)
1334 continue;
1335 warntype[cnt] = info_bdq_free(inode->i_dquot[cnt], number);
1336 dquot_decr_space(inode->i_dquot[cnt], number);
1337 }
1338 inode_sub_bytes(inode, number);
1339 spin_unlock(&dq_data_lock);
1340
1341 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1342 if (inode->i_dquot[cnt])
1343 mark_dquot_dirty(inode->i_dquot[cnt]);
1344 flush_warnings(inode->i_dquot, warntype);
1345 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1346 return QUOTA_OK;
1347}
1348
1349
1350
1351
1352int dquot_free_inode(const struct inode *inode, unsigned long number)
1353{
1354 unsigned int cnt;
1355 char warntype[MAXQUOTAS];
1356
1357
1358
1359 if (IS_NOQUOTA(inode))
1360 return QUOTA_OK;
1361
1362 down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1363
1364 if (IS_NOQUOTA(inode)) {
1365 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1366 return QUOTA_OK;
1367 }
1368 spin_lock(&dq_data_lock);
1369 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1370 if (inode->i_dquot[cnt] == NODQUOT)
1371 continue;
1372 warntype[cnt] = info_idq_free(inode->i_dquot[cnt], number);
1373 dquot_decr_inodes(inode->i_dquot[cnt], number);
1374 }
1375 spin_unlock(&dq_data_lock);
1376
1377 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1378 if (inode->i_dquot[cnt])
1379 mark_dquot_dirty(inode->i_dquot[cnt]);
1380 flush_warnings(inode->i_dquot, warntype);
1381 up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1382 return QUOTA_OK;
1383}
1384
1385
1386
1387
1388
1389
1390
1391int dquot_transfer(struct inode *inode, struct iattr *iattr)
1392{
1393 qsize_t space;
1394 struct dquot *transfer_from[MAXQUOTAS];
1395 struct dquot *transfer_to[MAXQUOTAS];
1396 int cnt, ret = NO_QUOTA, chuid = (iattr->ia_valid & ATTR_UID) && inode->i_uid != iattr->ia_uid,
1397 chgid = (iattr->ia_valid & ATTR_GID) && inode->i_gid != iattr->ia_gid;
1398 char warntype_to[MAXQUOTAS];
1399 char warntype_from_inodes[MAXQUOTAS], warntype_from_space[MAXQUOTAS];
1400
1401
1402
1403 if (IS_NOQUOTA(inode))
1404 return QUOTA_OK;
1405
1406 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1407 transfer_to[cnt] = transfer_from[cnt] = NODQUOT;
1408 warntype_to[cnt] = QUOTA_NL_NOWARN;
1409 }
1410 down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1411
1412 if (IS_NOQUOTA(inode)) {
1413 up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1414 return QUOTA_OK;
1415 }
1416
1417
1418
1419 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1420 switch (cnt) {
1421 case USRQUOTA:
1422 if (!chuid)
1423 continue;
1424 transfer_to[cnt] = dqget(inode->i_sb, iattr->ia_uid, cnt);
1425 break;
1426 case GRPQUOTA:
1427 if (!chgid)
1428 continue;
1429 transfer_to[cnt] = dqget(inode->i_sb, iattr->ia_gid, cnt);
1430 break;
1431 }
1432 }
1433 spin_lock(&dq_data_lock);
1434 space = inode_get_bytes(inode);
1435
1436 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1437 if (transfer_to[cnt] == NODQUOT)
1438 continue;
1439 transfer_from[cnt] = inode->i_dquot[cnt];
1440 if (check_idq(transfer_to[cnt], 1, warntype_to + cnt) ==
1441 NO_QUOTA || check_bdq(transfer_to[cnt], space, 0,
1442 warntype_to + cnt) == NO_QUOTA)
1443 goto warn_put_all;
1444 }
1445
1446
1447
1448
1449 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1450
1451
1452
1453 if (transfer_to[cnt] == NODQUOT)
1454 continue;
1455
1456
1457 if (transfer_from[cnt]) {
1458 warntype_from_inodes[cnt] =
1459 info_idq_free(transfer_from[cnt], 1);
1460 warntype_from_space[cnt] =
1461 info_bdq_free(transfer_from[cnt], space);
1462 dquot_decr_inodes(transfer_from[cnt], 1);
1463 dquot_decr_space(transfer_from[cnt], space);
1464 }
1465
1466 dquot_incr_inodes(transfer_to[cnt], 1);
1467 dquot_incr_space(transfer_to[cnt], space);
1468
1469 inode->i_dquot[cnt] = transfer_to[cnt];
1470 }
1471 ret = QUOTA_OK;
1472warn_put_all:
1473 spin_unlock(&dq_data_lock);
1474
1475 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1476 if (transfer_from[cnt])
1477 mark_dquot_dirty(transfer_from[cnt]);
1478 if (transfer_to[cnt])
1479 mark_dquot_dirty(transfer_to[cnt]);
1480 }
1481 flush_warnings(transfer_to, warntype_to);
1482 flush_warnings(transfer_from, warntype_from_inodes);
1483 flush_warnings(transfer_from, warntype_from_space);
1484
1485 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1486 if (ret == QUOTA_OK && transfer_from[cnt] != NODQUOT)
1487 dqput(transfer_from[cnt]);
1488 if (ret == NO_QUOTA && transfer_to[cnt] != NODQUOT)
1489 dqput(transfer_to[cnt]);
1490 }
1491 up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1492 return ret;
1493}
1494
1495
1496int vfs_dq_transfer(struct inode *inode, struct iattr *iattr)
1497{
1498 if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) {
1499 vfs_dq_init(inode);
1500 if (inode->i_sb->dq_op->transfer(inode, iattr) == NO_QUOTA)
1501 return 1;
1502 }
1503 return 0;
1504}
1505
1506
1507
1508
1509
1510int dquot_commit_info(struct super_block *sb, int type)
1511{
1512 int ret;
1513 struct quota_info *dqopt = sb_dqopt(sb);
1514
1515 mutex_lock(&dqopt->dqio_mutex);
1516 ret = dqopt->ops[type]->write_file_info(sb, type);
1517 mutex_unlock(&dqopt->dqio_mutex);
1518 return ret;
1519}
1520
1521
1522
1523
1524struct dquot_operations dquot_operations = {
1525 .initialize = dquot_initialize,
1526 .drop = dquot_drop,
1527 .alloc_space = dquot_alloc_space,
1528 .alloc_inode = dquot_alloc_inode,
1529 .free_space = dquot_free_space,
1530 .free_inode = dquot_free_inode,
1531 .transfer = dquot_transfer,
1532 .write_dquot = dquot_commit,
1533 .acquire_dquot = dquot_acquire,
1534 .release_dquot = dquot_release,
1535 .mark_dirty = dquot_mark_dquot_dirty,
1536 .write_info = dquot_commit_info
1537};
1538
1539static inline void set_enable_flags(struct quota_info *dqopt, int type)
1540{
1541 switch (type) {
1542 case USRQUOTA:
1543 dqopt->flags |= DQUOT_USR_ENABLED;
1544 dqopt->flags &= ~DQUOT_USR_SUSPENDED;
1545 break;
1546 case GRPQUOTA:
1547 dqopt->flags |= DQUOT_GRP_ENABLED;
1548 dqopt->flags &= ~DQUOT_GRP_SUSPENDED;
1549 break;
1550 }
1551}
1552
1553static inline void reset_enable_flags(struct quota_info *dqopt, int type,
1554 int remount)
1555{
1556 switch (type) {
1557 case USRQUOTA:
1558 dqopt->flags &= ~DQUOT_USR_ENABLED;
1559 if (remount)
1560 dqopt->flags |= DQUOT_USR_SUSPENDED;
1561 else
1562 dqopt->flags &= ~DQUOT_USR_SUSPENDED;
1563 break;
1564 case GRPQUOTA:
1565 dqopt->flags &= ~DQUOT_GRP_ENABLED;
1566 if (remount)
1567 dqopt->flags |= DQUOT_GRP_SUSPENDED;
1568 else
1569 dqopt->flags &= ~DQUOT_GRP_SUSPENDED;
1570 break;
1571 }
1572}
1573
1574
1575
1576
1577
1578int vfs_quota_off(struct super_block *sb, int type, int remount)
1579{
1580 int cnt, ret = 0;
1581 struct quota_info *dqopt = sb_dqopt(sb);
1582 struct inode *toputinode[MAXQUOTAS];
1583
1584
1585 mutex_lock(&dqopt->dqonoff_mutex);
1586
1587
1588
1589
1590
1591
1592 if (!sb_any_quota_enabled(sb) && !sb_any_quota_suspended(sb)) {
1593 mutex_unlock(&dqopt->dqonoff_mutex);
1594 return 0;
1595 }
1596 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1597 toputinode[cnt] = NULL;
1598 if (type != -1 && cnt != type)
1599 continue;
1600
1601
1602 if (!remount && sb_has_quota_suspended(sb, cnt)) {
1603 iput(dqopt->files[cnt]);
1604 dqopt->files[cnt] = NULL;
1605 reset_enable_flags(dqopt, cnt, 0);
1606 continue;
1607 }
1608 if (!sb_has_quota_enabled(sb, cnt))
1609 continue;
1610 reset_enable_flags(dqopt, cnt, remount);
1611
1612
1613 drop_dquot_ref(sb, cnt);
1614 invalidate_dquots(sb, cnt);
1615
1616
1617
1618
1619 if (info_dirty(&dqopt->info[cnt]))
1620 sb->dq_op->write_info(sb, cnt);
1621 if (dqopt->ops[cnt]->free_file_info)
1622 dqopt->ops[cnt]->free_file_info(sb, cnt);
1623 put_quota_format(dqopt->info[cnt].dqi_format);
1624
1625 toputinode[cnt] = dqopt->files[cnt];
1626 if (!remount)
1627 dqopt->files[cnt] = NULL;
1628 dqopt->info[cnt].dqi_flags = 0;
1629 dqopt->info[cnt].dqi_igrace = 0;
1630 dqopt->info[cnt].dqi_bgrace = 0;
1631 dqopt->ops[cnt] = NULL;
1632 }
1633 mutex_unlock(&dqopt->dqonoff_mutex);
1634
1635
1636 if (sb->s_op->sync_fs)
1637 sb->s_op->sync_fs(sb, 1);
1638 sync_blockdev(sb->s_bdev);
1639
1640
1641
1642
1643
1644 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1645 if (toputinode[cnt]) {
1646 mutex_lock(&dqopt->dqonoff_mutex);
1647
1648
1649 if (!sb_has_quota_enabled(sb, cnt)) {
1650 mutex_lock_nested(&toputinode[cnt]->i_mutex, I_MUTEX_QUOTA);
1651 toputinode[cnt]->i_flags &= ~(S_IMMUTABLE |
1652 S_NOATIME | S_NOQUOTA);
1653 truncate_inode_pages(&toputinode[cnt]->i_data, 0);
1654 mutex_unlock(&toputinode[cnt]->i_mutex);
1655 mark_inode_dirty(toputinode[cnt]);
1656 }
1657 mutex_unlock(&dqopt->dqonoff_mutex);
1658
1659
1660
1661
1662 if (!remount)
1663 iput(toputinode[cnt]);
1664 else if (!toputinode[cnt]->i_nlink)
1665 ret = -EBUSY;
1666 }
1667 if (sb->s_bdev)
1668 invalidate_bdev(sb->s_bdev);
1669 return ret;
1670}
1671
1672
1673
1674
1675
1676
1677static int vfs_quota_on_inode(struct inode *inode, int type, int format_id)
1678{
1679 struct quota_format_type *fmt = find_quota_format(format_id);
1680 struct super_block *sb = inode->i_sb;
1681 struct quota_info *dqopt = sb_dqopt(sb);
1682 int error;
1683 int oldflags = -1;
1684
1685 if (!fmt)
1686 return -ESRCH;
1687 if (!S_ISREG(inode->i_mode)) {
1688 error = -EACCES;
1689 goto out_fmt;
1690 }
1691 if (IS_RDONLY(inode)) {
1692 error = -EROFS;
1693 goto out_fmt;
1694 }
1695 if (!sb->s_op->quota_write || !sb->s_op->quota_read) {
1696 error = -EINVAL;
1697 goto out_fmt;
1698 }
1699
1700
1701
1702 write_inode_now(inode, 1);
1703
1704 invalidate_bdev(sb->s_bdev);
1705 mutex_lock(&inode->i_mutex);
1706 mutex_lock(&dqopt->dqonoff_mutex);
1707 if (sb_has_quota_enabled(sb, type) ||
1708 sb_has_quota_suspended(sb, type)) {
1709 error = -EBUSY;
1710 goto out_lock;
1711 }
1712
1713
1714
1715 down_write(&dqopt->dqptr_sem);
1716 oldflags = inode->i_flags & (S_NOATIME | S_IMMUTABLE | S_NOQUOTA);
1717 inode->i_flags |= S_NOQUOTA | S_NOATIME | S_IMMUTABLE;
1718 up_write(&dqopt->dqptr_sem);
1719 sb->dq_op->drop(inode);
1720
1721 error = -EIO;
1722 dqopt->files[type] = igrab(inode);
1723 if (!dqopt->files[type])
1724 goto out_lock;
1725 error = -EINVAL;
1726 if (!fmt->qf_ops->check_quota_file(sb, type))
1727 goto out_file_init;
1728
1729 dqopt->ops[type] = fmt->qf_ops;
1730 dqopt->info[type].dqi_format = fmt;
1731 dqopt->info[type].dqi_fmt_id = format_id;
1732 INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
1733 mutex_lock(&dqopt->dqio_mutex);
1734 if ((error = dqopt->ops[type]->read_file_info(sb, type)) < 0) {
1735 mutex_unlock(&dqopt->dqio_mutex);
1736 goto out_file_init;
1737 }
1738 mutex_unlock(&dqopt->dqio_mutex);
1739 mutex_unlock(&inode->i_mutex);
1740 set_enable_flags(dqopt, type);
1741
1742 add_dquot_ref(sb, type);
1743 mutex_unlock(&dqopt->dqonoff_mutex);
1744
1745 return 0;
1746
1747out_file_init:
1748 dqopt->files[type] = NULL;
1749 iput(inode);
1750out_lock:
1751 mutex_unlock(&dqopt->dqonoff_mutex);
1752 if (oldflags != -1) {
1753 down_write(&dqopt->dqptr_sem);
1754
1755
1756 inode->i_flags &= ~(S_NOATIME | S_NOQUOTA | S_IMMUTABLE);
1757 inode->i_flags |= oldflags;
1758 up_write(&dqopt->dqptr_sem);
1759 }
1760 mutex_unlock(&inode->i_mutex);
1761out_fmt:
1762 put_quota_format(fmt);
1763
1764 return error;
1765}
1766
1767
1768static int vfs_quota_on_remount(struct super_block *sb, int type)
1769{
1770 struct quota_info *dqopt = sb_dqopt(sb);
1771 struct inode *inode;
1772 int ret;
1773
1774 mutex_lock(&dqopt->dqonoff_mutex);
1775 if (!sb_has_quota_suspended(sb, type)) {
1776 mutex_unlock(&dqopt->dqonoff_mutex);
1777 return 0;
1778 }
1779 BUG_ON(sb_has_quota_enabled(sb, type));
1780
1781 inode = dqopt->files[type];
1782 dqopt->files[type] = NULL;
1783 reset_enable_flags(dqopt, type, 0);
1784 mutex_unlock(&dqopt->dqonoff_mutex);
1785
1786 ret = vfs_quota_on_inode(inode, type, dqopt->info[type].dqi_fmt_id);
1787 iput(inode);
1788
1789 return ret;
1790}
1791
1792int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
1793 struct path *path)
1794{
1795 int error = security_quota_on(path->dentry);
1796 if (error)
1797 return error;
1798
1799 if (path->mnt->mnt_sb != sb)
1800 error = -EXDEV;
1801 else
1802 error = vfs_quota_on_inode(path->dentry->d_inode, type,
1803 format_id);
1804 return error;
1805}
1806
1807
1808int vfs_quota_on(struct super_block *sb, int type, int format_id, char *name,
1809 int remount)
1810{
1811 struct path path;
1812 int error;
1813
1814 if (remount)
1815 return vfs_quota_on_remount(sb, type);
1816
1817 error = kern_path(name, LOOKUP_FOLLOW, &path);
1818 if (!error) {
1819 error = vfs_quota_on_path(sb, type, format_id, &path);
1820 path_put(&path);
1821 }
1822 return error;
1823}
1824
1825
1826
1827
1828
1829int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
1830 int format_id, int type)
1831{
1832 struct dentry *dentry;
1833 int error;
1834
1835 dentry = lookup_one_len(qf_name, sb->s_root, strlen(qf_name));
1836 if (IS_ERR(dentry))
1837 return PTR_ERR(dentry);
1838
1839 if (!dentry->d_inode) {
1840 error = -ENOENT;
1841 goto out;
1842 }
1843
1844 error = security_quota_on(dentry);
1845 if (!error)
1846 error = vfs_quota_on_inode(dentry->d_inode, type, format_id);
1847
1848out:
1849 dput(dentry);
1850 return error;
1851}
1852
1853
1854int vfs_dq_quota_on_remount(struct super_block *sb)
1855{
1856 int cnt;
1857 int ret = 0, err;
1858
1859 if (!sb->s_qcop || !sb->s_qcop->quota_on)
1860 return -ENOSYS;
1861 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1862 err = sb->s_qcop->quota_on(sb, cnt, 0, NULL, 1);
1863 if (err < 0 && !ret)
1864 ret = err;
1865 }
1866 return ret;
1867}
1868
1869
1870static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di)
1871{
1872 struct mem_dqblk *dm = &dquot->dq_dqb;
1873
1874 spin_lock(&dq_data_lock);
1875 di->dqb_bhardlimit = dm->dqb_bhardlimit;
1876 di->dqb_bsoftlimit = dm->dqb_bsoftlimit;
1877 di->dqb_curspace = dm->dqb_curspace;
1878 di->dqb_ihardlimit = dm->dqb_ihardlimit;
1879 di->dqb_isoftlimit = dm->dqb_isoftlimit;
1880 di->dqb_curinodes = dm->dqb_curinodes;
1881 di->dqb_btime = dm->dqb_btime;
1882 di->dqb_itime = dm->dqb_itime;
1883 di->dqb_valid = QIF_ALL;
1884 spin_unlock(&dq_data_lock);
1885}
1886
1887int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
1888{
1889 struct dquot *dquot;
1890
1891 mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1892 if (!(dquot = dqget(sb, id, type))) {
1893 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1894 return -ESRCH;
1895 }
1896 do_get_dqblk(dquot, di);
1897 dqput(dquot);
1898 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1899 return 0;
1900}
1901
1902
1903static int do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
1904{
1905 struct mem_dqblk *dm = &dquot->dq_dqb;
1906 int check_blim = 0, check_ilim = 0;
1907 struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type];
1908
1909 if ((di->dqb_valid & QIF_BLIMITS &&
1910 (di->dqb_bhardlimit > dqi->dqi_maxblimit ||
1911 di->dqb_bsoftlimit > dqi->dqi_maxblimit)) ||
1912 (di->dqb_valid & QIF_ILIMITS &&
1913 (di->dqb_ihardlimit > dqi->dqi_maxilimit ||
1914 di->dqb_isoftlimit > dqi->dqi_maxilimit)))
1915 return -ERANGE;
1916
1917 spin_lock(&dq_data_lock);
1918 if (di->dqb_valid & QIF_SPACE) {
1919 dm->dqb_curspace = di->dqb_curspace;
1920 check_blim = 1;
1921 }
1922 if (di->dqb_valid & QIF_BLIMITS) {
1923 dm->dqb_bsoftlimit = di->dqb_bsoftlimit;
1924 dm->dqb_bhardlimit = di->dqb_bhardlimit;
1925 check_blim = 1;
1926 }
1927 if (di->dqb_valid & QIF_INODES) {
1928 dm->dqb_curinodes = di->dqb_curinodes;
1929 check_ilim = 1;
1930 }
1931 if (di->dqb_valid & QIF_ILIMITS) {
1932 dm->dqb_isoftlimit = di->dqb_isoftlimit;
1933 dm->dqb_ihardlimit = di->dqb_ihardlimit;
1934 check_ilim = 1;
1935 }
1936 if (di->dqb_valid & QIF_BTIME)
1937 dm->dqb_btime = di->dqb_btime;
1938 if (di->dqb_valid & QIF_ITIME)
1939 dm->dqb_itime = di->dqb_itime;
1940
1941 if (check_blim) {
1942 if (!dm->dqb_bsoftlimit || toqb(dm->dqb_curspace) < dm->dqb_bsoftlimit) {
1943 dm->dqb_btime = 0;
1944 clear_bit(DQ_BLKS_B, &dquot->dq_flags);
1945 }
1946 else if (!(di->dqb_valid & QIF_BTIME))
1947 dm->dqb_btime = get_seconds() + dqi->dqi_bgrace;
1948 }
1949 if (check_ilim) {
1950 if (!dm->dqb_isoftlimit || dm->dqb_curinodes < dm->dqb_isoftlimit) {
1951 dm->dqb_itime = 0;
1952 clear_bit(DQ_INODES_B, &dquot->dq_flags);
1953 }
1954 else if (!(di->dqb_valid & QIF_ITIME))
1955 dm->dqb_itime = get_seconds() + dqi->dqi_igrace;
1956 }
1957 if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit)
1958 clear_bit(DQ_FAKE_B, &dquot->dq_flags);
1959 else
1960 set_bit(DQ_FAKE_B, &dquot->dq_flags);
1961 spin_unlock(&dq_data_lock);
1962 mark_dquot_dirty(dquot);
1963
1964 return 0;
1965}
1966
1967int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
1968{
1969 struct dquot *dquot;
1970 int rc;
1971
1972 mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1973 if (!(dquot = dqget(sb, id, type))) {
1974 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1975 return -ESRCH;
1976 }
1977 rc = do_set_dqblk(dquot, di);
1978 dqput(dquot);
1979 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1980 return rc;
1981}
1982
1983
1984int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii)
1985{
1986 struct mem_dqinfo *mi;
1987
1988 mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1989 if (!sb_has_quota_enabled(sb, type)) {
1990 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1991 return -ESRCH;
1992 }
1993 mi = sb_dqopt(sb)->info + type;
1994 spin_lock(&dq_data_lock);
1995 ii->dqi_bgrace = mi->dqi_bgrace;
1996 ii->dqi_igrace = mi->dqi_igrace;
1997 ii->dqi_flags = mi->dqi_flags & DQF_MASK;
1998 ii->dqi_valid = IIF_ALL;
1999 spin_unlock(&dq_data_lock);
2000 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
2001 return 0;
2002}
2003
2004
2005int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii)
2006{
2007 struct mem_dqinfo *mi;
2008
2009 mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
2010 if (!sb_has_quota_enabled(sb, type)) {
2011 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
2012 return -ESRCH;
2013 }
2014 mi = sb_dqopt(sb)->info + type;
2015 spin_lock(&dq_data_lock);
2016 if (ii->dqi_valid & IIF_BGRACE)
2017 mi->dqi_bgrace = ii->dqi_bgrace;
2018 if (ii->dqi_valid & IIF_IGRACE)
2019 mi->dqi_igrace = ii->dqi_igrace;
2020 if (ii->dqi_valid & IIF_FLAGS)
2021 mi->dqi_flags = (mi->dqi_flags & ~DQF_MASK) | (ii->dqi_flags & DQF_MASK);
2022 spin_unlock(&dq_data_lock);
2023 mark_info_dirty(sb, type);
2024
2025 sb->dq_op->write_info(sb, type);
2026 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
2027 return 0;
2028}
2029
2030struct quotactl_ops vfs_quotactl_ops = {
2031 .quota_on = vfs_quota_on,
2032 .quota_off = vfs_quota_off,
2033 .quota_sync = vfs_quota_sync,
2034 .get_info = vfs_get_dqinfo,
2035 .set_info = vfs_set_dqinfo,
2036 .get_dqblk = vfs_get_dqblk,
2037 .set_dqblk = vfs_set_dqblk
2038};
2039
2040static ctl_table fs_dqstats_table[] = {
2041 {
2042 .ctl_name = FS_DQ_LOOKUPS,
2043 .procname = "lookups",
2044 .data = &dqstats.lookups,
2045 .maxlen = sizeof(int),
2046 .mode = 0444,
2047 .proc_handler = &proc_dointvec,
2048 },
2049 {
2050 .ctl_name = FS_DQ_DROPS,
2051 .procname = "drops",
2052 .data = &dqstats.drops,
2053 .maxlen = sizeof(int),
2054 .mode = 0444,
2055 .proc_handler = &proc_dointvec,
2056 },
2057 {
2058 .ctl_name = FS_DQ_READS,
2059 .procname = "reads",
2060 .data = &dqstats.reads,
2061 .maxlen = sizeof(int),
2062 .mode = 0444,
2063 .proc_handler = &proc_dointvec,
2064 },
2065 {
2066 .ctl_name = FS_DQ_WRITES,
2067 .procname = "writes",
2068 .data = &dqstats.writes,
2069 .maxlen = sizeof(int),
2070 .mode = 0444,
2071 .proc_handler = &proc_dointvec,
2072 },
2073 {
2074 .ctl_name = FS_DQ_CACHE_HITS,
2075 .procname = "cache_hits",
2076 .data = &dqstats.cache_hits,
2077 .maxlen = sizeof(int),
2078 .mode = 0444,
2079 .proc_handler = &proc_dointvec,
2080 },
2081 {
2082 .ctl_name = FS_DQ_ALLOCATED,
2083 .procname = "allocated_dquots",
2084 .data = &dqstats.allocated_dquots,
2085 .maxlen = sizeof(int),
2086 .mode = 0444,
2087 .proc_handler = &proc_dointvec,
2088 },
2089 {
2090 .ctl_name = FS_DQ_FREE,
2091 .procname = "free_dquots",
2092 .data = &dqstats.free_dquots,
2093 .maxlen = sizeof(int),
2094 .mode = 0444,
2095 .proc_handler = &proc_dointvec,
2096 },
2097 {
2098 .ctl_name = FS_DQ_SYNCS,
2099 .procname = "syncs",
2100 .data = &dqstats.syncs,
2101 .maxlen = sizeof(int),
2102 .mode = 0444,
2103 .proc_handler = &proc_dointvec,
2104 },
2105#ifdef CONFIG_PRINT_QUOTA_WARNING
2106 {
2107 .ctl_name = FS_DQ_WARNINGS,
2108 .procname = "warnings",
2109 .data = &flag_print_warnings,
2110 .maxlen = sizeof(int),
2111 .mode = 0644,
2112 .proc_handler = &proc_dointvec,
2113 },
2114#endif
2115 { .ctl_name = 0 },
2116};
2117
2118static ctl_table fs_table[] = {
2119 {
2120 .ctl_name = FS_DQSTATS,
2121 .procname = "quota",
2122 .mode = 0555,
2123 .child = fs_dqstats_table,
2124 },
2125 { .ctl_name = 0 },
2126};
2127
2128static ctl_table sys_table[] = {
2129 {
2130 .ctl_name = CTL_FS,
2131 .procname = "fs",
2132 .mode = 0555,
2133 .child = fs_table,
2134 },
2135 { .ctl_name = 0 },
2136};
2137
2138static int __init dquot_init(void)
2139{
2140 int i;
2141 unsigned long nr_hash, order;
2142
2143 printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__);
2144
2145 register_sysctl_table(sys_table);
2146
2147 dquot_cachep = kmem_cache_create("dquot",
2148 sizeof(struct dquot), sizeof(unsigned long) * 4,
2149 (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
2150 SLAB_MEM_SPREAD|SLAB_PANIC),
2151 NULL);
2152
2153 order = 0;
2154 dquot_hash = (struct hlist_head *)__get_free_pages(GFP_ATOMIC, order);
2155 if (!dquot_hash)
2156 panic("Cannot create dquot hash table");
2157
2158
2159 nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head);
2160 dq_hash_bits = 0;
2161 do {
2162 dq_hash_bits++;
2163 } while (nr_hash >> dq_hash_bits);
2164 dq_hash_bits--;
2165
2166 nr_hash = 1UL << dq_hash_bits;
2167 dq_hash_mask = nr_hash - 1;
2168 for (i = 0; i < nr_hash; i++)
2169 INIT_HLIST_HEAD(dquot_hash + i);
2170
2171 printk("Dquot-cache hash table entries: %ld (order %ld, %ld bytes)\n",
2172 nr_hash, order, (PAGE_SIZE << order));
2173
2174 register_shrinker(&dqcache_shrinker);
2175
2176#ifdef CONFIG_QUOTA_NETLINK_INTERFACE
2177 if (genl_register_family("a_genl_family) != 0)
2178 printk(KERN_ERR "VFS: Failed to create quota netlink interface.\n");
2179#endif
2180
2181 return 0;
2182}
2183module_init(dquot_init);
2184
2185EXPORT_SYMBOL(register_quota_format);
2186EXPORT_SYMBOL(unregister_quota_format);
2187EXPORT_SYMBOL(dqstats);
2188EXPORT_SYMBOL(dq_data_lock);
2189EXPORT_SYMBOL(vfs_quota_on);
2190EXPORT_SYMBOL(vfs_quota_on_path);
2191EXPORT_SYMBOL(vfs_quota_on_mount);
2192EXPORT_SYMBOL(vfs_quota_off);
2193EXPORT_SYMBOL(vfs_quota_sync);
2194EXPORT_SYMBOL(vfs_get_dqinfo);
2195EXPORT_SYMBOL(vfs_set_dqinfo);
2196EXPORT_SYMBOL(vfs_get_dqblk);
2197EXPORT_SYMBOL(vfs_set_dqblk);
2198EXPORT_SYMBOL(dquot_commit);
2199EXPORT_SYMBOL(dquot_commit_info);
2200EXPORT_SYMBOL(dquot_acquire);
2201EXPORT_SYMBOL(dquot_release);
2202EXPORT_SYMBOL(dquot_mark_dquot_dirty);
2203EXPORT_SYMBOL(dquot_initialize);
2204EXPORT_SYMBOL(dquot_drop);
2205EXPORT_SYMBOL(vfs_dq_drop);
2206EXPORT_SYMBOL(dquot_alloc_space);
2207EXPORT_SYMBOL(dquot_alloc_inode);
2208EXPORT_SYMBOL(dquot_free_space);
2209EXPORT_SYMBOL(dquot_free_inode);
2210EXPORT_SYMBOL(dquot_transfer);
2211EXPORT_SYMBOL(vfs_dq_transfer);
2212EXPORT_SYMBOL(vfs_dq_quota_on_remount);
2213