|
@@ -77,7 +77,6 @@
|
|
|
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/fs.h>
|
|
|
-#include <linux/quotaops.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/time.h>
|
|
|
#include <linux/stat.h>
|
|
@@ -1045,10 +1044,6 @@ magic_found:
|
|
|
*/
|
|
|
sb->s_op = &ufs_super_ops;
|
|
|
sb->s_export_op = &ufs_export_ops;
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
- sb->s_qcop = &dquot_quotactl_ops;
|
|
|
- sb->dq_op = NULL; /* &dquot_operations */
|
|
|
-#endif
|
|
|
|
|
|
sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic);
|
|
|
|
|
@@ -1231,8 +1226,6 @@ static void ufs_put_super(struct super_block *sb)
|
|
|
|
|
|
UFSD("ENTER\n");
|
|
|
|
|
|
- dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
|
|
-
|
|
|
if (sb->s_dirt)
|
|
|
ufs_write_super(sb);
|
|
|
|
|
@@ -1254,9 +1247,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
struct ufs_super_block_first * usb1;
|
|
|
struct ufs_super_block_third * usb3;
|
|
|
unsigned new_mount_opt, ufstype;
|
|
|
- int enable_quota = 0;
|
|
|
unsigned flags;
|
|
|
- int err;
|
|
|
|
|
|
lock_kernel();
|
|
|
lock_super(sb);
|
|
@@ -1297,13 +1288,6 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|
|
* fs was mouted as rw, remounting ro
|
|
|
*/
|
|
|
if (*mount_flags & MS_RDONLY) {
|
|
|
- err = dquot_suspend(sb, -1);
|
|
|
- if (err < 0) {
|
|
|
- unlock_super(sb);
|
|
|
- unlock_kernel();
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
ufs_put_super_internal(sb);
|
|
|
usb1->fs_time = cpu_to_fs32(sb, get_seconds());
|
|
|
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)
|
|
|
return -EPERM;
|
|
|
}
|
|
|
sb->s_flags &= ~MS_RDONLY;
|
|
|
- enable_quota = 1;
|
|
|
#endif
|
|
|
}
|
|
|
UFS_SB(sb)->s_mount_opt = new_mount_opt;
|
|
|
unlock_super(sb);
|
|
|
unlock_kernel();
|
|
|
- if (enable_quota)
|
|
|
- dquot_resume(sb, -1);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1453,126 +1434,19 @@ static void destroy_inodecache(void)
|
|
|
kmem_cache_destroy(ufs_inode_cachep);
|
|
|
}
|
|
|
|
|
|
-static void ufs_clear_inode(struct inode *inode)
|
|
|
-{
|
|
|
- dquot_drop(inode);
|
|
|
-}
|
|
|
-
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
-static ssize_t ufs_quota_read(struct super_block *, int, char *,size_t, loff_t);
|
|
|
-static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t, loff_t);
|
|
|
-#endif
|
|
|
-
|
|
|
static const struct super_operations ufs_super_ops = {
|
|
|
.alloc_inode = ufs_alloc_inode,
|
|
|
.destroy_inode = ufs_destroy_inode,
|
|
|
.write_inode = ufs_write_inode,
|
|
|
.delete_inode = ufs_delete_inode,
|
|
|
- .clear_inode = ufs_clear_inode,
|
|
|
.put_super = ufs_put_super,
|
|
|
.write_super = ufs_write_super,
|
|
|
.sync_fs = ufs_sync_fs,
|
|
|
.statfs = ufs_statfs,
|
|
|
.remount_fs = ufs_remount,
|
|
|
.show_options = ufs_show_options,
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
- .quota_read = ufs_quota_read,
|
|
|
- .quota_write = ufs_quota_write,
|
|
|
-#endif
|
|
|
};
|
|
|
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
-
|
|
|
-/* Read data from quotafile - avoid pagecache and such because we cannot afford
|
|
|
- * acquiring the locks... As quota files are never truncated and quota code
|
|
|
- * itself serializes the operations (and noone else should touch the files)
|
|
|
- * we don't have to be afraid of races */
|
|
|
-static ssize_t ufs_quota_read(struct super_block *sb, int type, char *data,
|
|
|
- size_t len, loff_t off)
|
|
|
-{
|
|
|
- struct inode *inode = sb_dqopt(sb)->files[type];
|
|
|
- sector_t blk = off >> sb->s_blocksize_bits;
|
|
|
- int err = 0;
|
|
|
- int offset = off & (sb->s_blocksize - 1);
|
|
|
- int tocopy;
|
|
|
- size_t toread;
|
|
|
- struct buffer_head *bh;
|
|
|
- loff_t i_size = i_size_read(inode);
|
|
|
-
|
|
|
- if (off > i_size)
|
|
|
- return 0;
|
|
|
- if (off+len > i_size)
|
|
|
- len = i_size-off;
|
|
|
- toread = len;
|
|
|
- while (toread > 0) {
|
|
|
- tocopy = sb->s_blocksize - offset < toread ?
|
|
|
- sb->s_blocksize - offset : toread;
|
|
|
-
|
|
|
- bh = ufs_bread(inode, blk, 0, &err);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- if (!bh) /* A hole? */
|
|
|
- memset(data, 0, tocopy);
|
|
|
- else {
|
|
|
- memcpy(data, bh->b_data+offset, tocopy);
|
|
|
- brelse(bh);
|
|
|
- }
|
|
|
- offset = 0;
|
|
|
- toread -= tocopy;
|
|
|
- data += tocopy;
|
|
|
- blk++;
|
|
|
- }
|
|
|
- return len;
|
|
|
-}
|
|
|
-
|
|
|
-/* Write to quotafile */
|
|
|
-static ssize_t ufs_quota_write(struct super_block *sb, int type,
|
|
|
- const char *data, size_t len, loff_t off)
|
|
|
-{
|
|
|
- struct inode *inode = sb_dqopt(sb)->files[type];
|
|
|
- sector_t blk = off >> sb->s_blocksize_bits;
|
|
|
- int err = 0;
|
|
|
- int offset = off & (sb->s_blocksize - 1);
|
|
|
- int tocopy;
|
|
|
- size_t towrite = len;
|
|
|
- struct buffer_head *bh;
|
|
|
-
|
|
|
- mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA);
|
|
|
- while (towrite > 0) {
|
|
|
- tocopy = sb->s_blocksize - offset < towrite ?
|
|
|
- sb->s_blocksize - offset : towrite;
|
|
|
-
|
|
|
- bh = ufs_bread(inode, blk, 1, &err);
|
|
|
- if (!bh)
|
|
|
- goto out;
|
|
|
- lock_buffer(bh);
|
|
|
- memcpy(bh->b_data+offset, data, tocopy);
|
|
|
- flush_dcache_page(bh->b_page);
|
|
|
- set_buffer_uptodate(bh);
|
|
|
- mark_buffer_dirty(bh);
|
|
|
- unlock_buffer(bh);
|
|
|
- brelse(bh);
|
|
|
- offset = 0;
|
|
|
- towrite -= tocopy;
|
|
|
- data += tocopy;
|
|
|
- blk++;
|
|
|
- }
|
|
|
-out:
|
|
|
- if (len == towrite) {
|
|
|
- mutex_unlock(&inode->i_mutex);
|
|
|
- return err;
|
|
|
- }
|
|
|
- if (inode->i_size < off+len-towrite)
|
|
|
- i_size_write(inode, off+len-towrite);
|
|
|
- inode->i_version++;
|
|
|
- inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
|
|
|
- mark_inode_dirty(inode);
|
|
|
- mutex_unlock(&inode->i_mutex);
|
|
|
- return len - towrite;
|
|
|
-}
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
static int ufs_get_sb(struct file_system_type *fs_type,
|
|
|
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
|
|
|
{
|