1 /* 2 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #include <linux/capability.h> 20 21 #include "xfs.h" 22 #include "xfs_fs.h" 23 #include "xfs_shared.h" 24 #include "xfs_format.h" 25 #include "xfs_log_format.h" 26 #include "xfs_trans_resv.h" 27 #include "xfs_bit.h" 28 #include "xfs_sb.h" 29 #include "xfs_mount.h" 30 #include "xfs_inode.h" 31 #include "xfs_trans.h" 32 #include "xfs_error.h" 33 #include "xfs_quota.h" 34 #include "xfs_qm.h" 35 #include "xfs_trace.h" 36 #include "xfs_icache.h" 37 38 STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); 39 STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, 40 uint); 41 STATIC uint xfs_qm_export_flags(uint); 42 43 /* 44 * Turn off quota accounting and/or enforcement for all udquots and/or 45 * gdquots. Called only at unmount time. 46 * 47 * This assumes that there are no dquots of this file system cached 48 * incore, and modifies the ondisk dquot directly. Therefore, for example, 49 * it is an error to call this twice, without purging the cache. 50 */ 51 int 52 xfs_qm_scall_quotaoff( 53 xfs_mount_t *mp, 54 uint flags) 55 { 56 struct xfs_quotainfo *q = mp->m_quotainfo; 57 uint dqtype; 58 int error; 59 uint inactivate_flags; 60 xfs_qoff_logitem_t *qoffstart; 61 62 /* 63 * No file system can have quotas enabled on disk but not in core. 64 * Note that quota utilities (like quotaoff) _expect_ 65 * errno == -EEXIST here. 66 */ 67 if ((mp->m_qflags & flags) == 0) 68 return -EEXIST; 69 error = 0; 70 71 flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); 72 73 /* 74 * We don't want to deal with two quotaoffs messing up each other, 75 * so we're going to serialize it. quotaoff isn't exactly a performance 76 * critical thing. 77 * If quotaoff, then we must be dealing with the root filesystem. 78 */ 79 ASSERT(q); 80 mutex_lock(&q->qi_quotaofflock); 81 82 /* 83 * If we're just turning off quota enforcement, change mp and go. 84 */ 85 if ((flags & XFS_ALL_QUOTA_ACCT) == 0) { 86 mp->m_qflags &= ~(flags); 87 88 spin_lock(&mp->m_sb_lock); 89 mp->m_sb.sb_qflags = mp->m_qflags; 90 spin_unlock(&mp->m_sb_lock); 91 mutex_unlock(&q->qi_quotaofflock); 92 93 /* XXX what to do if error ? Revert back to old vals incore ? */ 94 error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS); 95 return error; 96 } 97 98 dqtype = 0; 99 inactivate_flags = 0; 100 /* 101 * If accounting is off, we must turn enforcement off, clear the 102 * quota 'CHKD' certificate to make it known that we have to 103 * do a quotacheck the next time this quota is turned on. 104 */ 105 if (flags & XFS_UQUOTA_ACCT) { 106 dqtype |= XFS_QMOPT_UQUOTA; 107 flags |= (XFS_UQUOTA_CHKD | XFS_UQUOTA_ENFD); 108 inactivate_flags |= XFS_UQUOTA_ACTIVE; 109 } 110 if (flags & XFS_GQUOTA_ACCT) { 111 dqtype |= XFS_QMOPT_GQUOTA; 112 flags |= (XFS_GQUOTA_CHKD | XFS_GQUOTA_ENFD); 113 inactivate_flags |= XFS_GQUOTA_ACTIVE; 114 } 115 if (flags & XFS_PQUOTA_ACCT) { 116 dqtype |= XFS_QMOPT_PQUOTA; 117 flags |= (XFS_PQUOTA_CHKD | XFS_PQUOTA_ENFD); 118 inactivate_flags |= XFS_PQUOTA_ACTIVE; 119 } 120 121 /* 122 * Nothing to do? Don't complain. This happens when we're just 123 * turning off quota enforcement. 124 */ 125 if ((mp->m_qflags & flags) == 0) 126 goto out_unlock; 127 128 /* 129 * Write the LI_QUOTAOFF log record, and do SB changes atomically, 130 * and synchronously. If we fail to write, we should abort the 131 * operation as it cannot be recovered safely if we crash. 132 */ 133 error = xfs_qm_log_quotaoff(mp, &qoffstart, flags); 134 if (error) 135 goto out_unlock; 136 137 /* 138 * Next we clear the XFS_MOUNT_*DQ_ACTIVE bit(s) in the mount struct 139 * to take care of the race between dqget and quotaoff. We don't take 140 * any special locks to reset these bits. All processes need to check 141 * these bits *after* taking inode lock(s) to see if the particular 142 * quota type is in the process of being turned off. If *ACTIVE, it is 143 * guaranteed that all dquot structures and all quotainode ptrs will all 144 * stay valid as long as that inode is kept locked. 145 * 146 * There is no turning back after this. 147 */ 148 mp->m_qflags &= ~inactivate_flags; 149 150 /* 151 * Give back all the dquot reference(s) held by inodes. 152 * Here we go thru every single incore inode in this file system, and 153 * do a dqrele on the i_udquot/i_gdquot that it may have. 154 * Essentially, as long as somebody has an inode locked, this guarantees 155 * that quotas will not be turned off. This is handy because in a 156 * transaction once we lock the inode(s) and check for quotaon, we can 157 * depend on the quota inodes (and other things) being valid as long as 158 * we keep the lock(s). 159 */ 160 xfs_qm_dqrele_all_inodes(mp, flags); 161 162 /* 163 * Next we make the changes in the quota flag in the mount struct. 164 * This isn't protected by a particular lock directly, because we 165 * don't want to take a mrlock every time we depend on quotas being on. 166 */ 167 mp->m_qflags &= ~flags; 168 169 /* 170 * Go through all the dquots of this file system and purge them, 171 * according to what was turned off. 172 */ 173 xfs_qm_dqpurge_all(mp, dqtype); 174 175 /* 176 * Transactions that had started before ACTIVE state bit was cleared 177 * could have logged many dquots, so they'd have higher LSNs than 178 * the first QUOTAOFF log record does. If we happen to crash when 179 * the tail of the log has gone past the QUOTAOFF record, but 180 * before the last dquot modification, those dquots __will__ 181 * recover, and that's not good. 182 * 183 * So, we have QUOTAOFF start and end logitems; the start 184 * logitem won't get overwritten until the end logitem appears... 185 */ 186 error = xfs_qm_log_quotaoff_end(mp, qoffstart, flags); 187 if (error) { 188 /* We're screwed now. Shutdown is the only option. */ 189 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); 190 goto out_unlock; 191 } 192 193 /* 194 * If all quotas are completely turned off, close shop. 195 */ 196 if (mp->m_qflags == 0) { 197 mutex_unlock(&q->qi_quotaofflock); 198 xfs_qm_destroy_quotainfo(mp); 199 return 0; 200 } 201 202 /* 203 * Release our quotainode references if we don't need them anymore. 204 */ 205 if ((dqtype & XFS_QMOPT_UQUOTA) && q->qi_uquotaip) { 206 IRELE(q->qi_uquotaip); 207 q->qi_uquotaip = NULL; 208 } 209 if ((dqtype & XFS_QMOPT_GQUOTA) && q->qi_gquotaip) { 210 IRELE(q->qi_gquotaip); 211 q->qi_gquotaip = NULL; 212 } 213 if ((dqtype & XFS_QMOPT_PQUOTA) && q->qi_pquotaip) { 214 IRELE(q->qi_pquotaip); 215 q->qi_pquotaip = NULL; 216 } 217 218 out_unlock: 219 mutex_unlock(&q->qi_quotaofflock); 220 return error; 221 } 222 223 STATIC int 224 xfs_qm_scall_trunc_qfile( 225 struct xfs_mount *mp, 226 xfs_ino_t ino) 227 { 228 struct xfs_inode *ip; 229 struct xfs_trans *tp; 230 int error; 231 232 if (ino == NULLFSINO) 233 return 0; 234 235 error = xfs_iget(mp, NULL, ino, 0, 0, &ip); 236 if (error) 237 return error; 238 239 xfs_ilock(ip, XFS_IOLOCK_EXCL); 240 241 tp = xfs_trans_alloc(mp, XFS_TRANS_TRUNCATE_FILE); 242 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); 243 if (error) { 244 xfs_trans_cancel(tp, 0); 245 xfs_iunlock(ip, XFS_IOLOCK_EXCL); 246 goto out_put; 247 } 248 249 xfs_ilock(ip, XFS_ILOCK_EXCL); 250 xfs_trans_ijoin(tp, ip, 0); 251 252 ip->i_d.di_size = 0; 253 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 254 255 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); 256 if (error) { 257 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | 258 XFS_TRANS_ABORT); 259 goto out_unlock; 260 } 261 262 ASSERT(ip->i_d.di_nextents == 0); 263 264 xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); 265 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); 266 267 out_unlock: 268 xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); 269 out_put: 270 IRELE(ip); 271 return error; 272 } 273 274 int 275 xfs_qm_scall_trunc_qfiles( 276 xfs_mount_t *mp, 277 uint flags) 278 { 279 int error = -EINVAL; 280 281 if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0 || 282 (flags & ~XFS_DQ_ALLTYPES)) { 283 xfs_debug(mp, "%s: flags=%x m_qflags=%x", 284 __func__, flags, mp->m_qflags); 285 return -EINVAL; 286 } 287 288 if (flags & XFS_DQ_USER) { 289 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_uquotino); 290 if (error) 291 return error; 292 } 293 if (flags & XFS_DQ_GROUP) { 294 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_gquotino); 295 if (error) 296 return error; 297 } 298 if (flags & XFS_DQ_PROJ) 299 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_pquotino); 300 301 return error; 302 } 303 304 /* 305 * Switch on (a given) quota enforcement for a filesystem. This takes 306 * effect immediately. 307 * (Switching on quota accounting must be done at mount time.) 308 */ 309 int 310 xfs_qm_scall_quotaon( 311 xfs_mount_t *mp, 312 uint flags) 313 { 314 int error; 315 uint qf; 316 __int64_t sbflags; 317 318 flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); 319 /* 320 * Switching on quota accounting must be done at mount time. 321 */ 322 flags &= ~(XFS_ALL_QUOTA_ACCT); 323 324 sbflags = 0; 325 326 if (flags == 0) { 327 xfs_debug(mp, "%s: zero flags, m_qflags=%x", 328 __func__, mp->m_qflags); 329 return -EINVAL; 330 } 331 332 /* No fs can turn on quotas with a delayed effect */ 333 ASSERT((flags & XFS_ALL_QUOTA_ACCT) == 0); 334 335 /* 336 * Can't enforce without accounting. We check the superblock 337 * qflags here instead of m_qflags because rootfs can have 338 * quota acct on ondisk without m_qflags' knowing. 339 */ 340 if (((flags & XFS_UQUOTA_ACCT) == 0 && 341 (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && 342 (flags & XFS_UQUOTA_ENFD)) || 343 ((flags & XFS_GQUOTA_ACCT) == 0 && 344 (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && 345 (flags & XFS_GQUOTA_ENFD)) || 346 ((flags & XFS_PQUOTA_ACCT) == 0 && 347 (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && 348 (flags & XFS_PQUOTA_ENFD))) { 349 xfs_debug(mp, 350 "%s: Can't enforce without acct, flags=%x sbflags=%x", 351 __func__, flags, mp->m_sb.sb_qflags); 352 return -EINVAL; 353 } 354 /* 355 * If everything's up to-date incore, then don't waste time. 356 */ 357 if ((mp->m_qflags & flags) == flags) 358 return -EEXIST; 359 360 /* 361 * Change sb_qflags on disk but not incore mp->qflags 362 * if this is the root filesystem. 363 */ 364 spin_lock(&mp->m_sb_lock); 365 qf = mp->m_sb.sb_qflags; 366 mp->m_sb.sb_qflags = qf | flags; 367 spin_unlock(&mp->m_sb_lock); 368 369 /* 370 * There's nothing to change if it's the same. 371 */ 372 if ((qf & flags) == flags && sbflags == 0) 373 return -EEXIST; 374 sbflags |= XFS_SB_QFLAGS; 375 376 if ((error = xfs_qm_write_sb_changes(mp, sbflags))) 377 return error; 378 /* 379 * If we aren't trying to switch on quota enforcement, we are done. 380 */ 381 if (((mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) != 382 (mp->m_qflags & XFS_UQUOTA_ACCT)) || 383 ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) != 384 (mp->m_qflags & XFS_PQUOTA_ACCT)) || 385 ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) != 386 (mp->m_qflags & XFS_GQUOTA_ACCT)) || 387 (flags & XFS_ALL_QUOTA_ENFD) == 0) 388 return 0; 389 390 if (! XFS_IS_QUOTA_RUNNING(mp)) 391 return -ESRCH; 392 393 /* 394 * Switch on quota enforcement in core. 395 */ 396 mutex_lock(&mp->m_quotainfo->qi_quotaofflock); 397 mp->m_qflags |= (flags & XFS_ALL_QUOTA_ENFD); 398 mutex_unlock(&mp->m_quotainfo->qi_quotaofflock); 399 400 return 0; 401 } 402 403 404 /* 405 * Return quota status information, such as uquota-off, enforcements, etc. 406 * for Q_XGETQSTAT command. 407 */ 408 int 409 xfs_qm_scall_getqstat( 410 struct xfs_mount *mp, 411 struct fs_quota_stat *out) 412 { 413 struct xfs_quotainfo *q = mp->m_quotainfo; 414 struct xfs_inode *uip = NULL; 415 struct xfs_inode *gip = NULL; 416 struct xfs_inode *pip = NULL; 417 bool tempuqip = false; 418 bool tempgqip = false; 419 bool temppqip = false; 420 421 memset(out, 0, sizeof(fs_quota_stat_t)); 422 423 out->qs_version = FS_QSTAT_VERSION; 424 if (!xfs_sb_version_hasquota(&mp->m_sb)) { 425 out->qs_uquota.qfs_ino = NULLFSINO; 426 out->qs_gquota.qfs_ino = NULLFSINO; 427 return 0; 428 } 429 430 out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & 431 (XFS_ALL_QUOTA_ACCT| 432 XFS_ALL_QUOTA_ENFD)); 433 if (q) { 434 uip = q->qi_uquotaip; 435 gip = q->qi_gquotaip; 436 pip = q->qi_pquotaip; 437 } 438 if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { 439 if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 440 0, 0, &uip) == 0) 441 tempuqip = true; 442 } 443 if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { 444 if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 445 0, 0, &gip) == 0) 446 tempgqip = true; 447 } 448 /* 449 * Q_XGETQSTAT doesn't have room for both group and project quotas. 450 * So, allow the project quota values to be copied out only if 451 * there is no group quota information available. 452 */ 453 if (!gip) { 454 if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) { 455 if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino, 456 0, 0, &pip) == 0) 457 temppqip = true; 458 } 459 } else 460 pip = NULL; 461 if (uip) { 462 out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; 463 out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; 464 out->qs_uquota.qfs_nextents = uip->i_d.di_nextents; 465 if (tempuqip) 466 IRELE(uip); 467 } 468 469 if (gip) { 470 out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; 471 out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks; 472 out->qs_gquota.qfs_nextents = gip->i_d.di_nextents; 473 if (tempgqip) 474 IRELE(gip); 475 } 476 if (pip) { 477 out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; 478 out->qs_gquota.qfs_nblks = pip->i_d.di_nblocks; 479 out->qs_gquota.qfs_nextents = pip->i_d.di_nextents; 480 if (temppqip) 481 IRELE(pip); 482 } 483 if (q) { 484 out->qs_incoredqs = q->qi_dquots; 485 out->qs_btimelimit = q->qi_btimelimit; 486 out->qs_itimelimit = q->qi_itimelimit; 487 out->qs_rtbtimelimit = q->qi_rtbtimelimit; 488 out->qs_bwarnlimit = q->qi_bwarnlimit; 489 out->qs_iwarnlimit = q->qi_iwarnlimit; 490 } 491 return 0; 492 } 493 494 /* 495 * Return quota status information, such as uquota-off, enforcements, etc. 496 * for Q_XGETQSTATV command, to support separate project quota field. 497 */ 498 int 499 xfs_qm_scall_getqstatv( 500 struct xfs_mount *mp, 501 struct fs_quota_statv *out) 502 { 503 struct xfs_quotainfo *q = mp->m_quotainfo; 504 struct xfs_inode *uip = NULL; 505 struct xfs_inode *gip = NULL; 506 struct xfs_inode *pip = NULL; 507 bool tempuqip = false; 508 bool tempgqip = false; 509 bool temppqip = false; 510 511 if (!xfs_sb_version_hasquota(&mp->m_sb)) { 512 out->qs_uquota.qfs_ino = NULLFSINO; 513 out->qs_gquota.qfs_ino = NULLFSINO; 514 out->qs_pquota.qfs_ino = NULLFSINO; 515 return 0; 516 } 517 518 out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & 519 (XFS_ALL_QUOTA_ACCT| 520 XFS_ALL_QUOTA_ENFD)); 521 out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; 522 out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; 523 out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino; 524 525 if (q) { 526 uip = q->qi_uquotaip; 527 gip = q->qi_gquotaip; 528 pip = q->qi_pquotaip; 529 } 530 if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { 531 if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 532 0, 0, &uip) == 0) 533 tempuqip = true; 534 } 535 if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { 536 if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 537 0, 0, &gip) == 0) 538 tempgqip = true; 539 } 540 if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) { 541 if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino, 542 0, 0, &pip) == 0) 543 temppqip = true; 544 } 545 if (uip) { 546 out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; 547 out->qs_uquota.qfs_nextents = uip->i_d.di_nextents; 548 if (tempuqip) 549 IRELE(uip); 550 } 551 552 if (gip) { 553 out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks; 554 out->qs_gquota.qfs_nextents = gip->i_d.di_nextents; 555 if (tempgqip) 556 IRELE(gip); 557 } 558 if (pip) { 559 out->qs_pquota.qfs_nblks = pip->i_d.di_nblocks; 560 out->qs_pquota.qfs_nextents = pip->i_d.di_nextents; 561 if (temppqip) 562 IRELE(pip); 563 } 564 if (q) { 565 out->qs_incoredqs = q->qi_dquots; 566 out->qs_btimelimit = q->qi_btimelimit; 567 out->qs_itimelimit = q->qi_itimelimit; 568 out->qs_rtbtimelimit = q->qi_rtbtimelimit; 569 out->qs_bwarnlimit = q->qi_bwarnlimit; 570 out->qs_iwarnlimit = q->qi_iwarnlimit; 571 } 572 return 0; 573 } 574 575 #define XFS_QC_MASK \ 576 (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK) 577 578 /* 579 * Adjust quota limits, and start/stop timers accordingly. 580 */ 581 int 582 xfs_qm_scall_setqlim( 583 struct xfs_mount *mp, 584 xfs_dqid_t id, 585 uint type, 586 struct qc_dqblk *newlim) 587 { 588 struct xfs_quotainfo *q = mp->m_quotainfo; 589 struct xfs_disk_dquot *ddq; 590 struct xfs_dquot *dqp; 591 struct xfs_trans *tp; 592 int error; 593 xfs_qcnt_t hard, soft; 594 595 if (newlim->d_fieldmask & ~XFS_QC_MASK) 596 return -EINVAL; 597 if ((newlim->d_fieldmask & XFS_QC_MASK) == 0) 598 return 0; 599 600 /* 601 * We don't want to race with a quotaoff so take the quotaoff lock. 602 * We don't hold an inode lock, so there's nothing else to stop 603 * a quotaoff from happening. 604 */ 605 mutex_lock(&q->qi_quotaofflock); 606 607 /* 608 * Get the dquot (locked) before we start, as we need to do a 609 * transaction to allocate it if it doesn't exist. Once we have the 610 * dquot, unlock it so we can start the next transaction safely. We hold 611 * a reference to the dquot, so it's safe to do this unlock/lock without 612 * it being reclaimed in the mean time. 613 */ 614 error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp); 615 if (error) { 616 ASSERT(error != -ENOENT); 617 goto out_unlock; 618 } 619 xfs_dqunlock(dqp); 620 621 tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); 622 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_setqlim, 0, 0); 623 if (error) { 624 xfs_trans_cancel(tp, 0); 625 goto out_rele; 626 } 627 628 xfs_dqlock(dqp); 629 xfs_trans_dqjoin(tp, dqp); 630 ddq = &dqp->q_core; 631 632 /* 633 * Make sure that hardlimits are >= soft limits before changing. 634 */ 635 hard = (newlim->d_fieldmask & QC_SPC_HARD) ? 636 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_hardlimit) : 637 be64_to_cpu(ddq->d_blk_hardlimit); 638 soft = (newlim->d_fieldmask & QC_SPC_SOFT) ? 639 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_softlimit) : 640 be64_to_cpu(ddq->d_blk_softlimit); 641 if (hard == 0 || hard >= soft) { 642 ddq->d_blk_hardlimit = cpu_to_be64(hard); 643 ddq->d_blk_softlimit = cpu_to_be64(soft); 644 xfs_dquot_set_prealloc_limits(dqp); 645 if (id == 0) { 646 q->qi_bhardlimit = hard; 647 q->qi_bsoftlimit = soft; 648 } 649 } else { 650 xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft); 651 } 652 hard = (newlim->d_fieldmask & QC_RT_SPC_HARD) ? 653 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_hardlimit) : 654 be64_to_cpu(ddq->d_rtb_hardlimit); 655 soft = (newlim->d_fieldmask & QC_RT_SPC_SOFT) ? 656 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_softlimit) : 657 be64_to_cpu(ddq->d_rtb_softlimit); 658 if (hard == 0 || hard >= soft) { 659 ddq->d_rtb_hardlimit = cpu_to_be64(hard); 660 ddq->d_rtb_softlimit = cpu_to_be64(soft); 661 if (id == 0) { 662 q->qi_rtbhardlimit = hard; 663 q->qi_rtbsoftlimit = soft; 664 } 665 } else { 666 xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft); 667 } 668 669 hard = (newlim->d_fieldmask & QC_INO_HARD) ? 670 (xfs_qcnt_t) newlim->d_ino_hardlimit : 671 be64_to_cpu(ddq->d_ino_hardlimit); 672 soft = (newlim->d_fieldmask & QC_INO_SOFT) ? 673 (xfs_qcnt_t) newlim->d_ino_softlimit : 674 be64_to_cpu(ddq->d_ino_softlimit); 675 if (hard == 0 || hard >= soft) { 676 ddq->d_ino_hardlimit = cpu_to_be64(hard); 677 ddq->d_ino_softlimit = cpu_to_be64(soft); 678 if (id == 0) { 679 q->qi_ihardlimit = hard; 680 q->qi_isoftlimit = soft; 681 } 682 } else { 683 xfs_debug(mp, "ihard %Ld < isoft %Ld", hard, soft); 684 } 685 686 /* 687 * Update warnings counter(s) if requested 688 */ 689 if (newlim->d_fieldmask & QC_SPC_WARNS) 690 ddq->d_bwarns = cpu_to_be16(newlim->d_spc_warns); 691 if (newlim->d_fieldmask & QC_INO_WARNS) 692 ddq->d_iwarns = cpu_to_be16(newlim->d_ino_warns); 693 if (newlim->d_fieldmask & QC_RT_SPC_WARNS) 694 ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns); 695 696 if (id == 0) { 697 /* 698 * Timelimits for the super user set the relative time 699 * the other users can be over quota for this file system. 700 * If it is zero a default is used. Ditto for the default 701 * soft and hard limit values (already done, above), and 702 * for warnings. 703 */ 704 if (newlim->d_fieldmask & QC_SPC_TIMER) { 705 q->qi_btimelimit = newlim->d_spc_timer; 706 ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer); 707 } 708 if (newlim->d_fieldmask & QC_INO_TIMER) { 709 q->qi_itimelimit = newlim->d_ino_timer; 710 ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer); 711 } 712 if (newlim->d_fieldmask & QC_RT_SPC_TIMER) { 713 q->qi_rtbtimelimit = newlim->d_rt_spc_timer; 714 ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer); 715 } 716 if (newlim->d_fieldmask & QC_SPC_WARNS) 717 q->qi_bwarnlimit = newlim->d_spc_warns; 718 if (newlim->d_fieldmask & QC_INO_WARNS) 719 q->qi_iwarnlimit = newlim->d_ino_warns; 720 if (newlim->d_fieldmask & QC_RT_SPC_WARNS) 721 q->qi_rtbwarnlimit = newlim->d_rt_spc_warns; 722 } else { 723 /* 724 * If the user is now over quota, start the timelimit. 725 * The user will not be 'warned'. 726 * Note that we keep the timers ticking, whether enforcement 727 * is on or off. We don't really want to bother with iterating 728 * over all ondisk dquots and turning the timers on/off. 729 */ 730 xfs_qm_adjust_dqtimers(mp, ddq); 731 } 732 dqp->dq_flags |= XFS_DQ_DIRTY; 733 xfs_trans_log_dquot(tp, dqp); 734 735 error = xfs_trans_commit(tp, 0); 736 737 out_rele: 738 xfs_qm_dqrele(dqp); 739 out_unlock: 740 mutex_unlock(&q->qi_quotaofflock); 741 return error; 742 } 743 744 STATIC int 745 xfs_qm_log_quotaoff_end( 746 xfs_mount_t *mp, 747 xfs_qoff_logitem_t *startqoff, 748 uint flags) 749 { 750 xfs_trans_t *tp; 751 int error; 752 xfs_qoff_logitem_t *qoffi; 753 754 tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END); 755 756 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_equotaoff, 0, 0); 757 if (error) { 758 xfs_trans_cancel(tp, 0); 759 return error; 760 } 761 762 qoffi = xfs_trans_get_qoff_item(tp, startqoff, 763 flags & XFS_ALL_QUOTA_ACCT); 764 xfs_trans_log_quotaoff_item(tp, qoffi); 765 766 /* 767 * We have to make sure that the transaction is secure on disk before we 768 * return and actually stop quota accounting. So, make it synchronous. 769 * We don't care about quotoff's performance. 770 */ 771 xfs_trans_set_sync(tp); 772 error = xfs_trans_commit(tp, 0); 773 return error; 774 } 775 776 777 STATIC int 778 xfs_qm_log_quotaoff( 779 xfs_mount_t *mp, 780 xfs_qoff_logitem_t **qoffstartp, 781 uint flags) 782 { 783 xfs_trans_t *tp; 784 int error; 785 xfs_qoff_logitem_t *qoffi; 786 787 *qoffstartp = NULL; 788 789 tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); 790 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_quotaoff, 0, 0); 791 if (error) { 792 xfs_trans_cancel(tp, 0); 793 goto out; 794 } 795 796 qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); 797 xfs_trans_log_quotaoff_item(tp, qoffi); 798 799 spin_lock(&mp->m_sb_lock); 800 mp->m_sb.sb_qflags = (mp->m_qflags & ~(flags)) & XFS_MOUNT_QUOTA_ALL; 801 spin_unlock(&mp->m_sb_lock); 802 803 xfs_mod_sb(tp, XFS_SB_QFLAGS); 804 805 /* 806 * We have to make sure that the transaction is secure on disk before we 807 * return and actually stop quota accounting. So, make it synchronous. 808 * We don't care about quotoff's performance. 809 */ 810 xfs_trans_set_sync(tp); 811 error = xfs_trans_commit(tp, 0); 812 if (error) 813 goto out; 814 815 *qoffstartp = qoffi; 816 out: 817 return error; 818 } 819 820 821 int 822 xfs_qm_scall_getquota( 823 struct xfs_mount *mp, 824 xfs_dqid_t id, 825 uint type, 826 struct qc_dqblk *dst) 827 { 828 struct xfs_dquot *dqp; 829 int error; 830 831 /* 832 * Try to get the dquot. We don't want it allocated on disk, so 833 * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't 834 * exist, we'll get ENOENT back. 835 */ 836 error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp); 837 if (error) 838 return error; 839 840 /* 841 * If everything's NULL, this dquot doesn't quite exist as far as 842 * our utility programs are concerned. 843 */ 844 if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { 845 error = -ENOENT; 846 goto out_put; 847 } 848 849 memset(dst, 0, sizeof(*dst)); 850 dst->d_spc_hardlimit = 851 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); 852 dst->d_spc_softlimit = 853 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); 854 dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); 855 dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); 856 dst->d_space = XFS_FSB_TO_B(mp, dqp->q_res_bcount); 857 dst->d_ino_count = dqp->q_res_icount; 858 dst->d_spc_timer = be32_to_cpu(dqp->q_core.d_btimer); 859 dst->d_ino_timer = be32_to_cpu(dqp->q_core.d_itimer); 860 dst->d_ino_warns = be16_to_cpu(dqp->q_core.d_iwarns); 861 dst->d_spc_warns = be16_to_cpu(dqp->q_core.d_bwarns); 862 dst->d_rt_spc_hardlimit = 863 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); 864 dst->d_rt_spc_softlimit = 865 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); 866 dst->d_rt_space = XFS_FSB_TO_B(mp, dqp->q_res_rtbcount); 867 dst->d_rt_spc_timer = be32_to_cpu(dqp->q_core.d_rtbtimer); 868 dst->d_rt_spc_warns = be16_to_cpu(dqp->q_core.d_rtbwarns); 869 870 /* 871 * Internally, we don't reset all the timers when quota enforcement 872 * gets turned off. No need to confuse the user level code, 873 * so return zeroes in that case. 874 */ 875 if ((!XFS_IS_UQUOTA_ENFORCED(mp) && 876 dqp->q_core.d_flags == XFS_DQ_USER) || 877 (!XFS_IS_GQUOTA_ENFORCED(mp) && 878 dqp->q_core.d_flags == XFS_DQ_GROUP) || 879 (!XFS_IS_PQUOTA_ENFORCED(mp) && 880 dqp->q_core.d_flags == XFS_DQ_PROJ)) { 881 dst->d_spc_timer = 0; 882 dst->d_ino_timer = 0; 883 dst->d_rt_spc_timer = 0; 884 } 885 886 #ifdef DEBUG 887 if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || 888 (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || 889 (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && 890 id != 0) { 891 if ((dst->d_space > dst->d_spc_softlimit) && 892 (dst->d_spc_softlimit > 0)) { 893 ASSERT(dst->d_spc_timer != 0); 894 } 895 if ((dst->d_ino_count > dst->d_ino_softlimit) && 896 (dst->d_ino_softlimit > 0)) { 897 ASSERT(dst->d_ino_timer != 0); 898 } 899 } 900 #endif 901 out_put: 902 xfs_qm_dqput(dqp); 903 return error; 904 } 905 906 STATIC uint 907 xfs_qm_export_flags( 908 uint flags) 909 { 910 uint uflags; 911 912 uflags = 0; 913 if (flags & XFS_UQUOTA_ACCT) 914 uflags |= FS_QUOTA_UDQ_ACCT; 915 if (flags & XFS_GQUOTA_ACCT) 916 uflags |= FS_QUOTA_GDQ_ACCT; 917 if (flags & XFS_PQUOTA_ACCT) 918 uflags |= FS_QUOTA_PDQ_ACCT; 919 if (flags & XFS_UQUOTA_ENFD) 920 uflags |= FS_QUOTA_UDQ_ENFD; 921 if (flags & XFS_GQUOTA_ENFD) 922 uflags |= FS_QUOTA_GDQ_ENFD; 923 if (flags & XFS_PQUOTA_ENFD) 924 uflags |= FS_QUOTA_PDQ_ENFD; 925 return uflags; 926 } 927 928 929 STATIC int 930 xfs_dqrele_inode( 931 struct xfs_inode *ip, 932 int flags, 933 void *args) 934 { 935 /* skip quota inodes */ 936 if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || 937 ip == ip->i_mount->m_quotainfo->qi_gquotaip || 938 ip == ip->i_mount->m_quotainfo->qi_pquotaip) { 939 ASSERT(ip->i_udquot == NULL); 940 ASSERT(ip->i_gdquot == NULL); 941 ASSERT(ip->i_pdquot == NULL); 942 return 0; 943 } 944 945 xfs_ilock(ip, XFS_ILOCK_EXCL); 946 if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { 947 xfs_qm_dqrele(ip->i_udquot); 948 ip->i_udquot = NULL; 949 } 950 if ((flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) { 951 xfs_qm_dqrele(ip->i_gdquot); 952 ip->i_gdquot = NULL; 953 } 954 if ((flags & XFS_PQUOTA_ACCT) && ip->i_pdquot) { 955 xfs_qm_dqrele(ip->i_pdquot); 956 ip->i_pdquot = NULL; 957 } 958 xfs_iunlock(ip, XFS_ILOCK_EXCL); 959 return 0; 960 } 961 962 963 /* 964 * Go thru all the inodes in the file system, releasing their dquots. 965 * 966 * Note that the mount structure gets modified to indicate that quotas are off 967 * AFTER this, in the case of quotaoff. 968 */ 969 void 970 xfs_qm_dqrele_all_inodes( 971 struct xfs_mount *mp, 972 uint flags) 973 { 974 ASSERT(mp->m_quotainfo); 975 xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, NULL); 976 } 977