diff options
Diffstat (limited to 'fs/ufs/super.c')
-rw-r--r-- | fs/ufs/super.c | 112 |
1 files changed, 3 insertions, 109 deletions
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 14743d935a93..3ec5a9eb6efb 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> |
@@ -918,6 +917,7 @@ again: | |||
918 | sbi->s_bytesex = BYTESEX_LE; | 917 | sbi->s_bytesex = BYTESEX_LE; |
919 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { | 918 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { |
920 | case UFS_MAGIC: | 919 | case UFS_MAGIC: |
920 | case UFS_MAGIC_BW: | ||
921 | case UFS2_MAGIC: | 921 | case UFS2_MAGIC: |
922 | case UFS_MAGIC_LFN: | 922 | case UFS_MAGIC_LFN: |
923 | case UFS_MAGIC_FEA: | 923 | case UFS_MAGIC_FEA: |
@@ -927,6 +927,7 @@ again: | |||
927 | sbi->s_bytesex = BYTESEX_BE; | 927 | sbi->s_bytesex = BYTESEX_BE; |
928 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { | 928 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { |
929 | case UFS_MAGIC: | 929 | case UFS_MAGIC: |
930 | case UFS_MAGIC_BW: | ||
930 | case UFS2_MAGIC: | 931 | case UFS2_MAGIC: |
931 | case UFS_MAGIC_LFN: | 932 | case UFS_MAGIC_LFN: |
932 | case UFS_MAGIC_FEA: | 933 | case UFS_MAGIC_FEA: |
@@ -1045,7 +1046,7 @@ magic_found: | |||
1045 | */ | 1046 | */ |
1046 | sb->s_op = &ufs_super_ops; | 1047 | sb->s_op = &ufs_super_ops; |
1047 | sb->s_export_op = &ufs_export_ops; | 1048 | sb->s_export_op = &ufs_export_ops; |
1048 | sb->dq_op = NULL; /***/ | 1049 | |
1049 | sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic); | 1050 | sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic); |
1050 | 1051 | ||
1051 | uspi->s_sblkno = fs32_to_cpu(sb, usb1->fs_sblkno); | 1052 | uspi->s_sblkno = fs32_to_cpu(sb, usb1->fs_sblkno); |
@@ -1435,126 +1436,19 @@ static void destroy_inodecache(void) | |||
1435 | kmem_cache_destroy(ufs_inode_cachep); | 1436 | kmem_cache_destroy(ufs_inode_cachep); |
1436 | } | 1437 | } |
1437 | 1438 | ||
1438 | static void ufs_clear_inode(struct inode *inode) | ||
1439 | { | ||
1440 | dquot_drop(inode); | ||
1441 | } | ||
1442 | |||
1443 | #ifdef CONFIG_QUOTA | ||
1444 | static ssize_t ufs_quota_read(struct super_block *, int, char *,size_t, loff_t); | ||
1445 | static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t, loff_t); | ||
1446 | #endif | ||
1447 | |||
1448 | static const struct super_operations ufs_super_ops = { | 1439 | static const struct super_operations ufs_super_ops = { |
1449 | .alloc_inode = ufs_alloc_inode, | 1440 | .alloc_inode = ufs_alloc_inode, |
1450 | .destroy_inode = ufs_destroy_inode, | 1441 | .destroy_inode = ufs_destroy_inode, |
1451 | .write_inode = ufs_write_inode, | 1442 | .write_inode = ufs_write_inode, |
1452 | .delete_inode = ufs_delete_inode, | 1443 | .delete_inode = ufs_delete_inode, |
1453 | .clear_inode = ufs_clear_inode, | ||
1454 | .put_super = ufs_put_super, | 1444 | .put_super = ufs_put_super, |
1455 | .write_super = ufs_write_super, | 1445 | .write_super = ufs_write_super, |
1456 | .sync_fs = ufs_sync_fs, | 1446 | .sync_fs = ufs_sync_fs, |
1457 | .statfs = ufs_statfs, | 1447 | .statfs = ufs_statfs, |
1458 | .remount_fs = ufs_remount, | 1448 | .remount_fs = ufs_remount, |
1459 | .show_options = ufs_show_options, | 1449 | .show_options = ufs_show_options, |
1460 | #ifdef CONFIG_QUOTA | ||
1461 | .quota_read = ufs_quota_read, | ||
1462 | .quota_write = ufs_quota_write, | ||
1463 | #endif | ||
1464 | }; | 1450 | }; |
1465 | 1451 | ||
1466 | #ifdef CONFIG_QUOTA | ||
1467 | |||
1468 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | ||
1469 | * acquiring the locks... As quota files are never truncated and quota code | ||
1470 | * itself serializes the operations (and noone else should touch the files) | ||
1471 | * we don't have to be afraid of races */ | ||
1472 | static ssize_t ufs_quota_read(struct super_block *sb, int type, char *data, | ||
1473 | size_t len, loff_t off) | ||
1474 | { | ||
1475 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
1476 | sector_t blk = off >> sb->s_blocksize_bits; | ||
1477 | int err = 0; | ||
1478 | int offset = off & (sb->s_blocksize - 1); | ||
1479 | int tocopy; | ||
1480 | size_t toread; | ||
1481 | struct buffer_head *bh; | ||
1482 | loff_t i_size = i_size_read(inode); | ||
1483 | |||
1484 | if (off > i_size) | ||
1485 | return 0; | ||
1486 | if (off+len > i_size) | ||
1487 | len = i_size-off; | ||
1488 | toread = len; | ||
1489 | while (toread > 0) { | ||
1490 | tocopy = sb->s_blocksize - offset < toread ? | ||
1491 | sb->s_blocksize - offset : toread; | ||
1492 | |||
1493 | bh = ufs_bread(inode, blk, 0, &err); | ||
1494 | if (err) | ||
1495 | return err; | ||
1496 | if (!bh) /* A hole? */ | ||
1497 | memset(data, 0, tocopy); | ||
1498 | else { | ||
1499 | memcpy(data, bh->b_data+offset, tocopy); | ||
1500 | brelse(bh); | ||
1501 | } | ||
1502 | offset = 0; | ||
1503 | toread -= tocopy; | ||
1504 | data += tocopy; | ||
1505 | blk++; | ||
1506 | } | ||
1507 | return len; | ||
1508 | } | ||
1509 | |||
1510 | /* Write to quotafile */ | ||
1511 | static ssize_t ufs_quota_write(struct super_block *sb, int type, | ||
1512 | const char *data, size_t len, loff_t off) | ||
1513 | { | ||
1514 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
1515 | sector_t blk = off >> sb->s_blocksize_bits; | ||
1516 | int err = 0; | ||
1517 | int offset = off & (sb->s_blocksize - 1); | ||
1518 | int tocopy; | ||
1519 | size_t towrite = len; | ||
1520 | struct buffer_head *bh; | ||
1521 | |||
1522 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | ||
1523 | while (towrite > 0) { | ||
1524 | tocopy = sb->s_blocksize - offset < towrite ? | ||
1525 | sb->s_blocksize - offset : towrite; | ||
1526 | |||
1527 | bh = ufs_bread(inode, blk, 1, &err); | ||
1528 | if (!bh) | ||
1529 | goto out; | ||
1530 | lock_buffer(bh); | ||
1531 | memcpy(bh->b_data+offset, data, tocopy); | ||
1532 | flush_dcache_page(bh->b_page); | ||
1533 | set_buffer_uptodate(bh); | ||
1534 | mark_buffer_dirty(bh); | ||
1535 | unlock_buffer(bh); | ||
1536 | brelse(bh); | ||
1537 | offset = 0; | ||
1538 | towrite -= tocopy; | ||
1539 | data += tocopy; | ||
1540 | blk++; | ||
1541 | } | ||
1542 | out: | ||
1543 | if (len == towrite) { | ||
1544 | mutex_unlock(&inode->i_mutex); | ||
1545 | return err; | ||
1546 | } | ||
1547 | if (inode->i_size < off+len-towrite) | ||
1548 | i_size_write(inode, off+len-towrite); | ||
1549 | inode->i_version++; | ||
1550 | inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; | ||
1551 | mark_inode_dirty(inode); | ||
1552 | mutex_unlock(&inode->i_mutex); | ||
1553 | return len - towrite; | ||
1554 | } | ||
1555 | |||
1556 | #endif | ||
1557 | |||
1558 | static int ufs_get_sb(struct file_system_type *fs_type, | 1452 | static int ufs_get_sb(struct file_system_type *fs_type, |
1559 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 1453 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) |
1560 | { | 1454 | { |