Linux Audio

Check our new training course

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