Skip to content

Commit

Permalink
quota: move unmount handling into the filesystem
Browse files Browse the repository at this point in the history
Currently the VFS calls into the quotactl interface for unmounting
filesystems.  This means filesystems with their own quota handling
can't easily distinguish between user-space originating quotaoff
and an unount.  Instead move the responsibily of the unmount handling
into the filesystem to be consistent with all other dquot handling.

Note that we do call dquot_disable a lot later now, e.g. after
a sync_filesystem.  But this is fine as the quota code does all its
writes via blockdev's mapping and that is synced even later.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Christoph Hellwig authored and Jan Kara committed May 24, 2010
1 parent 0f0dd62 commit e0ccfd9
Show file tree
Hide file tree
Showing 9 changed files with 14 additions and 16 deletions.
2 changes: 2 additions & 0 deletions fs/ext2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ static void ext2_put_super (struct super_block * sb)
int i;
struct ext2_sb_info *sbi = EXT2_SB(sb);

dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

if (sb->s_dirt)
ext2_write_super(sb);

Expand Down
2 changes: 2 additions & 0 deletions fs/ext3/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,8 @@ static void ext3_put_super (struct super_block * sb)
struct ext3_super_block *es = sbi->s_es;
int i, err;

dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

lock_kernel();

ext3_xattr_put_super(sb);
Expand Down
2 changes: 2 additions & 0 deletions fs/ext4/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,8 @@ static void ext4_put_super(struct super_block *sb)
struct ext4_super_block *es = sbi->s_es;
int i, err;

dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

flush_workqueue(sbi->dio_unwritten_wq);
destroy_workqueue(sbi->dio_unwritten_wq);

Expand Down
2 changes: 2 additions & 0 deletions fs/jfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ static void jfs_put_super(struct super_block *sb)

jfs_info("In jfs_put_super");

dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

lock_kernel();

rc = jfs_umount(sb);
Expand Down
2 changes: 2 additions & 0 deletions fs/reiserfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,8 @@ static void reiserfs_put_super(struct super_block *s)
struct reiserfs_transaction_handle th;
th.t_trans_id = 0;

dquot_disable(s, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

reiserfs_write_lock(s);

if (s->s_dirt)
Expand Down
1 change: 0 additions & 1 deletion fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,6 @@ void deactivate_locked_super(struct super_block *s)
{
struct file_system_type *fs = s->s_type;
if (atomic_dec_and_test(&s->s_active)) {
vfs_dq_off(s, 0);
fs->kill_sb(s);
put_filesystem(fs);
put_super(s);
Expand Down
2 changes: 2 additions & 0 deletions fs/udf/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2102,6 +2102,8 @@ static void udf_put_super(struct super_block *sb)
int i;
struct udf_sb_info *sbi;

dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);

sbi = UDF_SB(sb);

lock_kernel();
Expand Down
2 changes: 2 additions & 0 deletions fs/ufs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,8 @@ 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);

Expand Down
15 changes: 0 additions & 15 deletions include/linux/quotaops.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,16 +156,6 @@ extern const struct quotactl_ops vfs_quotactl_ops;
#define sb_dquot_ops (&dquot_operations)
#define sb_quotactl_ops (&vfs_quotactl_ops)

/* Cannot be called inside a transaction */
static inline int vfs_dq_off(struct super_block *sb, int remount)
{
int ret = -ENOSYS;

if (sb->s_qcop && sb->s_qcop->quota_off)
ret = sb->s_qcop->quota_off(sb, -1, remount);
return ret;
}

#else

static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
Expand Down Expand Up @@ -232,11 +222,6 @@ static inline void dquot_free_inode(const struct inode *inode)
{
}

static inline int vfs_dq_off(struct super_block *sb, int remount)
{
return 0;
}

static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
{
return 0;
Expand Down

0 comments on commit e0ccfd9

Please sign in to comment.