ufs: Remove dead quota code
UFS quota is non-functional at least since 2.6.12 because dq_op was set to NULL. Since the filesystem exists mainly to allow cooperation with Solaris and quota format isn't standard, just remove the dead code. CC: Evgeniy Dushistov <dushistov@mail.ru> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
3635046281
commit
8f45c33dec
7 changed files with 1 additions and 195 deletions
|
@ -12,7 +12,6 @@
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
@ -85,9 +84,6 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
|
||||||
"bit already cleared for fragment %u", i);
|
"bit already cleared for fragment %u", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
dquot_free_block(inode, count);
|
|
||||||
|
|
||||||
|
|
||||||
fs32_add(sb, &ucg->cg_cs.cs_nffree, count);
|
fs32_add(sb, &ucg->cg_cs.cs_nffree, count);
|
||||||
uspi->cs_total.cs_nffree += count;
|
uspi->cs_total.cs_nffree += count;
|
||||||
fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count);
|
fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count);
|
||||||
|
@ -195,7 +191,6 @@ do_more:
|
||||||
ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
|
ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
|
||||||
if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)
|
if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)
|
||||||
ufs_clusteracct (sb, ucpi, blkno, 1);
|
ufs_clusteracct (sb, ucpi, blkno, 1);
|
||||||
dquot_free_block(inode, uspi->s_fpb);
|
|
||||||
|
|
||||||
fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1);
|
fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1);
|
||||||
uspi->cs_total.cs_nbfree++;
|
uspi->cs_total.cs_nbfree++;
|
||||||
|
@ -511,7 +506,6 @@ static u64 ufs_add_fragments(struct inode *inode, u64 fragment,
|
||||||
struct ufs_cg_private_info * ucpi;
|
struct ufs_cg_private_info * ucpi;
|
||||||
struct ufs_cylinder_group * ucg;
|
struct ufs_cylinder_group * ucg;
|
||||||
unsigned cgno, fragno, fragoff, count, fragsize, i;
|
unsigned cgno, fragno, fragoff, count, fragsize, i;
|
||||||
int ret;
|
|
||||||
|
|
||||||
UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n",
|
UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n",
|
||||||
(unsigned long long)fragment, oldcount, newcount);
|
(unsigned long long)fragment, oldcount, newcount);
|
||||||
|
@ -557,11 +551,6 @@ static u64 ufs_add_fragments(struct inode *inode, u64 fragment,
|
||||||
fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1);
|
fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1);
|
||||||
for (i = oldcount; i < newcount; i++)
|
for (i = oldcount; i < newcount; i++)
|
||||||
ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i);
|
ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i);
|
||||||
ret = dquot_alloc_block(inode, count);
|
|
||||||
if (ret) {
|
|
||||||
*err = ret;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs32_sub(sb, &ucg->cg_cs.cs_nffree, count);
|
fs32_sub(sb, &ucg->cg_cs.cs_nffree, count);
|
||||||
fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count);
|
fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count);
|
||||||
|
@ -598,7 +587,6 @@ static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno,
|
||||||
struct ufs_cylinder_group * ucg;
|
struct ufs_cylinder_group * ucg;
|
||||||
unsigned oldcg, i, j, k, allocsize;
|
unsigned oldcg, i, j, k, allocsize;
|
||||||
u64 result;
|
u64 result;
|
||||||
int ret;
|
|
||||||
|
|
||||||
UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n",
|
UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n",
|
||||||
inode->i_ino, cgno, (unsigned long long)goal, count);
|
inode->i_ino, cgno, (unsigned long long)goal, count);
|
||||||
|
@ -667,7 +655,6 @@ cg_found:
|
||||||
for (i = count; i < uspi->s_fpb; i++)
|
for (i = count; i < uspi->s_fpb; i++)
|
||||||
ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i);
|
ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i);
|
||||||
i = uspi->s_fpb - count;
|
i = uspi->s_fpb - count;
|
||||||
dquot_free_block(inode, i);
|
|
||||||
|
|
||||||
fs32_add(sb, &ucg->cg_cs.cs_nffree, i);
|
fs32_add(sb, &ucg->cg_cs.cs_nffree, i);
|
||||||
uspi->cs_total.cs_nffree += i;
|
uspi->cs_total.cs_nffree += i;
|
||||||
|
@ -679,11 +666,6 @@ cg_found:
|
||||||
result = ufs_bitmap_search (sb, ucpi, goal, allocsize);
|
result = ufs_bitmap_search (sb, ucpi, goal, allocsize);
|
||||||
if (result == INVBLOCK)
|
if (result == INVBLOCK)
|
||||||
return 0;
|
return 0;
|
||||||
ret = dquot_alloc_block(inode, count);
|
|
||||||
if (ret) {
|
|
||||||
*err = ret;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i);
|
ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i);
|
||||||
|
|
||||||
|
@ -718,7 +700,6 @@ static u64 ufs_alloccg_block(struct inode *inode,
|
||||||
struct ufs_super_block_first * usb1;
|
struct ufs_super_block_first * usb1;
|
||||||
struct ufs_cylinder_group * ucg;
|
struct ufs_cylinder_group * ucg;
|
||||||
u64 result, blkno;
|
u64 result, blkno;
|
||||||
int ret;
|
|
||||||
|
|
||||||
UFSD("ENTER, goal %llu\n", (unsigned long long)goal);
|
UFSD("ENTER, goal %llu\n", (unsigned long long)goal);
|
||||||
|
|
||||||
|
@ -752,11 +733,6 @@ gotit:
|
||||||
ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
|
ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno);
|
||||||
if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)
|
if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD)
|
||||||
ufs_clusteracct (sb, ucpi, blkno, -1);
|
ufs_clusteracct (sb, ucpi, blkno, -1);
|
||||||
ret = dquot_alloc_block(inode, uspi->s_fpb);
|
|
||||||
if (ret) {
|
|
||||||
*err = ret;
|
|
||||||
return INVBLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1);
|
fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1);
|
||||||
uspi->cs_total.cs_nbfree--;
|
uspi->cs_total.cs_nbfree--;
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
|
|
||||||
#include "ufs_fs.h"
|
#include "ufs_fs.h"
|
||||||
#include "ufs.h"
|
#include "ufs.h"
|
||||||
|
@ -41,7 +40,7 @@ const struct file_operations ufs_file_operations = {
|
||||||
.write = do_sync_write,
|
.write = do_sync_write,
|
||||||
.aio_write = generic_file_aio_write,
|
.aio_write = generic_file_aio_write,
|
||||||
.mmap = generic_file_mmap,
|
.mmap = generic_file_mmap,
|
||||||
.open = dquot_file_open,
|
.open = generic_file_open,
|
||||||
.fsync = simple_fsync,
|
.fsync = simple_fsync,
|
||||||
.splice_read = generic_file_splice_read,
|
.splice_read = generic_file_splice_read,
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
@ -95,9 +94,6 @@ void ufs_free_inode (struct inode * inode)
|
||||||
|
|
||||||
is_directory = S_ISDIR(inode->i_mode);
|
is_directory = S_ISDIR(inode->i_mode);
|
||||||
|
|
||||||
dquot_free_inode(inode);
|
|
||||||
dquot_drop(inode);
|
|
||||||
|
|
||||||
clear_inode (inode);
|
clear_inode (inode);
|
||||||
|
|
||||||
if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit))
|
if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit))
|
||||||
|
@ -347,21 +343,12 @@ cg_found:
|
||||||
|
|
||||||
unlock_super (sb);
|
unlock_super (sb);
|
||||||
|
|
||||||
dquot_initialize(inode);
|
|
||||||
err = dquot_alloc_inode(inode);
|
|
||||||
if (err) {
|
|
||||||
dquot_drop(inode);
|
|
||||||
goto fail_without_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
UFSD("allocating inode %lu\n", inode->i_ino);
|
UFSD("allocating inode %lu\n", inode->i_ino);
|
||||||
UFSD("EXIT\n");
|
UFSD("EXIT\n");
|
||||||
return inode;
|
return inode;
|
||||||
|
|
||||||
fail_remove_inode:
|
fail_remove_inode:
|
||||||
unlock_super(sb);
|
unlock_super(sb);
|
||||||
fail_without_unlock:
|
|
||||||
inode->i_flags |= S_NOQUOTA;
|
|
||||||
inode->i_nlink = 0;
|
inode->i_nlink = 0;
|
||||||
iput(inode);
|
iput(inode);
|
||||||
UFSD("EXIT (FAILED): err %d\n", err);
|
UFSD("EXIT (FAILED): err %d\n", err);
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
|
|
||||||
#include "ufs_fs.h"
|
#include "ufs_fs.h"
|
||||||
#include "ufs.h"
|
#include "ufs.h"
|
||||||
|
@ -910,9 +909,6 @@ void ufs_delete_inode (struct inode * inode)
|
||||||
{
|
{
|
||||||
loff_t old_i_size;
|
loff_t old_i_size;
|
||||||
|
|
||||||
if (!is_bad_inode(inode))
|
|
||||||
dquot_initialize(inode);
|
|
||||||
|
|
||||||
truncate_inode_pages(&inode->i_data, 0);
|
truncate_inode_pages(&inode->i_data, 0);
|
||||||
if (is_bad_inode(inode))
|
if (is_bad_inode(inode))
|
||||||
goto no_delete;
|
goto no_delete;
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
|
|
||||||
#include "ufs_fs.h"
|
#include "ufs_fs.h"
|
||||||
#include "ufs.h"
|
#include "ufs.h"
|
||||||
|
@ -86,8 +85,6 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, int mode,
|
||||||
|
|
||||||
UFSD("BEGIN\n");
|
UFSD("BEGIN\n");
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
inode = ufs_new_inode(dir, mode);
|
inode = ufs_new_inode(dir, mode);
|
||||||
err = PTR_ERR(inode);
|
err = PTR_ERR(inode);
|
||||||
|
|
||||||
|
@ -112,8 +109,6 @@ static int ufs_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t
|
||||||
if (!old_valid_dev(rdev))
|
if (!old_valid_dev(rdev))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
inode = ufs_new_inode(dir, mode);
|
inode = ufs_new_inode(dir, mode);
|
||||||
err = PTR_ERR(inode);
|
err = PTR_ERR(inode);
|
||||||
if (!IS_ERR(inode)) {
|
if (!IS_ERR(inode)) {
|
||||||
|
@ -138,8 +133,6 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
|
||||||
if (l > sb->s_blocksize)
|
if (l > sb->s_blocksize)
|
||||||
goto out_notlocked;
|
goto out_notlocked;
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO);
|
inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO);
|
||||||
err = PTR_ERR(inode);
|
err = PTR_ERR(inode);
|
||||||
|
@ -185,8 +178,6 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir,
|
||||||
return -EMLINK;
|
return -EMLINK;
|
||||||
}
|
}
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
inode->i_ctime = CURRENT_TIME_SEC;
|
inode->i_ctime = CURRENT_TIME_SEC;
|
||||||
inode_inc_link_count(inode);
|
inode_inc_link_count(inode);
|
||||||
atomic_inc(&inode->i_count);
|
atomic_inc(&inode->i_count);
|
||||||
|
@ -204,8 +195,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
|
||||||
if (dir->i_nlink >= UFS_LINK_MAX)
|
if (dir->i_nlink >= UFS_LINK_MAX)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
inode_inc_link_count(dir);
|
inode_inc_link_count(dir);
|
||||||
|
|
||||||
|
@ -250,8 +239,6 @@ static int ufs_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
struct page *page;
|
struct page *page;
|
||||||
int err = -ENOENT;
|
int err = -ENOENT;
|
||||||
|
|
||||||
dquot_initialize(dir);
|
|
||||||
|
|
||||||
de = ufs_find_entry(dir, &dentry->d_name, &page);
|
de = ufs_find_entry(dir, &dentry->d_name, &page);
|
||||||
if (!de)
|
if (!de)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -296,9 +283,6 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
struct ufs_dir_entry *old_de;
|
struct ufs_dir_entry *old_de;
|
||||||
int err = -ENOENT;
|
int err = -ENOENT;
|
||||||
|
|
||||||
dquot_initialize(old_dir);
|
|
||||||
dquot_initialize(new_dir);
|
|
||||||
|
|
||||||
old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page);
|
old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page);
|
||||||
if (!old_de)
|
if (!old_de)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
126
fs/ufs/super.c
126
fs/ufs/super.c
|
@ -77,7 +77,6 @@
|
||||||
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
|
@ -1045,10 +1044,6 @@ magic_found:
|
||||||
*/
|
*/
|
||||||
sb->s_op = &ufs_super_ops;
|
sb->s_op = &ufs_super_ops;
|
||||||
sb->s_export_op = &ufs_export_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);
|
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");
|
UFSD("ENTER\n");
|
||||||
|
|
||||||
dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
|
||||||
|
|
||||||
if (sb->s_dirt)
|
if (sb->s_dirt)
|
||||||
ufs_write_super(sb);
|
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_first * usb1;
|
||||||
struct ufs_super_block_third * usb3;
|
struct ufs_super_block_third * usb3;
|
||||||
unsigned new_mount_opt, ufstype;
|
unsigned new_mount_opt, ufstype;
|
||||||
int enable_quota = 0;
|
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
int err;
|
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
lock_super(sb);
|
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
|
* fs was mouted as rw, remounting ro
|
||||||
*/
|
*/
|
||||||
if (*mount_flags & MS_RDONLY) {
|
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);
|
ufs_put_super_internal(sb);
|
||||||
usb1->fs_time = cpu_to_fs32(sb, get_seconds());
|
usb1->fs_time = cpu_to_fs32(sb, get_seconds());
|
||||||
if ((flags & UFS_ST_MASK) == UFS_ST_SUN
|
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;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
sb->s_flags &= ~MS_RDONLY;
|
sb->s_flags &= ~MS_RDONLY;
|
||||||
enable_quota = 1;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
UFS_SB(sb)->s_mount_opt = new_mount_opt;
|
UFS_SB(sb)->s_mount_opt = new_mount_opt;
|
||||||
unlock_super(sb);
|
unlock_super(sb);
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
if (enable_quota)
|
|
||||||
dquot_resume(sb, -1);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1453,126 +1434,19 @@ static void destroy_inodecache(void)
|
||||||
kmem_cache_destroy(ufs_inode_cachep);
|
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 = {
|
static const struct super_operations ufs_super_ops = {
|
||||||
.alloc_inode = ufs_alloc_inode,
|
.alloc_inode = ufs_alloc_inode,
|
||||||
.destroy_inode = ufs_destroy_inode,
|
.destroy_inode = ufs_destroy_inode,
|
||||||
.write_inode = ufs_write_inode,
|
.write_inode = ufs_write_inode,
|
||||||
.delete_inode = ufs_delete_inode,
|
.delete_inode = ufs_delete_inode,
|
||||||
.clear_inode = ufs_clear_inode,
|
|
||||||
.put_super = ufs_put_super,
|
.put_super = ufs_put_super,
|
||||||
.write_super = ufs_write_super,
|
.write_super = ufs_write_super,
|
||||||
.sync_fs = ufs_sync_fs,
|
.sync_fs = ufs_sync_fs,
|
||||||
.statfs = ufs_statfs,
|
.statfs = ufs_statfs,
|
||||||
.remount_fs = ufs_remount,
|
.remount_fs = ufs_remount,
|
||||||
.show_options = ufs_show_options,
|
.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,
|
static int ufs_get_sb(struct file_system_type *fs_type,
|
||||||
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
|
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/quotaops.h>
|
|
||||||
|
|
||||||
#include "ufs_fs.h"
|
#include "ufs_fs.h"
|
||||||
#include "ufs.h"
|
#include "ufs.h"
|
||||||
|
@ -518,15 +517,6 @@ int ufs_setattr(struct dentry *dentry, struct iattr *attr)
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if (is_quota_modification(inode, attr))
|
|
||||||
dquot_initialize(inode);
|
|
||||||
|
|
||||||
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
|
|
||||||
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
|
|
||||||
error = dquot_transfer(inode, attr);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) {
|
if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) {
|
||||||
loff_t old_i_size = inode->i_size;
|
loff_t old_i_size = inode->i_size;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue