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, 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 (copy_to_user(addr, &uinfo, sizeof(uinfo))) 145 return -EFAULT; 146 return 0; 147 } 148 149 static 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 179 static inline qsize_t qbtos(qsize_t blocks) 180 { 181 return blocks << QIF_DQBLKSIZE_BITS; 182 } 183 184 static inline qsize_t stoqb(qsize_t space) 185 { 186 return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; 187 } 188 189 static 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 203 static 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 */ 229 static 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 253 static 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 279 static 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 297 static 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 308 static 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 319 static 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 338 static 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 395 static 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 408 static 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 456 static 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 488 static inline u64 quota_bbtob(u64 blocks) 489 { 490 return blocks << XFS_BB_SHIFT; 491 } 492 493 static inline u64 quota_btobb(u64 bytes) 494 { 495 return (bytes + (1 << XFS_BB_SHIFT) - 1) >> XFS_BB_SHIFT; 496 } 497 498 static 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 548 static 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 572 static 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 605 static 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 634 static 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 */ 660 static 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 684 static 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 */ 696 static 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 */ 766 static 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 */ 793 static 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 */ 826 SYSCALL_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); 870 out: 871 if (pathp && !IS_ERR(pathp)) 872 path_put(pathp); 873 return ret; 874 } 875