quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
[firefly-linux-kernel-4.4.55.git] / fs / quota / quota.c
1 /*
2  * Quota code necessary even when VFS quota support is not compiled
3  * into the kernel.  The interesting stuff is over in dquot.c, here
4  * we have symbols for initial quotactl(2) handling, the sysctl(2)
5  * variables, etc - things needed even when quota support disabled.
6  */
7
8 #include <linux/fs.h>
9 #include <linux/namei.h>
10 #include <linux/slab.h>
11 #include <asm/current.h>
12 #include <linux/uaccess.h>
13 #include <linux/kernel.h>
14 #include <linux/security.h>
15 #include <linux/syscalls.h>
16 #include <linux/capability.h>
17 #include <linux/quotaops.h>
18 #include <linux/types.h>
19 #include <linux/writeback.h>
20
21 static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
22                                      qid_t id)
23 {
24         switch (cmd) {
25         /* these commands do not require any special privilegues */
26         case Q_GETFMT:
27         case Q_SYNC:
28         case Q_GETINFO:
29         case Q_XGETQSTAT:
30         case Q_XGETQSTATV:
31         case Q_XQUOTASYNC:
32                 break;
33         /* allow to query information for dquots we "own" */
34         case Q_GETQUOTA:
35         case Q_XGETQUOTA:
36                 if ((type == USRQUOTA && uid_eq(current_euid(), make_kuid(current_user_ns(), id))) ||
37                     (type == GRPQUOTA && in_egroup_p(make_kgid(current_user_ns(), id))))
38                         break;
39                 /*FALLTHROUGH*/
40         default:
41                 if (!capable(CAP_SYS_ADMIN))
42                         return -EPERM;
43         }
44
45         return security_quotactl(cmd, type, id, sb);
46 }
47
48 static void quota_sync_one(struct super_block *sb, void *arg)
49 {
50         int type = *(int *)arg;
51
52         if (sb->s_qcop && sb->s_qcop->quota_sync &&
53             (sb->s_quota_types & (1 << type)))
54                 sb->s_qcop->quota_sync(sb, type);
55 }
56
57 static int quota_sync_all(int type)
58 {
59         int ret;
60
61         if (type >= MAXQUOTAS)
62                 return -EINVAL;
63         ret = security_quotactl(Q_SYNC, type, 0, NULL);
64         if (!ret)
65                 iterate_supers(quota_sync_one, &type);
66         return ret;
67 }
68
69 unsigned int qtype_enforce_flag(int type)
70 {
71         switch (type) {
72         case USRQUOTA:
73                 return FS_QUOTA_UDQ_ENFD;
74         case GRPQUOTA:
75                 return FS_QUOTA_GDQ_ENFD;
76         case PRJQUOTA:
77                 return FS_QUOTA_PDQ_ENFD;
78         }
79         return 0;
80 }
81
82 static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
83                          struct path *path)
84 {
85         if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_enable)
86                 return -ENOSYS;
87         if (sb->s_qcop->quota_enable)
88                 return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type));
89         if (IS_ERR(path))
90                 return PTR_ERR(path);
91         return sb->s_qcop->quota_on(sb, type, id, path);
92 }
93
94 static int quota_quotaoff(struct super_block *sb, int type)
95 {
96         if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable)
97                 return -ENOSYS;
98         if (sb->s_qcop->quota_disable)
99                 return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type));
100         return sb->s_qcop->quota_off(sb, type);
101 }
102
103 static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
104 {
105         __u32 fmt;
106
107         mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
108         if (!sb_has_quota_active(sb, type)) {
109                 mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
110                 return -ESRCH;
111         }
112         fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id;
113         mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
114         if (copy_to_user(addr, &fmt, sizeof(fmt)))
115                 return -EFAULT;
116         return 0;
117 }
118
119 static int quota_getinfo(struct super_block *sb, int type, void __user *addr)
120 {
121         struct qc_state state;
122         struct qc_type_state *tstate;
123         struct if_dqinfo uinfo;
124         int ret;
125
126         /* This checks whether qc_state has enough entries... */
127         BUILD_BUG_ON(MAXQUOTAS > XQM_MAXQUOTAS);
128         if (!sb->s_qcop->get_state)
129                 return -ENOSYS;
130         ret = sb->s_qcop->get_state(sb, &state);
131         if (ret)
132                 return ret;
133         tstate = state.s_state + type;
134         if (!(tstate->flags & QCI_ACCT_ENABLED))
135                 return -ESRCH;
136         memset(&uinfo, 0, sizeof(uinfo));
137         uinfo.dqi_bgrace = tstate->spc_timelimit;
138         uinfo.dqi_igrace = tstate->ino_timelimit;
139         if (tstate->flags & QCI_SYSFILE)
140                 uinfo.dqi_flags |= DQF_SYS_FILE;
141         if (tstate->flags & QCI_ROOT_SQUASH)
142                 uinfo.dqi_flags |= DQF_ROOT_SQUASH;
143         uinfo.dqi_valid = IIF_ALL;
144         if (!ret && copy_to_user(addr, &uinfo, sizeof(uinfo)))
145                 return -EFAULT;
146         return ret;
147 }
148
149 static int quota_setinfo(struct super_block *sb, int type, void __user *addr)
150 {
151         struct if_dqinfo info;
152
153         if (copy_from_user(&info, addr, sizeof(info)))
154                 return -EFAULT;
155         if (!sb->s_qcop->set_info)
156                 return -ENOSYS;
157         return sb->s_qcop->set_info(sb, type, &info);
158 }
159
160 static inline qsize_t qbtos(qsize_t blocks)
161 {
162         return blocks << QIF_DQBLKSIZE_BITS;
163 }
164
165 static inline qsize_t stoqb(qsize_t space)
166 {
167         return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS;
168 }
169
170 static void copy_to_if_dqblk(struct if_dqblk *dst, struct qc_dqblk *src)
171 {
172         memset(dst, 0, sizeof(*dst));
173         dst->dqb_bhardlimit = stoqb(src->d_spc_hardlimit);
174         dst->dqb_bsoftlimit = stoqb(src->d_spc_softlimit);
175         dst->dqb_curspace = src->d_space;
176         dst->dqb_ihardlimit = src->d_ino_hardlimit;
177         dst->dqb_isoftlimit = src->d_ino_softlimit;
178         dst->dqb_curinodes = src->d_ino_count;
179         dst->dqb_btime = src->d_spc_timer;
180         dst->dqb_itime = src->d_ino_timer;
181         dst->dqb_valid = QIF_ALL;
182 }
183
184 static int quota_getquota(struct super_block *sb, int type, qid_t id,
185                           void __user *addr)
186 {
187         struct kqid qid;
188         struct qc_dqblk fdq;
189         struct if_dqblk idq;
190         int ret;
191
192         if (!sb->s_qcop->get_dqblk)
193                 return -ENOSYS;
194         qid = make_kqid(current_user_ns(), type, id);
195         if (!qid_valid(qid))
196                 return -EINVAL;
197         ret = sb->s_qcop->get_dqblk(sb, qid, &fdq);
198         if (ret)
199                 return ret;
200         copy_to_if_dqblk(&idq, &fdq);
201         if (copy_to_user(addr, &idq, sizeof(idq)))
202                 return -EFAULT;
203         return 0;
204 }
205
206 static void copy_from_if_dqblk(struct qc_dqblk *dst, struct if_dqblk *src)
207 {
208         dst->d_spc_hardlimit = qbtos(src->dqb_bhardlimit);
209         dst->d_spc_softlimit = qbtos(src->dqb_bsoftlimit);
210         dst->d_space = src->dqb_curspace;
211         dst->d_ino_hardlimit = src->dqb_ihardlimit;
212         dst->d_ino_softlimit = src->dqb_isoftlimit;
213         dst->d_ino_count = src->dqb_curinodes;
214         dst->d_spc_timer = src->dqb_btime;
215         dst->d_ino_timer = src->dqb_itime;
216
217         dst->d_fieldmask = 0;
218         if (src->dqb_valid & QIF_BLIMITS)
219                 dst->d_fieldmask |= QC_SPC_SOFT | QC_SPC_HARD;
220         if (src->dqb_valid & QIF_SPACE)
221                 dst->d_fieldmask |= QC_SPACE;
222         if (src->dqb_valid & QIF_ILIMITS)
223                 dst->d_fieldmask |= QC_INO_SOFT | QC_INO_HARD;
224         if (src->dqb_valid & QIF_INODES)
225                 dst->d_fieldmask |= QC_INO_COUNT;
226         if (src->dqb_valid & QIF_BTIME)
227                 dst->d_fieldmask |= QC_SPC_TIMER;
228         if (src->dqb_valid & QIF_ITIME)
229                 dst->d_fieldmask |= QC_INO_TIMER;
230 }
231
232 static int quota_setquota(struct super_block *sb, int type, qid_t id,
233                           void __user *addr)
234 {
235         struct qc_dqblk fdq;
236         struct if_dqblk idq;
237         struct kqid qid;
238
239         if (copy_from_user(&idq, addr, sizeof(idq)))
240                 return -EFAULT;
241         if (!sb->s_qcop->set_dqblk)
242                 return -ENOSYS;
243         qid = make_kqid(current_user_ns(), type, id);
244         if (!qid_valid(qid))
245                 return -EINVAL;
246         copy_from_if_dqblk(&fdq, &idq);
247         return sb->s_qcop->set_dqblk(sb, qid, &fdq);
248 }
249
250 static int quota_enable(struct super_block *sb, void __user *addr)
251 {
252         __u32 flags;
253
254         if (copy_from_user(&flags, addr, sizeof(flags)))
255                 return -EFAULT;
256         if (!sb->s_qcop->quota_enable)
257                 return -ENOSYS;
258         return sb->s_qcop->quota_enable(sb, flags);
259 }
260
261 static int quota_disable(struct super_block *sb, void __user *addr)
262 {
263         __u32 flags;
264
265         if (copy_from_user(&flags, addr, sizeof(flags)))
266                 return -EFAULT;
267         if (!sb->s_qcop->quota_disable)
268                 return -ENOSYS;
269         return sb->s_qcop->quota_disable(sb, flags);
270 }
271
272 static int quota_state_to_flags(struct qc_state *state)
273 {
274         int flags = 0;
275
276         if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED)
277                 flags |= FS_QUOTA_UDQ_ACCT;
278         if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED)
279                 flags |= FS_QUOTA_UDQ_ENFD;
280         if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)
281                 flags |= FS_QUOTA_GDQ_ACCT;
282         if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED)
283                 flags |= FS_QUOTA_GDQ_ENFD;
284         if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED)
285                 flags |= FS_QUOTA_PDQ_ACCT;
286         if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED)
287                 flags |= FS_QUOTA_PDQ_ENFD;
288         return flags;
289 }
290
291 static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs)
292 {
293         int type;
294         struct qc_state state;
295         int ret;
296
297         ret = sb->s_qcop->get_state(sb, &state);
298         if (ret < 0)
299                 return ret;
300
301         memset(fqs, 0, sizeof(*fqs));
302         fqs->qs_version = FS_QSTAT_VERSION;
303         fqs->qs_flags = quota_state_to_flags(&state);
304         /* No quota enabled? */
305         if (!fqs->qs_flags)
306                 return -ENOSYS;
307         fqs->qs_incoredqs = state.s_incoredqs;
308         /*
309          * GETXSTATE quotactl has space for just one set of time limits so
310          * report them for the first enabled quota type
311          */
312         for (type = 0; type < XQM_MAXQUOTAS; type++)
313                 if (state.s_state[type].flags & QCI_ACCT_ENABLED)
314                         break;
315         BUG_ON(type == XQM_MAXQUOTAS);
316         fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
317         fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
318         fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
319         fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
320         fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
321         if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
322                 fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
323                 fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
324                 fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
325         }
326         if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
327                 fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
328                 fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
329                 fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
330         }
331         if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
332                 /*
333                  * Q_XGETQSTAT doesn't have room for both group and project
334                  * quotas.  So, allow the project quota values to be copied out
335                  * only if there is no group quota information available.
336                  */
337                 if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) {
338                         fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino;
339                         fqs->qs_gquota.qfs_nblks =
340                                         state.s_state[PRJQUOTA].blocks;
341                         fqs->qs_gquota.qfs_nextents =
342                                         state.s_state[PRJQUOTA].nextents;
343                 }
344         }
345         return 0;
346 }
347
348 static int quota_getxstate(struct super_block *sb, void __user *addr)
349 {
350         struct fs_quota_stat fqs;
351         int ret;
352
353         if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state)
354                 return -ENOSYS;
355         if (sb->s_qcop->get_state)
356                 ret = quota_getstate(sb, &fqs);
357         else
358                 ret = sb->s_qcop->get_xstate(sb, &fqs);
359         if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
360                 return -EFAULT;
361         return ret;
362 }
363
364 static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs)
365 {
366         int type;
367         struct qc_state state;
368         int ret;
369
370         ret = sb->s_qcop->get_state(sb, &state);
371         if (ret < 0)
372                 return ret;
373
374         memset(fqs, 0, sizeof(*fqs));
375         fqs->qs_version = FS_QSTAT_VERSION;
376         fqs->qs_flags = quota_state_to_flags(&state);
377         /* No quota enabled? */
378         if (!fqs->qs_flags)
379                 return -ENOSYS;
380         fqs->qs_incoredqs = state.s_incoredqs;
381         /*
382          * GETXSTATV quotactl has space for just one set of time limits so
383          * report them for the first enabled quota type
384          */
385         for (type = 0; type < XQM_MAXQUOTAS; type++)
386                 if (state.s_state[type].flags & QCI_ACCT_ENABLED)
387                         break;
388         BUG_ON(type == XQM_MAXQUOTAS);
389         fqs->qs_btimelimit = state.s_state[type].spc_timelimit;
390         fqs->qs_itimelimit = state.s_state[type].ino_timelimit;
391         fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit;
392         fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit;
393         fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit;
394         if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) {
395                 fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino;
396                 fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks;
397                 fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents;
398         }
399         if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) {
400                 fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino;
401                 fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks;
402                 fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents;
403         }
404         if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) {
405                 fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino;
406                 fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks;
407                 fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents;
408         }
409         return 0;
410 }
411
412 static int quota_getxstatev(struct super_block *sb, void __user *addr)
413 {
414         struct fs_quota_statv fqs;
415         int ret;
416
417         if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state)
418                 return -ENOSYS;
419
420         memset(&fqs, 0, sizeof(fqs));
421         if (copy_from_user(&fqs, addr, 1)) /* Just read qs_version */
422                 return -EFAULT;
423
424         /* If this kernel doesn't support user specified version, fail */
425         switch (fqs.qs_version) {
426         case FS_QSTATV_VERSION1:
427                 break;
428         default:
429                 return -EINVAL;
430         }
431         if (sb->s_qcop->get_state)
432                 ret = quota_getstatev(sb, &fqs);
433         else
434                 ret = sb->s_qcop->get_xstatev(sb, &fqs);
435         if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
436                 return -EFAULT;
437         return ret;
438 }
439
440 /*
441  * XFS defines BBTOB and BTOBB macros inside fs/xfs/ and we cannot move them
442  * out of there as xfsprogs rely on definitions being in that header file. So
443  * just define same functions here for quota purposes.
444  */
445 #define XFS_BB_SHIFT 9
446
447 static inline u64 quota_bbtob(u64 blocks)
448 {
449         return blocks << XFS_BB_SHIFT;
450 }
451
452 static inline u64 quota_btobb(u64 bytes)
453 {
454         return (bytes + (1 << XFS_BB_SHIFT) - 1) >> XFS_BB_SHIFT;
455 }
456
457 static void copy_from_xfs_dqblk(struct qc_dqblk *dst, struct fs_disk_quota *src)
458 {
459         dst->d_spc_hardlimit = quota_bbtob(src->d_blk_hardlimit);
460         dst->d_spc_softlimit = quota_bbtob(src->d_blk_softlimit);
461         dst->d_ino_hardlimit = src->d_ino_hardlimit;
462         dst->d_ino_softlimit = src->d_ino_softlimit;
463         dst->d_space = quota_bbtob(src->d_bcount);
464         dst->d_ino_count = src->d_icount;
465         dst->d_ino_timer = src->d_itimer;
466         dst->d_spc_timer = src->d_btimer;
467         dst->d_ino_warns = src->d_iwarns;
468         dst->d_spc_warns = src->d_bwarns;
469         dst->d_rt_spc_hardlimit = quota_bbtob(src->d_rtb_hardlimit);
470         dst->d_rt_spc_softlimit = quota_bbtob(src->d_rtb_softlimit);
471         dst->d_rt_space = quota_bbtob(src->d_rtbcount);
472         dst->d_rt_spc_timer = src->d_rtbtimer;
473         dst->d_rt_spc_warns = src->d_rtbwarns;
474         dst->d_fieldmask = 0;
475         if (src->d_fieldmask & FS_DQ_ISOFT)
476                 dst->d_fieldmask |= QC_INO_SOFT;
477         if (src->d_fieldmask & FS_DQ_IHARD)
478                 dst->d_fieldmask |= QC_INO_HARD;
479         if (src->d_fieldmask & FS_DQ_BSOFT)
480                 dst->d_fieldmask |= QC_SPC_SOFT;
481         if (src->d_fieldmask & FS_DQ_BHARD)
482                 dst->d_fieldmask |= QC_SPC_HARD;
483         if (src->d_fieldmask & FS_DQ_RTBSOFT)
484                 dst->d_fieldmask |= QC_RT_SPC_SOFT;
485         if (src->d_fieldmask & FS_DQ_RTBHARD)
486                 dst->d_fieldmask |= QC_RT_SPC_HARD;
487         if (src->d_fieldmask & FS_DQ_BTIMER)
488                 dst->d_fieldmask |= QC_SPC_TIMER;
489         if (src->d_fieldmask & FS_DQ_ITIMER)
490                 dst->d_fieldmask |= QC_INO_TIMER;
491         if (src->d_fieldmask & FS_DQ_RTBTIMER)
492                 dst->d_fieldmask |= QC_RT_SPC_TIMER;
493         if (src->d_fieldmask & FS_DQ_BWARNS)
494                 dst->d_fieldmask |= QC_SPC_WARNS;
495         if (src->d_fieldmask & FS_DQ_IWARNS)
496                 dst->d_fieldmask |= QC_INO_WARNS;
497         if (src->d_fieldmask & FS_DQ_RTBWARNS)
498                 dst->d_fieldmask |= QC_RT_SPC_WARNS;
499         if (src->d_fieldmask & FS_DQ_BCOUNT)
500                 dst->d_fieldmask |= QC_SPACE;
501         if (src->d_fieldmask & FS_DQ_ICOUNT)
502                 dst->d_fieldmask |= QC_INO_COUNT;
503         if (src->d_fieldmask & FS_DQ_RTBCOUNT)
504                 dst->d_fieldmask |= QC_RT_SPACE;
505 }
506
507 static int quota_setxquota(struct super_block *sb, int type, qid_t id,
508                            void __user *addr)
509 {
510         struct fs_disk_quota fdq;
511         struct qc_dqblk qdq;
512         struct kqid qid;
513
514         if (copy_from_user(&fdq, addr, sizeof(fdq)))
515                 return -EFAULT;
516         if (!sb->s_qcop->set_dqblk)
517                 return -ENOSYS;
518         qid = make_kqid(current_user_ns(), type, id);
519         if (!qid_valid(qid))
520                 return -EINVAL;
521         copy_from_xfs_dqblk(&qdq, &fdq);
522         return sb->s_qcop->set_dqblk(sb, qid, &qdq);
523 }
524
525 static void copy_to_xfs_dqblk(struct fs_disk_quota *dst, struct qc_dqblk *src,
526                               int type, qid_t id)
527 {
528         memset(dst, 0, sizeof(*dst));
529         dst->d_version = FS_DQUOT_VERSION;
530         dst->d_id = id;
531         if (type == USRQUOTA)
532                 dst->d_flags = FS_USER_QUOTA;
533         else if (type == PRJQUOTA)
534                 dst->d_flags = FS_PROJ_QUOTA;
535         else
536                 dst->d_flags = FS_GROUP_QUOTA;
537         dst->d_blk_hardlimit = quota_btobb(src->d_spc_hardlimit);
538         dst->d_blk_softlimit = quota_btobb(src->d_spc_softlimit);
539         dst->d_ino_hardlimit = src->d_ino_hardlimit;
540         dst->d_ino_softlimit = src->d_ino_softlimit;
541         dst->d_bcount = quota_btobb(src->d_space);
542         dst->d_icount = src->d_ino_count;
543         dst->d_itimer = src->d_ino_timer;
544         dst->d_btimer = src->d_spc_timer;
545         dst->d_iwarns = src->d_ino_warns;
546         dst->d_bwarns = src->d_spc_warns;
547         dst->d_rtb_hardlimit = quota_btobb(src->d_rt_spc_hardlimit);
548         dst->d_rtb_softlimit = quota_btobb(src->d_rt_spc_softlimit);
549         dst->d_rtbcount = quota_btobb(src->d_rt_space);
550         dst->d_rtbtimer = src->d_rt_spc_timer;
551         dst->d_rtbwarns = src->d_rt_spc_warns;
552 }
553
554 static int quota_getxquota(struct super_block *sb, int type, qid_t id,
555                            void __user *addr)
556 {
557         struct fs_disk_quota fdq;
558         struct qc_dqblk qdq;
559         struct kqid qid;
560         int ret;
561
562         if (!sb->s_qcop->get_dqblk)
563                 return -ENOSYS;
564         qid = make_kqid(current_user_ns(), type, id);
565         if (!qid_valid(qid))
566                 return -EINVAL;
567         ret = sb->s_qcop->get_dqblk(sb, qid, &qdq);
568         if (ret)
569                 return ret;
570         copy_to_xfs_dqblk(&fdq, &qdq, type, id);
571         if (copy_to_user(addr, &fdq, sizeof(fdq)))
572                 return -EFAULT;
573         return ret;
574 }
575
576 static int quota_rmxquota(struct super_block *sb, void __user *addr)
577 {
578         __u32 flags;
579
580         if (copy_from_user(&flags, addr, sizeof(flags)))
581                 return -EFAULT;
582         if (!sb->s_qcop->rm_xquota)
583                 return -ENOSYS;
584         return sb->s_qcop->rm_xquota(sb, flags);
585 }
586
587 /* Copy parameters and call proper function */
588 static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
589                        void __user *addr, struct path *path)
590 {
591         int ret;
592
593         if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS))
594                 return -EINVAL;
595         /*
596          * Quota not supported on this fs? Check this before s_quota_types
597          * since they needn't be set if quota is not supported at all.
598          */
599         if (!sb->s_qcop)
600                 return -ENOSYS;
601         if (!(sb->s_quota_types & (1 << type)))
602                 return -EINVAL;
603
604         ret = check_quotactl_permission(sb, type, cmd, id);
605         if (ret < 0)
606                 return ret;
607
608         switch (cmd) {
609         case Q_QUOTAON:
610                 return quota_quotaon(sb, type, cmd, id, path);
611         case Q_QUOTAOFF:
612                 return quota_quotaoff(sb, type);
613         case Q_GETFMT:
614                 return quota_getfmt(sb, type, addr);
615         case Q_GETINFO:
616                 return quota_getinfo(sb, type, addr);
617         case Q_SETINFO:
618                 return quota_setinfo(sb, type, addr);
619         case Q_GETQUOTA:
620                 return quota_getquota(sb, type, id, addr);
621         case Q_SETQUOTA:
622                 return quota_setquota(sb, type, id, addr);
623         case Q_SYNC:
624                 if (!sb->s_qcop->quota_sync)
625                         return -ENOSYS;
626                 return sb->s_qcop->quota_sync(sb, type);
627         case Q_XQUOTAON:
628                 return quota_enable(sb, addr);
629         case Q_XQUOTAOFF:
630                 return quota_disable(sb, addr);
631         case Q_XQUOTARM:
632                 return quota_rmxquota(sb, addr);
633         case Q_XGETQSTAT:
634                 return quota_getxstate(sb, addr);
635         case Q_XGETQSTATV:
636                 return quota_getxstatev(sb, addr);
637         case Q_XSETQLIM:
638                 return quota_setxquota(sb, type, id, addr);
639         case Q_XGETQUOTA:
640                 return quota_getxquota(sb, type, id, addr);
641         case Q_XQUOTASYNC:
642                 if (sb->s_flags & MS_RDONLY)
643                         return -EROFS;
644                 /* XFS quotas are fully coherent now, making this call a noop */
645                 return 0;
646         default:
647                 return -EINVAL;
648         }
649 }
650
651 #ifdef CONFIG_BLOCK
652
653 /* Return 1 if 'cmd' will block on frozen filesystem */
654 static int quotactl_cmd_write(int cmd)
655 {
656         switch (cmd) {
657         case Q_GETFMT:
658         case Q_GETINFO:
659         case Q_SYNC:
660         case Q_XGETQSTAT:
661         case Q_XGETQSTATV:
662         case Q_XGETQUOTA:
663         case Q_XQUOTASYNC:
664                 return 0;
665         }
666         return 1;
667 }
668
669 #endif /* CONFIG_BLOCK */
670
671 /*
672  * look up a superblock on which quota ops will be performed
673  * - use the name of a block device to find the superblock thereon
674  */
675 static struct super_block *quotactl_block(const char __user *special, int cmd)
676 {
677 #ifdef CONFIG_BLOCK
678         struct block_device *bdev;
679         struct super_block *sb;
680         struct filename *tmp = getname(special);
681
682         if (IS_ERR(tmp))
683                 return ERR_CAST(tmp);
684         bdev = lookup_bdev(tmp->name);
685         putname(tmp);
686         if (IS_ERR(bdev))
687                 return ERR_CAST(bdev);
688         if (quotactl_cmd_write(cmd))
689                 sb = get_super_thawed(bdev);
690         else
691                 sb = get_super(bdev);
692         bdput(bdev);
693         if (!sb)
694                 return ERR_PTR(-ENODEV);
695
696         return sb;
697 #else
698         return ERR_PTR(-ENODEV);
699 #endif
700 }
701
702 /*
703  * This is the system call interface. This communicates with
704  * the user-level programs. Currently this only supports diskquota
705  * calls. Maybe we need to add the process quotas etc. in the future,
706  * but we probably should use rlimits for that.
707  */
708 SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
709                 qid_t, id, void __user *, addr)
710 {
711         uint cmds, type;
712         struct super_block *sb = NULL;
713         struct path path, *pathp = NULL;
714         int ret;
715
716         cmds = cmd >> SUBCMDSHIFT;
717         type = cmd & SUBCMDMASK;
718
719         /*
720          * As a special case Q_SYNC can be called without a specific device.
721          * It will iterate all superblocks that have quota enabled and call
722          * the sync action on each of them.
723          */
724         if (!special) {
725                 if (cmds == Q_SYNC)
726                         return quota_sync_all(type);
727                 return -ENODEV;
728         }
729
730         /*
731          * Path for quotaon has to be resolved before grabbing superblock
732          * because that gets s_umount sem which is also possibly needed by path
733          * resolution (think about autofs) and thus deadlocks could arise.
734          */
735         if (cmds == Q_QUOTAON) {
736                 ret = user_path_at(AT_FDCWD, addr, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path);
737                 if (ret)
738                         pathp = ERR_PTR(ret);
739                 else
740                         pathp = &path;
741         }
742
743         sb = quotactl_block(special, cmds);
744         if (IS_ERR(sb)) {
745                 ret = PTR_ERR(sb);
746                 goto out;
747         }
748
749         ret = do_quotactl(sb, type, cmds, id, addr, pathp);
750
751         drop_super(sb);
752 out:
753         if (pathp && !IS_ERR(pathp))
754                 path_put(pathp);
755         return ret;
756 }