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); | ||