diff options
Diffstat (limited to 'fs/dquot.c')
| -rw-r--r-- | fs/dquot.c | 162 |
1 files changed, 142 insertions, 20 deletions
diff --git a/fs/dquot.c b/fs/dquot.c index 5ac77da19959..8ec4d6cc7633 100644 --- a/fs/dquot.c +++ b/fs/dquot.c | |||
| @@ -562,6 +562,8 @@ static struct shrinker dqcache_shrinker = { | |||
| 562 | */ | 562 | */ |
| 563 | static void dqput(struct dquot *dquot) | 563 | static void dqput(struct dquot *dquot) |
| 564 | { | 564 | { |
| 565 | int ret; | ||
| 566 | |||
| 565 | if (!dquot) | 567 | if (!dquot) |
| 566 | return; | 568 | return; |
| 567 | #ifdef __DQUOT_PARANOIA | 569 | #ifdef __DQUOT_PARANOIA |
| @@ -594,7 +596,19 @@ we_slept: | |||
| 594 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) { | 596 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) { |
| 595 | spin_unlock(&dq_list_lock); | 597 | spin_unlock(&dq_list_lock); |
| 596 | /* Commit dquot before releasing */ | 598 | /* Commit dquot before releasing */ |
| 597 | dquot->dq_sb->dq_op->write_dquot(dquot); | 599 | ret = dquot->dq_sb->dq_op->write_dquot(dquot); |
| 600 | if (ret < 0) { | ||
| 601 | printk(KERN_ERR "VFS: cannot write quota structure on " | ||
| 602 | "device %s (error %d). Quota may get out of " | ||
| 603 | "sync!\n", dquot->dq_sb->s_id, ret); | ||
| 604 | /* | ||
| 605 | * We clear dirty bit anyway, so that we avoid | ||
| 606 | * infinite loop here | ||
| 607 | */ | ||
| 608 | spin_lock(&dq_list_lock); | ||
| 609 | clear_dquot_dirty(dquot); | ||
| 610 | spin_unlock(&dq_list_lock); | ||
| 611 | } | ||
| 598 | goto we_slept; | 612 | goto we_slept; |
| 599 | } | 613 | } |
| 600 | /* Clear flag in case dquot was inactive (something bad happened) */ | 614 | /* Clear flag in case dquot was inactive (something bad happened) */ |
| @@ -875,7 +889,10 @@ static void print_warning(struct dquot *dquot, const int warntype) | |||
| 875 | char *msg = NULL; | 889 | char *msg = NULL; |
| 876 | struct tty_struct *tty; | 890 | struct tty_struct *tty; |
| 877 | 891 | ||
| 878 | if (!need_print_warning(dquot)) | 892 | if (warntype == QUOTA_NL_IHARDBELOW || |
| 893 | warntype == QUOTA_NL_ISOFTBELOW || | ||
| 894 | warntype == QUOTA_NL_BHARDBELOW || | ||
| 895 | warntype == QUOTA_NL_BSOFTBELOW || !need_print_warning(dquot)) | ||
| 879 | return; | 896 | return; |
| 880 | 897 | ||
| 881 | mutex_lock(&tty_mutex); | 898 | mutex_lock(&tty_mutex); |
| @@ -1083,6 +1100,35 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *war | |||
| 1083 | return QUOTA_OK; | 1100 | return QUOTA_OK; |
| 1084 | } | 1101 | } |
| 1085 | 1102 | ||
| 1103 | static int info_idq_free(struct dquot *dquot, ulong inodes) | ||
| 1104 | { | ||
| 1105 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || | ||
| 1106 | dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit) | ||
| 1107 | return QUOTA_NL_NOWARN; | ||
| 1108 | |||
| 1109 | if (dquot->dq_dqb.dqb_curinodes - inodes <= dquot->dq_dqb.dqb_isoftlimit) | ||
| 1110 | return QUOTA_NL_ISOFTBELOW; | ||
| 1111 | if (dquot->dq_dqb.dqb_curinodes >= dquot->dq_dqb.dqb_ihardlimit && | ||
| 1112 | dquot->dq_dqb.dqb_curinodes - inodes < dquot->dq_dqb.dqb_ihardlimit) | ||
| 1113 | return QUOTA_NL_IHARDBELOW; | ||
| 1114 | return QUOTA_NL_NOWARN; | ||
| 1115 | } | ||
| 1116 | |||
| 1117 | static int info_bdq_free(struct dquot *dquot, qsize_t space) | ||
| 1118 | { | ||
| 1119 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || | ||
| 1120 | toqb(dquot->dq_dqb.dqb_curspace) <= dquot->dq_dqb.dqb_bsoftlimit) | ||
| 1121 | return QUOTA_NL_NOWARN; | ||
| 1122 | |||
| 1123 | if (toqb(dquot->dq_dqb.dqb_curspace - space) <= | ||
| 1124 | dquot->dq_dqb.dqb_bsoftlimit) | ||
| 1125 | return QUOTA_NL_BSOFTBELOW; | ||
| 1126 | if (toqb(dquot->dq_dqb.dqb_curspace) >= dquot->dq_dqb.dqb_bhardlimit && | ||
| 1127 | toqb(dquot->dq_dqb.dqb_curspace - space) < | ||
| 1128 | dquot->dq_dqb.dqb_bhardlimit) | ||
| 1129 | return QUOTA_NL_BHARDBELOW; | ||
| 1130 | return QUOTA_NL_NOWARN; | ||
| 1131 | } | ||
| 1086 | /* | 1132 | /* |
| 1087 | * Initialize quota pointers in inode | 1133 | * Initialize quota pointers in inode |
| 1088 | * Transaction must be started at entry | 1134 | * Transaction must be started at entry |
| @@ -1139,6 +1185,28 @@ int dquot_drop(struct inode *inode) | |||
| 1139 | return 0; | 1185 | return 0; |
| 1140 | } | 1186 | } |
| 1141 | 1187 | ||
| 1188 | /* Wrapper to remove references to quota structures from inode */ | ||
| 1189 | void vfs_dq_drop(struct inode *inode) | ||
| 1190 | { | ||
| 1191 | /* Here we can get arbitrary inode from clear_inode() so we have | ||
| 1192 | * to be careful. OTOH we don't need locking as quota operations | ||
| 1193 | * are allowed to change only at mount time */ | ||
| 1194 | if (!IS_NOQUOTA(inode) && inode->i_sb && inode->i_sb->dq_op | ||
| 1195 | && inode->i_sb->dq_op->drop) { | ||
| 1196 | int cnt; | ||
| 1197 | /* Test before calling to rule out calls from proc and such | ||
| 1198 | * where we are not allowed to block. Note that this is | ||
| 1199 | * actually reliable test even without the lock - the caller | ||
| 1200 | * must assure that nobody can come after the DQUOT_DROP and | ||
| 1201 | * add quota pointers back anyway */ | ||
| 1202 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) | ||
| 1203 | if (inode->i_dquot[cnt] != NODQUOT) | ||
| 1204 | break; | ||
| 1205 | if (cnt < MAXQUOTAS) | ||
| 1206 | inode->i_sb->dq_op->drop(inode); | ||
| 1207 | } | ||
| 1208 | } | ||
| 1209 | |||
| 1142 | /* | 1210 | /* |
| 1143 | * Following four functions update i_blocks+i_bytes fields and | 1211 | * Following four functions update i_blocks+i_bytes fields and |
| 1144 | * quota information (together with appropriate checks) | 1212 | * quota information (together with appropriate checks) |
| @@ -1248,6 +1316,7 @@ warn_put_all: | |||
| 1248 | int dquot_free_space(struct inode *inode, qsize_t number) | 1316 | int dquot_free_space(struct inode *inode, qsize_t number) |
| 1249 | { | 1317 | { |
| 1250 | unsigned int cnt; | 1318 | unsigned int cnt; |
| 1319 | char warntype[MAXQUOTAS]; | ||
| 1251 | 1320 | ||
| 1252 | /* First test before acquiring mutex - solves deadlocks when we | 1321 | /* First test before acquiring mutex - solves deadlocks when we |
| 1253 | * re-enter the quota code and are already holding the mutex */ | 1322 | * re-enter the quota code and are already holding the mutex */ |
| @@ -1256,6 +1325,7 @@ out_sub: | |||
| 1256 | inode_sub_bytes(inode, number); | 1325 | inode_sub_bytes(inode, number); |
| 1257 | return QUOTA_OK; | 1326 | return QUOTA_OK; |
| 1258 | } | 1327 | } |
| 1328 | |||
| 1259 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1329 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1260 | /* Now recheck reliably when holding dqptr_sem */ | 1330 | /* Now recheck reliably when holding dqptr_sem */ |
| 1261 | if (IS_NOQUOTA(inode)) { | 1331 | if (IS_NOQUOTA(inode)) { |
| @@ -1266,6 +1336,7 @@ out_sub: | |||
| 1266 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1336 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1267 | if (inode->i_dquot[cnt] == NODQUOT) | 1337 | if (inode->i_dquot[cnt] == NODQUOT) |
| 1268 | continue; | 1338 | continue; |
| 1339 | warntype[cnt] = info_bdq_free(inode->i_dquot[cnt], number); | ||
| 1269 | dquot_decr_space(inode->i_dquot[cnt], number); | 1340 | dquot_decr_space(inode->i_dquot[cnt], number); |
| 1270 | } | 1341 | } |
| 1271 | inode_sub_bytes(inode, number); | 1342 | inode_sub_bytes(inode, number); |
| @@ -1274,6 +1345,7 @@ out_sub: | |||
| 1274 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) | 1345 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) |
| 1275 | if (inode->i_dquot[cnt]) | 1346 | if (inode->i_dquot[cnt]) |
| 1276 | mark_dquot_dirty(inode->i_dquot[cnt]); | 1347 | mark_dquot_dirty(inode->i_dquot[cnt]); |
| 1348 | flush_warnings(inode->i_dquot, warntype); | ||
| 1277 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1349 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1278 | return QUOTA_OK; | 1350 | return QUOTA_OK; |
| 1279 | } | 1351 | } |
| @@ -1284,11 +1356,13 @@ out_sub: | |||
| 1284 | int dquot_free_inode(const struct inode *inode, unsigned long number) | 1356 | int dquot_free_inode(const struct inode *inode, unsigned long number) |
| 1285 | { | 1357 | { |
| 1286 | unsigned int cnt; | 1358 | unsigned int cnt; |
| 1359 | char warntype[MAXQUOTAS]; | ||
| 1287 | 1360 | ||
| 1288 | /* First test before acquiring mutex - solves deadlocks when we | 1361 | /* First test before acquiring mutex - solves deadlocks when we |
| 1289 | * re-enter the quota code and are already holding the mutex */ | 1362 | * re-enter the quota code and are already holding the mutex */ |
| 1290 | if (IS_NOQUOTA(inode)) | 1363 | if (IS_NOQUOTA(inode)) |
| 1291 | return QUOTA_OK; | 1364 | return QUOTA_OK; |
| 1365 | |||
| 1292 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1366 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1293 | /* Now recheck reliably when holding dqptr_sem */ | 1367 | /* Now recheck reliably when holding dqptr_sem */ |
| 1294 | if (IS_NOQUOTA(inode)) { | 1368 | if (IS_NOQUOTA(inode)) { |
| @@ -1299,6 +1373,7 @@ int dquot_free_inode(const struct inode *inode, unsigned long number) | |||
| 1299 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1373 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1300 | if (inode->i_dquot[cnt] == NODQUOT) | 1374 | if (inode->i_dquot[cnt] == NODQUOT) |
| 1301 | continue; | 1375 | continue; |
| 1376 | warntype[cnt] = info_idq_free(inode->i_dquot[cnt], number); | ||
| 1302 | dquot_decr_inodes(inode->i_dquot[cnt], number); | 1377 | dquot_decr_inodes(inode->i_dquot[cnt], number); |
| 1303 | } | 1378 | } |
| 1304 | spin_unlock(&dq_data_lock); | 1379 | spin_unlock(&dq_data_lock); |
| @@ -1306,6 +1381,7 @@ int dquot_free_inode(const struct inode *inode, unsigned long number) | |||
| 1306 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) | 1381 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) |
| 1307 | if (inode->i_dquot[cnt]) | 1382 | if (inode->i_dquot[cnt]) |
| 1308 | mark_dquot_dirty(inode->i_dquot[cnt]); | 1383 | mark_dquot_dirty(inode->i_dquot[cnt]); |
| 1384 | flush_warnings(inode->i_dquot, warntype); | ||
| 1309 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1385 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1310 | return QUOTA_OK; | 1386 | return QUOTA_OK; |
| 1311 | } | 1387 | } |
| @@ -1323,7 +1399,8 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
| 1323 | struct dquot *transfer_to[MAXQUOTAS]; | 1399 | struct dquot *transfer_to[MAXQUOTAS]; |
| 1324 | int cnt, ret = NO_QUOTA, chuid = (iattr->ia_valid & ATTR_UID) && inode->i_uid != iattr->ia_uid, | 1400 | int cnt, ret = NO_QUOTA, chuid = (iattr->ia_valid & ATTR_UID) && inode->i_uid != iattr->ia_uid, |
| 1325 | chgid = (iattr->ia_valid & ATTR_GID) && inode->i_gid != iattr->ia_gid; | 1401 | chgid = (iattr->ia_valid & ATTR_GID) && inode->i_gid != iattr->ia_gid; |
| 1326 | char warntype[MAXQUOTAS]; | 1402 | char warntype_to[MAXQUOTAS]; |
| 1403 | char warntype_from_inodes[MAXQUOTAS], warntype_from_space[MAXQUOTAS]; | ||
| 1327 | 1404 | ||
| 1328 | /* First test before acquiring mutex - solves deadlocks when we | 1405 | /* First test before acquiring mutex - solves deadlocks when we |
| 1329 | * re-enter the quota code and are already holding the mutex */ | 1406 | * re-enter the quota code and are already holding the mutex */ |
| @@ -1332,7 +1409,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
| 1332 | /* Clear the arrays */ | 1409 | /* Clear the arrays */ |
| 1333 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1410 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1334 | transfer_to[cnt] = transfer_from[cnt] = NODQUOT; | 1411 | transfer_to[cnt] = transfer_from[cnt] = NODQUOT; |
| 1335 | warntype[cnt] = QUOTA_NL_NOWARN; | 1412 | warntype_to[cnt] = QUOTA_NL_NOWARN; |
| 1336 | } | 1413 | } |
| 1337 | down_write(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1414 | down_write(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1338 | /* Now recheck reliably when holding dqptr_sem */ | 1415 | /* Now recheck reliably when holding dqptr_sem */ |
| @@ -1364,8 +1441,9 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
| 1364 | if (transfer_to[cnt] == NODQUOT) | 1441 | if (transfer_to[cnt] == NODQUOT) |
| 1365 | continue; | 1442 | continue; |
| 1366 | transfer_from[cnt] = inode->i_dquot[cnt]; | 1443 | transfer_from[cnt] = inode->i_dquot[cnt]; |
| 1367 | if (check_idq(transfer_to[cnt], 1, warntype+cnt) == NO_QUOTA || | 1444 | if (check_idq(transfer_to[cnt], 1, warntype_to + cnt) == |
| 1368 | check_bdq(transfer_to[cnt], space, 0, warntype+cnt) == NO_QUOTA) | 1445 | NO_QUOTA || check_bdq(transfer_to[cnt], space, 0, |
| 1446 | warntype_to + cnt) == NO_QUOTA) | ||
| 1369 | goto warn_put_all; | 1447 | goto warn_put_all; |
| 1370 | } | 1448 | } |
| 1371 | 1449 | ||
| @@ -1381,6 +1459,10 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
| 1381 | 1459 | ||
| 1382 | /* Due to IO error we might not have transfer_from[] structure */ | 1460 | /* Due to IO error we might not have transfer_from[] structure */ |
| 1383 | if (transfer_from[cnt]) { | 1461 | if (transfer_from[cnt]) { |
| 1462 | warntype_from_inodes[cnt] = | ||
| 1463 | info_idq_free(transfer_from[cnt], 1); | ||
| 1464 | warntype_from_space[cnt] = | ||
| 1465 | info_bdq_free(transfer_from[cnt], space); | ||
| 1384 | dquot_decr_inodes(transfer_from[cnt], 1); | 1466 | dquot_decr_inodes(transfer_from[cnt], 1); |
| 1385 | dquot_decr_space(transfer_from[cnt], space); | 1467 | dquot_decr_space(transfer_from[cnt], space); |
| 1386 | } | 1468 | } |
| @@ -1400,7 +1482,9 @@ warn_put_all: | |||
| 1400 | if (transfer_to[cnt]) | 1482 | if (transfer_to[cnt]) |
| 1401 | mark_dquot_dirty(transfer_to[cnt]); | 1483 | mark_dquot_dirty(transfer_to[cnt]); |
| 1402 | } | 1484 | } |
| 1403 | flush_warnings(transfer_to, warntype); | 1485 | flush_warnings(transfer_to, warntype_to); |
| 1486 | flush_warnings(transfer_from, warntype_from_inodes); | ||
| 1487 | flush_warnings(transfer_from, warntype_from_space); | ||
| 1404 | 1488 | ||
| 1405 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1489 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1406 | if (ret == QUOTA_OK && transfer_from[cnt] != NODQUOT) | 1490 | if (ret == QUOTA_OK && transfer_from[cnt] != NODQUOT) |
| @@ -1412,6 +1496,18 @@ warn_put_all: | |||
| 1412 | return ret; | 1496 | return ret; |
| 1413 | } | 1497 | } |
| 1414 | 1498 | ||
| 1499 | /* Wrapper for transferring ownership of an inode */ | ||
| 1500 | int vfs_dq_transfer(struct inode *inode, struct iattr *iattr) | ||
| 1501 | { | ||
| 1502 | if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) { | ||
| 1503 | vfs_dq_init(inode); | ||
| 1504 | if (inode->i_sb->dq_op->transfer(inode, iattr) == NO_QUOTA) | ||
| 1505 | return 1; | ||
| 1506 | } | ||
| 1507 | return 0; | ||
| 1508 | } | ||
| 1509 | |||
| 1510 | |||
| 1415 | /* | 1511 | /* |
| 1416 | * Write info of quota file to disk | 1512 | * Write info of quota file to disk |
| 1417 | */ | 1513 | */ |
| @@ -1697,6 +1793,21 @@ static int vfs_quota_on_remount(struct super_block *sb, int type) | |||
| 1697 | return ret; | 1793 | return ret; |
| 1698 | } | 1794 | } |
| 1699 | 1795 | ||
| 1796 | int vfs_quota_on_path(struct super_block *sb, int type, int format_id, | ||
| 1797 | struct path *path) | ||
| 1798 | { | ||
| 1799 | int error = security_quota_on(path->dentry); | ||
| 1800 | if (error) | ||
| 1801 | return error; | ||
| 1802 | /* Quota file not on the same filesystem? */ | ||
| 1803 | if (path->mnt->mnt_sb != sb) | ||
| 1804 | error = -EXDEV; | ||
| 1805 | else | ||
| 1806 | error = vfs_quota_on_inode(path->dentry->d_inode, type, | ||
| 1807 | format_id); | ||
| 1808 | return error; | ||
| 1809 | } | ||
| 1810 | |||
| 1700 | /* Actual function called from quotactl() */ | 1811 | /* Actual function called from quotactl() */ |
| 1701 | int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path, | 1812 | int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path, |
| 1702 | int remount) | 1813 | int remount) |
| @@ -1708,19 +1819,10 @@ int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path, | |||
| 1708 | return vfs_quota_on_remount(sb, type); | 1819 | return vfs_quota_on_remount(sb, type); |
| 1709 | 1820 | ||
| 1710 | error = path_lookup(path, LOOKUP_FOLLOW, &nd); | 1821 | error = path_lookup(path, LOOKUP_FOLLOW, &nd); |
| 1711 | if (error < 0) | 1822 | if (!error) { |
| 1712 | return error; | 1823 | error = vfs_quota_on_path(sb, type, format_id, &nd.path); |
| 1713 | error = security_quota_on(nd.path.dentry); | 1824 | path_put(&nd.path); |
| 1714 | if (error) | 1825 | } |
| 1715 | goto out_path; | ||
| 1716 | /* Quota file not on the same filesystem? */ | ||
| 1717 | if (nd.path.mnt->mnt_sb != sb) | ||
| 1718 | error = -EXDEV; | ||
| 1719 | else | ||
| 1720 | error = vfs_quota_on_inode(nd.path.dentry->d_inode, type, | ||
| 1721 | format_id); | ||
| 1722 | out_path: | ||
| 1723 | path_put(&nd.path); | ||
| 1724 | return error; | 1826 | return error; |
| 1725 | } | 1827 | } |
| 1726 | 1828 | ||
| @@ -1752,6 +1854,22 @@ out: | |||
| 1752 | return error; | 1854 | return error; |
| 1753 | } | 1855 | } |
| 1754 | 1856 | ||
| 1857 | /* Wrapper to turn on quotas when remounting rw */ | ||
| 1858 | int vfs_dq_quota_on_remount(struct super_block *sb) | ||
| 1859 | { | ||
| 1860 | int cnt; | ||
| 1861 | int ret = 0, err; | ||
| 1862 | |||
| 1863 | if (!sb->s_qcop || !sb->s_qcop->quota_on) | ||
| 1864 | return -ENOSYS; | ||
| 1865 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | ||
| 1866 | err = sb->s_qcop->quota_on(sb, cnt, 0, NULL, 1); | ||
| 1867 | if (err < 0 && !ret) | ||
| 1868 | ret = err; | ||
| 1869 | } | ||
| 1870 | return ret; | ||
| 1871 | } | ||
| 1872 | |||
| 1755 | /* Generic routine for getting common part of quota structure */ | 1873 | /* Generic routine for getting common part of quota structure */ |
| 1756 | static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di) | 1874 | static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di) |
| 1757 | { | 1875 | { |
| @@ -2073,6 +2191,7 @@ EXPORT_SYMBOL(unregister_quota_format); | |||
| 2073 | EXPORT_SYMBOL(dqstats); | 2191 | EXPORT_SYMBOL(dqstats); |
| 2074 | EXPORT_SYMBOL(dq_data_lock); | 2192 | EXPORT_SYMBOL(dq_data_lock); |
| 2075 | EXPORT_SYMBOL(vfs_quota_on); | 2193 | EXPORT_SYMBOL(vfs_quota_on); |
| 2194 | EXPORT_SYMBOL(vfs_quota_on_path); | ||
| 2076 | EXPORT_SYMBOL(vfs_quota_on_mount); | 2195 | EXPORT_SYMBOL(vfs_quota_on_mount); |
| 2077 | EXPORT_SYMBOL(vfs_quota_off); | 2196 | EXPORT_SYMBOL(vfs_quota_off); |
| 2078 | EXPORT_SYMBOL(vfs_quota_sync); | 2197 | EXPORT_SYMBOL(vfs_quota_sync); |
| @@ -2087,8 +2206,11 @@ EXPORT_SYMBOL(dquot_release); | |||
| 2087 | EXPORT_SYMBOL(dquot_mark_dquot_dirty); | 2206 | EXPORT_SYMBOL(dquot_mark_dquot_dirty); |
| 2088 | EXPORT_SYMBOL(dquot_initialize); | 2207 | EXPORT_SYMBOL(dquot_initialize); |
| 2089 | EXPORT_SYMBOL(dquot_drop); | 2208 | EXPORT_SYMBOL(dquot_drop); |
| 2209 | EXPORT_SYMBOL(vfs_dq_drop); | ||
| 2090 | EXPORT_SYMBOL(dquot_alloc_space); | 2210 | EXPORT_SYMBOL(dquot_alloc_space); |
| 2091 | EXPORT_SYMBOL(dquot_alloc_inode); | 2211 | EXPORT_SYMBOL(dquot_alloc_inode); |
| 2092 | EXPORT_SYMBOL(dquot_free_space); | 2212 | EXPORT_SYMBOL(dquot_free_space); |
| 2093 | EXPORT_SYMBOL(dquot_free_inode); | 2213 | EXPORT_SYMBOL(dquot_free_inode); |
| 2094 | EXPORT_SYMBOL(dquot_transfer); | 2214 | EXPORT_SYMBOL(dquot_transfer); |
| 2215 | EXPORT_SYMBOL(vfs_dq_transfer); | ||
| 2216 | EXPORT_SYMBOL(vfs_dq_quota_on_remount); | ||
