aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ufs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ufs/super.c')
-rw-r--r--fs/ufs/super.c126
1 files changed, 0 insertions, 126 deletions
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
index 2b08a8dd8ec..3c9bbf23c2f 100644
--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -77,7 +77,6 @@
77 77
78#include <linux/errno.h> 78#include <linux/errno.h>
79#include <linux/fs.h> 79#include <linux/fs.h>
80#include <linux/quotaops.h>
81#include <linux/slab.h> 80#include <linux/slab.h>
82#include <linux/time.h> 81#include <linux/time.h>
83#include <linux/stat.h> 82#include <linux/stat.h>
@@ -1045,10 +1044,6 @@ magic_found:
1045 */ 1044 */
1046 sb->s_op = &ufs_super_ops; 1045 sb->s_op = &ufs_super_ops;
1047 sb->s_export_op = &ufs_export_ops; 1046 sb->s_export_op = &ufs_export_ops;
1048#ifdef CONFIG_QUOTA
1049 sb->s_qcop = &dquot_quotactl_ops;
1050 sb->dq_op = NULL; /* &dquot_operations */
1051#endif
1052 1047
1053 sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic); 1048 sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic);
1054 1049
@@ -1231,8 +1226,6 @@ static void ufs_put_super(struct super_block *sb)
1231 1226
1232 UFSD("ENTER\n"); 1227 UFSD("ENTER\n");
1233 1228
1234 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
1235
1236 if (sb->s_dirt) 1229 if (sb->s_dirt)
1237 ufs_write_super(sb); 1230 ufs_write_super(sb);
1238 1231
@@ -1254,9 +1247,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
1254 struct ufs_super_block_first * usb1; 1247 struct ufs_super_block_first * usb1;
1255 struct ufs_super_block_third * usb3; 1248 struct ufs_super_block_third * usb3;
1256 unsigned new_mount_opt, ufstype; 1249 unsigned new_mount_opt, ufstype;
1257 int enable_quota = 0;
1258 unsigned flags; 1250 unsigned flags;
1259 int err;
1260 1251
1261 lock_kernel(); 1252 lock_kernel();
1262 lock_super(sb); 1253 lock_super(sb);
@@ -1297,13 +1288,6 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
1297 * fs was mouted as rw, remounting ro 1288 * fs was mouted as rw, remounting ro
1298 */ 1289 */
1299 if (*mount_flags & MS_RDONLY) { 1290 if (*mount_flags & MS_RDONLY) {
1300 err = dquot_suspend(sb, -1);
1301 if (err < 0) {
1302 unlock_super(sb);
1303 unlock_kernel();
1304 return err;
1305 }
1306
1307 ufs_put_super_internal(sb); 1291 ufs_put_super_internal(sb);
1308 usb1->fs_time = cpu_to_fs32(sb, get_seconds()); 1292 usb1->fs_time = cpu_to_fs32(sb, get_seconds());
1309 if ((flags & UFS_ST_MASK) == UFS_ST_SUN 1293 if ((flags & UFS_ST_MASK) == UFS_ST_SUN
@@ -1342,14 +1326,11 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
1342 return -EPERM; 1326 return -EPERM;
1343 } 1327 }
1344 sb->s_flags &= ~MS_RDONLY; 1328 sb->s_flags &= ~MS_RDONLY;
1345 enable_quota = 1;
1346#endif 1329#endif
1347 } 1330 }
1348 UFS_SB(sb)->s_mount_opt = new_mount_opt; 1331 UFS_SB(sb)->s_mount_opt = new_mount_opt;
1349 unlock_super(sb); 1332 unlock_super(sb);
1350 unlock_kernel(); 1333 unlock_kernel();
1351 if (enable_quota)
1352 dquot_resume(sb, -1);
1353 return 0; 1334 return 0;
1354} 1335}
1355 1336
@@ -1453,126 +1434,19 @@ static void destroy_inodecache(void)
1453 kmem_cache_destroy(ufs_inode_cachep); 1434 kmem_cache_destroy(ufs_inode_cachep);
1454} 1435}
1455 1436
1456static void ufs_clear_inode(struct inode *inode)
1457{
1458 dquot_drop(inode);
1459}
1460
1461#ifdef CONFIG_QUOTA
1462static ssize_t ufs_quota_read(struct super_block *, int, char *,size_t, loff_t);
1463static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t, loff_t);
1464#endif
1465
1466static const struct super_operations ufs_super_ops = { 1437static const struct super_operations ufs_super_ops = {
1467 .alloc_inode = ufs_alloc_inode, 1438 .alloc_inode = ufs_alloc_inode,
1468 .destroy_inode = ufs_destroy_inode, 1439 .destroy_inode = ufs_destroy_inode,
1469 .write_inode = ufs_write_inode, 1440 .write_inode = ufs_write_inode,
1470 .delete_inode = ufs_delete_inode, 1441 .delete_inode = ufs_delete_inode,
1471 .clear_inode = ufs_clear_inode,
1472 .put_super = ufs_put_super, 1442 .put_super = ufs_put_super,
1473 .write_super = ufs_write_super, 1443 .write_super = ufs_write_super,
1474 .sync_fs = ufs_sync_fs, 1444 .sync_fs = ufs_sync_fs,
1475 .statfs = ufs_statfs, 1445 .statfs = ufs_statfs,
1476 .remount_fs = ufs_remount, 1446 .remount_fs = ufs_remount,
1477 .show_options = ufs_show_options, 1447 .show_options = ufs_show_options,
1478#ifdef CONFIG_QUOTA
1479 .quota_read = ufs_quota_read,
1480 .quota_write = ufs_quota_write,
1481#endif
1482}; 1448};
1483 1449
1484#ifdef CONFIG_QUOTA
1485
1486/* Read data from quotafile - avoid pagecache and such because we cannot afford
1487 * acquiring the locks... As quota files are never truncated and quota code
1488 * itself serializes the operations (and noone else should touch the files)
1489 * we don't have to be afraid of races */
1490static ssize_t ufs_quota_read(struct super_block *sb, int type, char *data,
1491 size_t len, loff_t off)
1492{
1493 struct inode *inode = sb_dqopt(sb)->files[type];
1494 sector_t blk = off >> sb->s_blocksize_bits;
1495 int err = 0;
1496 int offset = off & (sb->s_blocksize - 1);
1497 int tocopy;
1498 size_t toread;
1499 struct buffer_head *bh;
1500 loff_t i_size = i_size_read(inode);
1501
1502 if (off > i_size)
1503 return 0;
1504 if (off+len > i_size)
1505 len = i_size-off;
1506 toread = len;
1507 while (toread > 0) {
1508 tocopy = sb->s_blocksize - offset < toread ?
1509 sb->s_blocksize - offset : toread;
1510
1511 bh = ufs_bread(inode, blk, 0, &err);
1512 if (err)
1513 return err;
1514 if (!bh) /* A hole? */
1515 memset(data, 0, tocopy);
1516 else {
1517 memcpy(data, bh->b_data+offset, tocopy);
1518 brelse(bh);
1519 }
1520 offset = 0;
1521 toread -= tocopy;
1522 data += tocopy;
1523 blk++;
1524 }
1525 return len;
1526}
1527
1528/* Write to quotafile */
1529static ssize_t ufs_quota_write(struct super_block *sb, int type,
1530 const char *data, size_t len, loff_t off)
1531{
1532 struct inode *inode = sb_dqopt(sb)->files[type];
1533 sector_t blk = off >> sb->s_blocksize_bits;
1534 int err = 0;
1535 int offset = off & (sb->s_blocksize - 1);
1536 int tocopy;
1537 size_t towrite = len;
1538 struct buffer_head *bh;
1539
1540 mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA);
1541 while (towrite > 0) {
1542 tocopy = sb->s_blocksize - offset < towrite ?
1543 sb->s_blocksize - offset : towrite;
1544
1545 bh = ufs_bread(inode, blk, 1, &err);
1546 if (!bh)
1547 goto out;
1548 lock_buffer(bh);
1549 memcpy(bh->b_data+offset, data, tocopy);
1550 flush_dcache_page(bh->b_page);
1551 set_buffer_uptodate(bh);
1552 mark_buffer_dirty(bh);
1553 unlock_buffer(bh);
1554 brelse(bh);
1555 offset = 0;
1556 towrite -= tocopy;
1557 data += tocopy;
1558 blk++;
1559 }
1560out:
1561 if (len == towrite) {
1562 mutex_unlock(&inode->i_mutex);
1563 return err;
1564 }
1565 if (inode->i_size < off+len-towrite)
1566 i_size_write(inode, off+len-towrite);
1567 inode->i_version++;
1568 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
1569 mark_inode_dirty(inode);
1570 mutex_unlock(&inode->i_mutex);
1571 return len - towrite;
1572}
1573
1574#endif
1575
1576static int ufs_get_sb(struct file_system_type *fs_type, 1450static int ufs_get_sb(struct file_system_type *fs_type,
1577 int flags, const char *dev_name, void *data, struct vfsmount *mnt) 1451 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
1578{ 1452{