diff options
-rw-r--r-- | fs/dquot.c | 23 | ||||
-rw-r--r-- | fs/ext3/super.c | 18 | ||||
-rw-r--r-- | fs/reiserfs/super.c | 21 | ||||
-rw-r--r-- | include/linux/quotaops.h | 3 |
4 files changed, 26 insertions, 39 deletions
diff --git a/fs/dquot.c b/fs/dquot.c index 3995ce7907cc..343c03655619 100644 --- a/fs/dquot.c +++ b/fs/dquot.c | |||
@@ -1519,14 +1519,29 @@ out_path: | |||
1519 | * This function is used when filesystem needs to initialize quotas | 1519 | * This function is used when filesystem needs to initialize quotas |
1520 | * during mount time. | 1520 | * during mount time. |
1521 | */ | 1521 | */ |
1522 | int vfs_quota_on_mount(int type, int format_id, struct dentry *dentry) | 1522 | int vfs_quota_on_mount(struct super_block *sb, char *qf_name, |
1523 | int format_id, int type) | ||
1523 | { | 1524 | { |
1525 | struct qstr name = {.name = qf_name, .len = 0, .len = strlen(qf_name)}; | ||
1526 | struct dentry *dentry; | ||
1524 | int error; | 1527 | int error; |
1525 | 1528 | ||
1529 | dentry = lookup_hash(&name, sb->s_root); | ||
1530 | if (IS_ERR(dentry)) | ||
1531 | return PTR_ERR(dentry); | ||
1532 | |||
1526 | error = security_quota_on(dentry); | 1533 | error = security_quota_on(dentry); |
1527 | if (error) | 1534 | if (!error) |
1528 | return error; | 1535 | error = vfs_quota_on_inode(dentry->d_inode, type, format_id); |
1529 | return vfs_quota_on_inode(dentry->d_inode, type, format_id); | 1536 | |
1537 | /* | ||
1538 | * Now invalidate and put the dentry - quota got its own reference | ||
1539 | * to inode and dentry has at least wrong hash so we had better | ||
1540 | * throw it away. | ||
1541 | */ | ||
1542 | d_invalidate(dentry); | ||
1543 | dput(dentry); | ||
1544 | return error; | ||
1530 | } | 1545 | } |
1531 | 1546 | ||
1532 | /* Generic routine for getting common part of quota structure */ | 1547 | /* Generic routine for getting common part of quota structure */ |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 981ccb233ef5..9630fbfdc24a 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -2348,22 +2348,8 @@ static int ext3_write_info(struct super_block *sb, int type) | |||
2348 | */ | 2348 | */ |
2349 | static int ext3_quota_on_mount(struct super_block *sb, int type) | 2349 | static int ext3_quota_on_mount(struct super_block *sb, int type) |
2350 | { | 2350 | { |
2351 | int err; | 2351 | return vfs_quota_on_mount(sb, EXT3_SB(sb)->s_qf_names[type], |
2352 | struct dentry *dentry; | 2352 | EXT3_SB(sb)->s_jquota_fmt, type); |
2353 | struct qstr name = { .name = EXT3_SB(sb)->s_qf_names[type], | ||
2354 | .hash = 0, | ||
2355 | .len = strlen(EXT3_SB(sb)->s_qf_names[type])}; | ||
2356 | |||
2357 | dentry = lookup_hash(&name, sb->s_root); | ||
2358 | if (IS_ERR(dentry)) | ||
2359 | return PTR_ERR(dentry); | ||
2360 | err = vfs_quota_on_mount(type, EXT3_SB(sb)->s_jquota_fmt, dentry); | ||
2361 | /* Now invalidate and put the dentry - quota got its own reference | ||
2362 | * to inode and dentry has at least wrong hash so we had better | ||
2363 | * throw it away */ | ||
2364 | d_invalidate(dentry); | ||
2365 | dput(dentry); | ||
2366 | return err; | ||
2367 | } | 2353 | } |
2368 | 2354 | ||
2369 | /* | 2355 | /* |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b35b87744983..aae0779ed5b4 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -1932,27 +1932,12 @@ static int reiserfs_write_info(struct super_block *sb, int type) | |||
1932 | } | 1932 | } |
1933 | 1933 | ||
1934 | /* | 1934 | /* |
1935 | * Turn on quotas during mount time - we need to find | 1935 | * Turn on quotas during mount time - we need to find the quota file and such... |
1936 | * the quota file and such... | ||
1937 | */ | 1936 | */ |
1938 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) | 1937 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) |
1939 | { | 1938 | { |
1940 | int err; | 1939 | return vfs_quota_on_mount(sb, REISERFS_SB(sb)->s_qf_names[type], |
1941 | struct dentry *dentry; | 1940 | REISERFS_SB(sb)->s_jquota_fmt, type); |
1942 | struct qstr name = { .name = REISERFS_SB(sb)->s_qf_names[type], | ||
1943 | .hash = 0, | ||
1944 | .len = strlen(REISERFS_SB(sb)->s_qf_names[type])}; | ||
1945 | |||
1946 | dentry = lookup_hash(&name, sb->s_root); | ||
1947 | if (IS_ERR(dentry)) | ||
1948 | return PTR_ERR(dentry); | ||
1949 | err = vfs_quota_on_mount(type, REISERFS_SB(sb)->s_jquota_fmt, dentry); | ||
1950 | /* Now invalidate and put the dentry - quota got its own reference | ||
1951 | * to inode and dentry has at least wrong hash so we had better | ||
1952 | * throw it away */ | ||
1953 | d_invalidate(dentry); | ||
1954 | dput(dentry); | ||
1955 | return err; | ||
1956 | } | 1941 | } |
1957 | 1942 | ||
1958 | /* | 1943 | /* |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index e57baa85e744..d211507ab246 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -39,7 +39,8 @@ extern int dquot_commit_info(struct super_block *sb, int type); | |||
39 | extern int dquot_mark_dquot_dirty(struct dquot *dquot); | 39 | extern int dquot_mark_dquot_dirty(struct dquot *dquot); |
40 | 40 | ||
41 | extern int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path); | 41 | extern int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path); |
42 | extern int vfs_quota_on_mount(int type, int format_id, struct dentry *dentry); | 42 | extern int vfs_quota_on_mount(struct super_block *sb, char *qf_name, |
43 | int format_id, int type); | ||
43 | extern int vfs_quota_off(struct super_block *sb, int type); | 44 | extern int vfs_quota_off(struct super_block *sb, int type); |
44 | #define vfs_quota_off_mount(sb, type) vfs_quota_off(sb, type) | 45 | #define vfs_quota_off_mount(sb, type) vfs_quota_off(sb, type) |
45 | extern int vfs_quota_sync(struct super_block *sb, int type); | 46 | extern int vfs_quota_sync(struct super_block *sb, int type); |