diff options
| -rw-r--r-- | fs/ext3/super.c | 2 | ||||
| -rw-r--r-- | fs/ext4/super.c | 42 | ||||
| -rw-r--r-- | fs/isofs/util.c | 18 | ||||
| -rw-r--r-- | fs/ocfs2/quota.h | 1 | ||||
| -rw-r--r-- | fs/ocfs2/quota_local.c | 14 | ||||
| -rw-r--r-- | fs/ocfs2/super.c | 32 | ||||
| -rw-r--r-- | fs/quota/dquot.c | 107 | ||||
| -rw-r--r-- | fs/quota/quota.c | 52 | ||||
| -rw-r--r-- | fs/quota/quota_v1.c | 4 | ||||
| -rw-r--r-- | fs/quota/quota_v2.c | 16 | ||||
| -rw-r--r-- | fs/udf/Kconfig | 10 | ||||
| -rw-r--r-- | fs/udf/inode.c | 32 | ||||
| -rw-r--r-- | fs/udf/super.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_qm_syscalls.c | 74 | ||||
| -rw-r--r-- | fs/xfs/xfs_quotaops.c | 59 | ||||
| -rw-r--r-- | include/linux/dqblk_v1.h | 3 | ||||
| -rw-r--r-- | include/linux/jbd.h | 9 | ||||
| -rw-r--r-- | include/linux/jbd2.h | 9 | ||||
| -rw-r--r-- | include/linux/quota.h | 22 | ||||
| -rw-r--r-- | include/linux/quotaops.h | 3 | ||||
| -rw-r--r-- | include/uapi/linux/quota.h | 14 |
21 files changed, 284 insertions, 244 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 9b4e7d750d4f..d4dbf3c259b3 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -466,6 +466,8 @@ static void ext3_put_super (struct super_block * sb) | |||
| 466 | } | 466 | } |
| 467 | sb->s_fs_info = NULL; | 467 | sb->s_fs_info = NULL; |
| 468 | kfree(sbi->s_blockgroup_lock); | 468 | kfree(sbi->s_blockgroup_lock); |
| 469 | mutex_destroy(&sbi->s_orphan_lock); | ||
| 470 | mutex_destroy(&sbi->s_resize_lock); | ||
| 469 | kfree(sbi); | 471 | kfree(sbi); |
| 470 | } | 472 | } |
| 471 | 473 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 74c5f53595fb..ac64edbe501d 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -1046,10 +1046,7 @@ static int ext4_mark_dquot_dirty(struct dquot *dquot); | |||
| 1046 | static int ext4_write_info(struct super_block *sb, int type); | 1046 | static int ext4_write_info(struct super_block *sb, int type); |
| 1047 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, | 1047 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, |
| 1048 | struct path *path); | 1048 | struct path *path); |
| 1049 | static int ext4_quota_on_sysfile(struct super_block *sb, int type, | ||
| 1050 | int format_id); | ||
| 1051 | static int ext4_quota_off(struct super_block *sb, int type); | 1049 | static int ext4_quota_off(struct super_block *sb, int type); |
| 1052 | static int ext4_quota_off_sysfile(struct super_block *sb, int type); | ||
| 1053 | static int ext4_quota_on_mount(struct super_block *sb, int type); | 1050 | static int ext4_quota_on_mount(struct super_block *sb, int type); |
| 1054 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, | 1051 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, |
| 1055 | size_t len, loff_t off); | 1052 | size_t len, loff_t off); |
| @@ -1084,16 +1081,6 @@ static const struct quotactl_ops ext4_qctl_operations = { | |||
| 1084 | .get_dqblk = dquot_get_dqblk, | 1081 | .get_dqblk = dquot_get_dqblk, |
| 1085 | .set_dqblk = dquot_set_dqblk | 1082 | .set_dqblk = dquot_set_dqblk |
| 1086 | }; | 1083 | }; |
| 1087 | |||
| 1088 | static const struct quotactl_ops ext4_qctl_sysfile_operations = { | ||
| 1089 | .quota_on_meta = ext4_quota_on_sysfile, | ||
| 1090 | .quota_off = ext4_quota_off_sysfile, | ||
| 1091 | .quota_sync = dquot_quota_sync, | ||
| 1092 | .get_info = dquot_get_dqinfo, | ||
| 1093 | .set_info = dquot_set_dqinfo, | ||
| 1094 | .get_dqblk = dquot_get_dqblk, | ||
| 1095 | .set_dqblk = dquot_set_dqblk | ||
| 1096 | }; | ||
| 1097 | #endif | 1084 | #endif |
| 1098 | 1085 | ||
| 1099 | static const struct super_operations ext4_sops = { | 1086 | static const struct super_operations ext4_sops = { |
| @@ -3935,7 +3922,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3935 | #ifdef CONFIG_QUOTA | 3922 | #ifdef CONFIG_QUOTA |
| 3936 | sb->dq_op = &ext4_quota_operations; | 3923 | sb->dq_op = &ext4_quota_operations; |
| 3937 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) | 3924 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) |
| 3938 | sb->s_qcop = &ext4_qctl_sysfile_operations; | 3925 | sb->s_qcop = &dquot_quotactl_sysfile_ops; |
| 3939 | else | 3926 | else |
| 3940 | sb->s_qcop = &ext4_qctl_operations; | 3927 | sb->s_qcop = &ext4_qctl_operations; |
| 3941 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; | 3928 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; |
| @@ -5288,21 +5275,6 @@ static int ext4_enable_quotas(struct super_block *sb) | |||
| 5288 | return 0; | 5275 | return 0; |
| 5289 | } | 5276 | } |
| 5290 | 5277 | ||
| 5291 | /* | ||
| 5292 | * quota_on function that is used when QUOTA feature is set. | ||
| 5293 | */ | ||
| 5294 | static int ext4_quota_on_sysfile(struct super_block *sb, int type, | ||
| 5295 | int format_id) | ||
| 5296 | { | ||
| 5297 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) | ||
| 5298 | return -EINVAL; | ||
| 5299 | |||
| 5300 | /* | ||
| 5301 | * USAGE was enabled at mount time. Only need to enable LIMITS now. | ||
| 5302 | */ | ||
| 5303 | return ext4_quota_enable(sb, type, format_id, DQUOT_LIMITS_ENABLED); | ||
| 5304 | } | ||
| 5305 | |||
| 5306 | static int ext4_quota_off(struct super_block *sb, int type) | 5278 | static int ext4_quota_off(struct super_block *sb, int type) |
| 5307 | { | 5279 | { |
| 5308 | struct inode *inode = sb_dqopt(sb)->files[type]; | 5280 | struct inode *inode = sb_dqopt(sb)->files[type]; |
| @@ -5329,18 +5301,6 @@ out: | |||
| 5329 | return dquot_quota_off(sb, type); | 5301 | return dquot_quota_off(sb, type); |
| 5330 | } | 5302 | } |
| 5331 | 5303 | ||
| 5332 | /* | ||
| 5333 | * quota_off function that is used when QUOTA feature is set. | ||
| 5334 | */ | ||
| 5335 | static int ext4_quota_off_sysfile(struct super_block *sb, int type) | ||
| 5336 | { | ||
| 5337 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) | ||
| 5338 | return -EINVAL; | ||
| 5339 | |||
| 5340 | /* Disable only the limits. */ | ||
| 5341 | return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
| 5342 | } | ||
| 5343 | |||
| 5344 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | 5304 | /* Read data from quotafile - avoid pagecache and such because we cannot afford |
| 5345 | * acquiring the locks... As quota files are never truncated and quota code | 5305 | * acquiring the locks... As quota files are never truncated and quota code |
| 5346 | * itself serializes the operations (and no one else should touch the files) | 5306 | * itself serializes the operations (and no one else should touch the files) |
diff --git a/fs/isofs/util.c b/fs/isofs/util.c index 01e1ee7a998b..005a15cfd30a 100644 --- a/fs/isofs/util.c +++ b/fs/isofs/util.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * linux/fs/isofs/util.c | 2 | * linux/fs/isofs/util.c |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #include <linux/time.h> | ||
| 5 | #include "isofs.h" | 6 | #include "isofs.h" |
| 6 | 7 | ||
| 7 | /* | 8 | /* |
| @@ -17,9 +18,9 @@ | |||
| 17 | int iso_date(char * p, int flag) | 18 | int iso_date(char * p, int flag) |
| 18 | { | 19 | { |
| 19 | int year, month, day, hour, minute, second, tz; | 20 | int year, month, day, hour, minute, second, tz; |
| 20 | int crtime, days, i; | 21 | int crtime; |
| 21 | 22 | ||
| 22 | year = p[0] - 70; | 23 | year = p[0]; |
| 23 | month = p[1]; | 24 | month = p[1]; |
| 24 | day = p[2]; | 25 | day = p[2]; |
| 25 | hour = p[3]; | 26 | hour = p[3]; |
| @@ -31,18 +32,7 @@ int iso_date(char * p, int flag) | |||
| 31 | if (year < 0) { | 32 | if (year < 0) { |
| 32 | crtime = 0; | 33 | crtime = 0; |
| 33 | } else { | 34 | } else { |
| 34 | int monlen[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; | 35 | crtime = mktime64(year+1900, month, day, hour, minute, second); |
| 35 | |||
| 36 | days = year * 365; | ||
| 37 | if (year > 2) | ||
| 38 | days += (year+1) / 4; | ||
| 39 | for (i = 1; i < month; i++) | ||
| 40 | days += monlen[i-1]; | ||
| 41 | if (((year+2) % 4) == 0 && month > 2) | ||
| 42 | days++; | ||
| 43 | days += day - 1; | ||
| 44 | crtime = ((((days * 24) + hour) * 60 + minute) * 60) | ||
| 45 | + second; | ||
| 46 | 36 | ||
| 47 | /* sign extend */ | 37 | /* sign extend */ |
| 48 | if (tz & 0x80) | 38 | if (tz & 0x80) |
diff --git a/fs/ocfs2/quota.h b/fs/ocfs2/quota.h index 1eae330193a6..b6d51333ad02 100644 --- a/fs/ocfs2/quota.h +++ b/fs/ocfs2/quota.h | |||
| @@ -48,6 +48,7 @@ struct ocfs2_quota_recovery { | |||
| 48 | /* In-memory structure with quota header information */ | 48 | /* In-memory structure with quota header information */ |
| 49 | struct ocfs2_mem_dqinfo { | 49 | struct ocfs2_mem_dqinfo { |
| 50 | unsigned int dqi_type; /* Quota type this structure describes */ | 50 | unsigned int dqi_type; /* Quota type this structure describes */ |
| 51 | unsigned int dqi_flags; /* Flags OLQF_* */ | ||
| 51 | unsigned int dqi_chunks; /* Number of chunks in local quota file */ | 52 | unsigned int dqi_chunks; /* Number of chunks in local quota file */ |
| 52 | unsigned int dqi_blocks; /* Number of blocks allocated for local quota file */ | 53 | unsigned int dqi_blocks; /* Number of blocks allocated for local quota file */ |
| 53 | unsigned int dqi_syncms; /* How often should we sync with other nodes */ | 54 | unsigned int dqi_syncms; /* How often should we sync with other nodes */ |
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index 10b653930ee2..89c0b2620814 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c | |||
| @@ -292,7 +292,7 @@ static void olq_update_info(struct buffer_head *bh, void *private) | |||
| 292 | ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data + | 292 | ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data + |
| 293 | OCFS2_LOCAL_INFO_OFF); | 293 | OCFS2_LOCAL_INFO_OFF); |
| 294 | spin_lock(&dq_data_lock); | 294 | spin_lock(&dq_data_lock); |
| 295 | ldinfo->dqi_flags = cpu_to_le32(info->dqi_flags & DQF_MASK); | 295 | ldinfo->dqi_flags = cpu_to_le32(oinfo->dqi_flags); |
| 296 | ldinfo->dqi_chunks = cpu_to_le32(oinfo->dqi_chunks); | 296 | ldinfo->dqi_chunks = cpu_to_le32(oinfo->dqi_chunks); |
| 297 | ldinfo->dqi_blocks = cpu_to_le32(oinfo->dqi_blocks); | 297 | ldinfo->dqi_blocks = cpu_to_le32(oinfo->dqi_blocks); |
| 298 | spin_unlock(&dq_data_lock); | 298 | spin_unlock(&dq_data_lock); |
| @@ -701,8 +701,8 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) | |||
| 701 | /* We don't need the lock and we have to acquire quota file locks | 701 | /* We don't need the lock and we have to acquire quota file locks |
| 702 | * which will later depend on this lock */ | 702 | * which will later depend on this lock */ |
| 703 | mutex_unlock(&sb_dqopt(sb)->dqio_mutex); | 703 | mutex_unlock(&sb_dqopt(sb)->dqio_mutex); |
| 704 | info->dqi_maxblimit = 0x7fffffffffffffffLL; | 704 | info->dqi_max_spc_limit = 0x7fffffffffffffffLL; |
| 705 | info->dqi_maxilimit = 0x7fffffffffffffffLL; | 705 | info->dqi_max_ino_limit = 0x7fffffffffffffffLL; |
| 706 | oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); | 706 | oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); |
| 707 | if (!oinfo) { | 707 | if (!oinfo) { |
| 708 | mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota" | 708 | mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota" |
| @@ -737,13 +737,13 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) | |||
| 737 | } | 737 | } |
| 738 | ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data + | 738 | ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data + |
| 739 | OCFS2_LOCAL_INFO_OFF); | 739 | OCFS2_LOCAL_INFO_OFF); |
| 740 | info->dqi_flags = le32_to_cpu(ldinfo->dqi_flags); | 740 | oinfo->dqi_flags = le32_to_cpu(ldinfo->dqi_flags); |
| 741 | oinfo->dqi_chunks = le32_to_cpu(ldinfo->dqi_chunks); | 741 | oinfo->dqi_chunks = le32_to_cpu(ldinfo->dqi_chunks); |
| 742 | oinfo->dqi_blocks = le32_to_cpu(ldinfo->dqi_blocks); | 742 | oinfo->dqi_blocks = le32_to_cpu(ldinfo->dqi_blocks); |
| 743 | oinfo->dqi_libh = bh; | 743 | oinfo->dqi_libh = bh; |
| 744 | 744 | ||
| 745 | /* We crashed when using local quota file? */ | 745 | /* We crashed when using local quota file? */ |
| 746 | if (!(info->dqi_flags & OLQF_CLEAN)) { | 746 | if (!(oinfo->dqi_flags & OLQF_CLEAN)) { |
| 747 | rec = OCFS2_SB(sb)->quota_rec; | 747 | rec = OCFS2_SB(sb)->quota_rec; |
| 748 | if (!rec) { | 748 | if (!rec) { |
| 749 | rec = ocfs2_alloc_quota_recovery(); | 749 | rec = ocfs2_alloc_quota_recovery(); |
| @@ -772,7 +772,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) | |||
| 772 | } | 772 | } |
| 773 | 773 | ||
| 774 | /* Now mark quota file as used */ | 774 | /* Now mark quota file as used */ |
| 775 | info->dqi_flags &= ~OLQF_CLEAN; | 775 | oinfo->dqi_flags &= ~OLQF_CLEAN; |
| 776 | status = ocfs2_modify_bh(lqinode, bh, olq_update_info, info); | 776 | status = ocfs2_modify_bh(lqinode, bh, olq_update_info, info); |
| 777 | if (status < 0) { | 777 | if (status < 0) { |
| 778 | mlog_errno(status); | 778 | mlog_errno(status); |
| @@ -857,7 +857,7 @@ static int ocfs2_local_free_info(struct super_block *sb, int type) | |||
| 857 | goto out; | 857 | goto out; |
| 858 | 858 | ||
| 859 | /* Mark local file as clean */ | 859 | /* Mark local file as clean */ |
| 860 | info->dqi_flags |= OLQF_CLEAN; | 860 | oinfo->dqi_flags |= OLQF_CLEAN; |
| 861 | status = ocfs2_modify_bh(sb_dqopt(sb)->files[type], | 861 | status = ocfs2_modify_bh(sb_dqopt(sb)->files[type], |
| 862 | oinfo->dqi_libh, | 862 | oinfo->dqi_libh, |
| 863 | olq_update_info, | 863 | olq_update_info, |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 83723179e1ec..706c71c2955d 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -1000,36 +1000,6 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) | |||
| 1000 | } | 1000 | } |
| 1001 | } | 1001 | } |
| 1002 | 1002 | ||
| 1003 | /* Handle quota on quotactl */ | ||
| 1004 | static int ocfs2_quota_on(struct super_block *sb, int type, int format_id) | ||
| 1005 | { | ||
| 1006 | unsigned int feature[OCFS2_MAXQUOTAS] = { | ||
| 1007 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA, | ||
| 1008 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA}; | ||
| 1009 | |||
| 1010 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) | ||
| 1011 | return -EINVAL; | ||
| 1012 | |||
| 1013 | return dquot_enable(sb_dqopt(sb)->files[type], type, | ||
| 1014 | format_id, DQUOT_LIMITS_ENABLED); | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | /* Handle quota off quotactl */ | ||
| 1018 | static int ocfs2_quota_off(struct super_block *sb, int type) | ||
| 1019 | { | ||
| 1020 | return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | static const struct quotactl_ops ocfs2_quotactl_ops = { | ||
| 1024 | .quota_on_meta = ocfs2_quota_on, | ||
| 1025 | .quota_off = ocfs2_quota_off, | ||
| 1026 | .quota_sync = dquot_quota_sync, | ||
| 1027 | .get_info = dquot_get_dqinfo, | ||
| 1028 | .set_info = dquot_set_dqinfo, | ||
| 1029 | .get_dqblk = dquot_get_dqblk, | ||
| 1030 | .set_dqblk = dquot_set_dqblk, | ||
| 1031 | }; | ||
| 1032 | |||
| 1033 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | 1003 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) |
| 1034 | { | 1004 | { |
| 1035 | struct dentry *root; | 1005 | struct dentry *root; |
| @@ -2079,7 +2049,7 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 2079 | sb->s_op = &ocfs2_sops; | 2049 | sb->s_op = &ocfs2_sops; |
| 2080 | sb->s_d_op = &ocfs2_dentry_ops; | 2050 | sb->s_d_op = &ocfs2_dentry_ops; |
| 2081 | sb->s_export_op = &ocfs2_export_ops; | 2051 | sb->s_export_op = &ocfs2_export_ops; |
| 2082 | sb->s_qcop = &ocfs2_quotactl_ops; | 2052 | sb->s_qcop = &dquot_quotactl_sysfile_ops; |
| 2083 | sb->dq_op = &ocfs2_quota_operations; | 2053 | sb->dq_op = &ocfs2_quota_operations; |
| 2084 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; | 2054 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; |
| 2085 | sb->s_xattr = ocfs2_xattr_handlers; | 2055 | sb->s_xattr = ocfs2_xattr_handlers; |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 69df5b239844..0ccd4ba3a246 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -1248,7 +1248,7 @@ static int ignore_hardlimit(struct dquot *dquot) | |||
| 1248 | 1248 | ||
| 1249 | return capable(CAP_SYS_RESOURCE) && | 1249 | return capable(CAP_SYS_RESOURCE) && |
| 1250 | (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || | 1250 | (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || |
| 1251 | !(info->dqi_flags & V1_DQF_RSQUASH)); | 1251 | !(info->dqi_flags & DQF_ROOT_SQUASH)); |
| 1252 | } | 1252 | } |
| 1253 | 1253 | ||
| 1254 | /* needs dq_data_lock */ | 1254 | /* needs dq_data_lock */ |
| @@ -2385,14 +2385,84 @@ out: | |||
| 2385 | } | 2385 | } |
| 2386 | EXPORT_SYMBOL(dquot_quota_on_mount); | 2386 | EXPORT_SYMBOL(dquot_quota_on_mount); |
| 2387 | 2387 | ||
| 2388 | static inline qsize_t qbtos(qsize_t blocks) | 2388 | static int dquot_quota_enable(struct super_block *sb, unsigned int flags) |
| 2389 | { | 2389 | { |
| 2390 | return blocks << QIF_DQBLKSIZE_BITS; | 2390 | int ret; |
| 2391 | int type; | ||
| 2392 | struct quota_info *dqopt = sb_dqopt(sb); | ||
| 2393 | |||
| 2394 | if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) | ||
| 2395 | return -ENOSYS; | ||
| 2396 | /* Accounting cannot be turned on while fs is mounted */ | ||
| 2397 | flags &= ~(FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT); | ||
| 2398 | if (!flags) | ||
| 2399 | return -EINVAL; | ||
| 2400 | for (type = 0; type < MAXQUOTAS; type++) { | ||
| 2401 | if (!(flags & qtype_enforce_flag(type))) | ||
| 2402 | continue; | ||
| 2403 | /* Can't enforce without accounting */ | ||
| 2404 | if (!sb_has_quota_usage_enabled(sb, type)) | ||
| 2405 | return -EINVAL; | ||
| 2406 | ret = dquot_enable(dqopt->files[type], type, | ||
| 2407 | dqopt->info[type].dqi_fmt_id, | ||
| 2408 | DQUOT_LIMITS_ENABLED); | ||
| 2409 | if (ret < 0) | ||
| 2410 | goto out_err; | ||
| 2411 | } | ||
| 2412 | return 0; | ||
| 2413 | out_err: | ||
| 2414 | /* Backout enforcement enablement we already did */ | ||
| 2415 | for (type--; type >= 0; type--) { | ||
| 2416 | if (flags & qtype_enforce_flag(type)) | ||
| 2417 | dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
| 2418 | } | ||
| 2419 | /* Error code translation for better compatibility with XFS */ | ||
| 2420 | if (ret == -EBUSY) | ||
| 2421 | ret = -EEXIST; | ||
| 2422 | return ret; | ||
| 2391 | } | 2423 | } |
| 2392 | 2424 | ||
| 2393 | static inline qsize_t stoqb(qsize_t space) | 2425 | static int dquot_quota_disable(struct super_block *sb, unsigned int flags) |
| 2394 | { | 2426 | { |
| 2395 | return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; | 2427 | int ret; |
| 2428 | int type; | ||
| 2429 | struct quota_info *dqopt = sb_dqopt(sb); | ||
| 2430 | |||
| 2431 | if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) | ||
| 2432 | return -ENOSYS; | ||
| 2433 | /* | ||
| 2434 | * We don't support turning off accounting via quotactl. In principle | ||
| 2435 | * quota infrastructure can do this but filesystems don't expect | ||
| 2436 | * userspace to be able to do it. | ||
| 2437 | */ | ||
| 2438 | if (flags & | ||
| 2439 | (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT)) | ||
| 2440 | return -EOPNOTSUPP; | ||
| 2441 | |||
| 2442 | /* Filter out limits not enabled */ | ||
| 2443 | for (type = 0; type < MAXQUOTAS; type++) | ||
| 2444 | if (!sb_has_quota_limits_enabled(sb, type)) | ||
| 2445 | flags &= ~qtype_enforce_flag(type); | ||
| 2446 | /* Nothing left? */ | ||
| 2447 | if (!flags) | ||
| 2448 | return -EEXIST; | ||
| 2449 | for (type = 0; type < MAXQUOTAS; type++) { | ||
| 2450 | if (flags & qtype_enforce_flag(type)) { | ||
| 2451 | ret = dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
| 2452 | if (ret < 0) | ||
| 2453 | goto out_err; | ||
| 2454 | } | ||
| 2455 | } | ||
| 2456 | return 0; | ||
| 2457 | out_err: | ||
| 2458 | /* Backout enforcement disabling we already did */ | ||
| 2459 | for (type--; type >= 0; type--) { | ||
| 2460 | if (flags & qtype_enforce_flag(type)) | ||
| 2461 | dquot_enable(dqopt->files[type], type, | ||
| 2462 | dqopt->info[type].dqi_fmt_id, | ||
| 2463 | DQUOT_LIMITS_ENABLED); | ||
| 2464 | } | ||
| 2465 | return ret; | ||
| 2396 | } | 2466 | } |
| 2397 | 2467 | ||
| 2398 | /* Generic routine for getting common part of quota structure */ | 2468 | /* Generic routine for getting common part of quota structure */ |
| @@ -2444,13 +2514,13 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) | |||
| 2444 | return -EINVAL; | 2514 | return -EINVAL; |
| 2445 | 2515 | ||
| 2446 | if (((di->d_fieldmask & QC_SPC_SOFT) && | 2516 | if (((di->d_fieldmask & QC_SPC_SOFT) && |
| 2447 | stoqb(di->d_spc_softlimit) > dqi->dqi_maxblimit) || | 2517 | di->d_spc_softlimit > dqi->dqi_max_spc_limit) || |
| 2448 | ((di->d_fieldmask & QC_SPC_HARD) && | 2518 | ((di->d_fieldmask & QC_SPC_HARD) && |
| 2449 | stoqb(di->d_spc_hardlimit) > dqi->dqi_maxblimit) || | 2519 | di->d_spc_hardlimit > dqi->dqi_max_spc_limit) || |
| 2450 | ((di->d_fieldmask & QC_INO_SOFT) && | 2520 | ((di->d_fieldmask & QC_INO_SOFT) && |
| 2451 | (di->d_ino_softlimit > dqi->dqi_maxilimit)) || | 2521 | (di->d_ino_softlimit > dqi->dqi_max_ino_limit)) || |
| 2452 | ((di->d_fieldmask & QC_INO_HARD) && | 2522 | ((di->d_fieldmask & QC_INO_HARD) && |
| 2453 | (di->d_ino_hardlimit > dqi->dqi_maxilimit))) | 2523 | (di->d_ino_hardlimit > dqi->dqi_max_ino_limit))) |
| 2454 | return -ERANGE; | 2524 | return -ERANGE; |
| 2455 | 2525 | ||
| 2456 | spin_lock(&dq_data_lock); | 2526 | spin_lock(&dq_data_lock); |
| @@ -2577,6 +2647,14 @@ int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | |||
| 2577 | goto out; | 2647 | goto out; |
| 2578 | } | 2648 | } |
| 2579 | mi = sb_dqopt(sb)->info + type; | 2649 | mi = sb_dqopt(sb)->info + type; |
| 2650 | if (ii->dqi_valid & IIF_FLAGS) { | ||
| 2651 | if (ii->dqi_flags & ~DQF_SETINFO_MASK || | ||
| 2652 | (ii->dqi_flags & DQF_ROOT_SQUASH && | ||
| 2653 | mi->dqi_format->qf_fmt_id != QFMT_VFS_OLD)) { | ||
| 2654 | err = -EINVAL; | ||
| 2655 | goto out; | ||
| 2656 | } | ||
| 2657 | } | ||
| 2580 | spin_lock(&dq_data_lock); | 2658 | spin_lock(&dq_data_lock); |
| 2581 | if (ii->dqi_valid & IIF_BGRACE) | 2659 | if (ii->dqi_valid & IIF_BGRACE) |
| 2582 | mi->dqi_bgrace = ii->dqi_bgrace; | 2660 | mi->dqi_bgrace = ii->dqi_bgrace; |
| @@ -2606,6 +2684,17 @@ const struct quotactl_ops dquot_quotactl_ops = { | |||
| 2606 | }; | 2684 | }; |
| 2607 | EXPORT_SYMBOL(dquot_quotactl_ops); | 2685 | EXPORT_SYMBOL(dquot_quotactl_ops); |
| 2608 | 2686 | ||
| 2687 | const struct quotactl_ops dquot_quotactl_sysfile_ops = { | ||
| 2688 | .quota_enable = dquot_quota_enable, | ||
| 2689 | .quota_disable = dquot_quota_disable, | ||
| 2690 | .quota_sync = dquot_quota_sync, | ||
| 2691 | .get_info = dquot_get_dqinfo, | ||
| 2692 | .set_info = dquot_set_dqinfo, | ||
| 2693 | .get_dqblk = dquot_get_dqblk, | ||
| 2694 | .set_dqblk = dquot_set_dqblk | ||
| 2695 | }; | ||
| 2696 | EXPORT_SYMBOL(dquot_quotactl_sysfile_ops); | ||
| 2697 | |||
| 2609 | static int do_proc_dqstats(struct ctl_table *table, int write, | 2698 | static int do_proc_dqstats(struct ctl_table *table, int write, |
| 2610 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2699 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| 2611 | { | 2700 | { |
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 6f3856328eea..d14a799c7785 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
| @@ -66,18 +66,40 @@ static int quota_sync_all(int type) | |||
| 66 | return ret; | 66 | return ret; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | unsigned int qtype_enforce_flag(int type) | ||
| 70 | { | ||
| 71 | switch (type) { | ||
| 72 | case USRQUOTA: | ||
| 73 | return FS_QUOTA_UDQ_ENFD; | ||
| 74 | case GRPQUOTA: | ||
| 75 | return FS_QUOTA_GDQ_ENFD; | ||
| 76 | case PRJQUOTA: | ||
| 77 | return FS_QUOTA_PDQ_ENFD; | ||
| 78 | } | ||
| 79 | return 0; | ||
| 80 | } | ||
| 81 | |||
| 69 | static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, | 82 | static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, |
| 70 | struct path *path) | 83 | struct path *path) |
| 71 | { | 84 | { |
| 72 | if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta) | 85 | if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_enable) |
| 73 | return -ENOSYS; | 86 | return -ENOSYS; |
| 74 | if (sb->s_qcop->quota_on_meta) | 87 | if (sb->s_qcop->quota_enable) |
| 75 | return sb->s_qcop->quota_on_meta(sb, type, id); | 88 | return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type)); |
| 76 | if (IS_ERR(path)) | 89 | if (IS_ERR(path)) |
| 77 | return PTR_ERR(path); | 90 | return PTR_ERR(path); |
| 78 | return sb->s_qcop->quota_on(sb, type, id, path); | 91 | return sb->s_qcop->quota_on(sb, type, id, path); |
| 79 | } | 92 | } |
| 80 | 93 | ||
| 94 | static int quota_quotaoff(struct super_block *sb, int type) | ||
| 95 | { | ||
| 96 | if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable) | ||
| 97 | return -ENOSYS; | ||
| 98 | if (sb->s_qcop->quota_disable) | ||
| 99 | return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type)); | ||
| 100 | return sb->s_qcop->quota_off(sb, type); | ||
| 101 | } | ||
| 102 | |||
| 81 | static int quota_getfmt(struct super_block *sb, int type, void __user *addr) | 103 | static int quota_getfmt(struct super_block *sb, int type, void __user *addr) |
| 82 | { | 104 | { |
| 83 | __u32 fmt; | 105 | __u32 fmt; |
| @@ -208,15 +230,26 @@ static int quota_setquota(struct super_block *sb, int type, qid_t id, | |||
| 208 | return sb->s_qcop->set_dqblk(sb, qid, &fdq); | 230 | return sb->s_qcop->set_dqblk(sb, qid, &fdq); |
| 209 | } | 231 | } |
| 210 | 232 | ||
| 211 | static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr) | 233 | static int quota_enable(struct super_block *sb, void __user *addr) |
| 212 | { | 234 | { |
| 213 | __u32 flags; | 235 | __u32 flags; |
| 214 | 236 | ||
| 215 | if (copy_from_user(&flags, addr, sizeof(flags))) | 237 | if (copy_from_user(&flags, addr, sizeof(flags))) |
| 216 | return -EFAULT; | 238 | return -EFAULT; |
| 217 | if (!sb->s_qcop->set_xstate) | 239 | if (!sb->s_qcop->quota_enable) |
| 218 | return -ENOSYS; | 240 | return -ENOSYS; |
| 219 | return sb->s_qcop->set_xstate(sb, flags, cmd); | 241 | return sb->s_qcop->quota_enable(sb, flags); |
| 242 | } | ||
| 243 | |||
| 244 | static int quota_disable(struct super_block *sb, void __user *addr) | ||
| 245 | { | ||
| 246 | __u32 flags; | ||
| 247 | |||
| 248 | if (copy_from_user(&flags, addr, sizeof(flags))) | ||
| 249 | return -EFAULT; | ||
| 250 | if (!sb->s_qcop->quota_disable) | ||
| 251 | return -ENOSYS; | ||
| 252 | return sb->s_qcop->quota_disable(sb, flags); | ||
| 220 | } | 253 | } |
| 221 | 254 | ||
| 222 | static int quota_getxstate(struct super_block *sb, void __user *addr) | 255 | static int quota_getxstate(struct super_block *sb, void __user *addr) |
| @@ -429,9 +462,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
| 429 | case Q_QUOTAON: | 462 | case Q_QUOTAON: |
| 430 | return quota_quotaon(sb, type, cmd, id, path); | 463 | return quota_quotaon(sb, type, cmd, id, path); |
| 431 | case Q_QUOTAOFF: | 464 | case Q_QUOTAOFF: |
| 432 | if (!sb->s_qcop->quota_off) | 465 | return quota_quotaoff(sb, type); |
| 433 | return -ENOSYS; | ||
| 434 | return sb->s_qcop->quota_off(sb, type); | ||
| 435 | case Q_GETFMT: | 466 | case Q_GETFMT: |
| 436 | return quota_getfmt(sb, type, addr); | 467 | return quota_getfmt(sb, type, addr); |
| 437 | case Q_GETINFO: | 468 | case Q_GETINFO: |
| @@ -447,8 +478,9 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
| 447 | return -ENOSYS; | 478 | return -ENOSYS; |
| 448 | return sb->s_qcop->quota_sync(sb, type); | 479 | return sb->s_qcop->quota_sync(sb, type); |
| 449 | case Q_XQUOTAON: | 480 | case Q_XQUOTAON: |
| 481 | return quota_enable(sb, addr); | ||
| 450 | case Q_XQUOTAOFF: | 482 | case Q_XQUOTAOFF: |
| 451 | return quota_setxstate(sb, cmd, addr); | 483 | return quota_disable(sb, addr); |
| 452 | case Q_XQUOTARM: | 484 | case Q_XQUOTARM: |
| 453 | return quota_rmxquota(sb, addr); | 485 | return quota_rmxquota(sb, addr); |
| 454 | case Q_XGETQSTAT: | 486 | case Q_XGETQSTAT: |
diff --git a/fs/quota/quota_v1.c b/fs/quota/quota_v1.c index 469c6848b322..8fe79beced5c 100644 --- a/fs/quota/quota_v1.c +++ b/fs/quota/quota_v1.c | |||
| @@ -169,8 +169,8 @@ static int v1_read_file_info(struct super_block *sb, int type) | |||
| 169 | } | 169 | } |
| 170 | ret = 0; | 170 | ret = 0; |
| 171 | /* limits are stored as unsigned 32-bit data */ | 171 | /* limits are stored as unsigned 32-bit data */ |
| 172 | dqopt->info[type].dqi_maxblimit = 0xffffffff; | 172 | dqopt->info[type].dqi_max_spc_limit = 0xffffffffULL << QUOTABLOCK_BITS; |
| 173 | dqopt->info[type].dqi_maxilimit = 0xffffffff; | 173 | dqopt->info[type].dqi_max_ino_limit = 0xffffffff; |
| 174 | dqopt->info[type].dqi_igrace = | 174 | dqopt->info[type].dqi_igrace = |
| 175 | dqblk.dqb_itime ? dqblk.dqb_itime : MAX_IQ_TIME; | 175 | dqblk.dqb_itime ? dqblk.dqb_itime : MAX_IQ_TIME; |
| 176 | dqopt->info[type].dqi_bgrace = | 176 | dqopt->info[type].dqi_bgrace = |
diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c index 02751ec695c5..9cb10d7197f7 100644 --- a/fs/quota/quota_v2.c +++ b/fs/quota/quota_v2.c | |||
| @@ -117,16 +117,17 @@ static int v2_read_file_info(struct super_block *sb, int type) | |||
| 117 | qinfo = info->dqi_priv; | 117 | qinfo = info->dqi_priv; |
| 118 | if (version == 0) { | 118 | if (version == 0) { |
| 119 | /* limits are stored as unsigned 32-bit data */ | 119 | /* limits are stored as unsigned 32-bit data */ |
| 120 | info->dqi_maxblimit = 0xffffffff; | 120 | info->dqi_max_spc_limit = 0xffffffffULL << QUOTABLOCK_BITS; |
| 121 | info->dqi_maxilimit = 0xffffffff; | 121 | info->dqi_max_ino_limit = 0xffffffff; |
| 122 | } else { | 122 | } else { |
| 123 | /* used space is stored as unsigned 64-bit value */ | 123 | /* used space is stored as unsigned 64-bit value in bytes */ |
| 124 | info->dqi_maxblimit = 0xffffffffffffffffULL; /* 2^64-1 */ | 124 | info->dqi_max_spc_limit = 0xffffffffffffffffULL; /* 2^64-1 */ |
| 125 | info->dqi_maxilimit = 0xffffffffffffffffULL; | 125 | info->dqi_max_ino_limit = 0xffffffffffffffffULL; |
| 126 | } | 126 | } |
| 127 | info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); | 127 | info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); |
| 128 | info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); | 128 | info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); |
| 129 | info->dqi_flags = le32_to_cpu(dinfo.dqi_flags); | 129 | /* No flags currently supported */ |
| 130 | info->dqi_flags = 0; | ||
| 130 | qinfo->dqi_sb = sb; | 131 | qinfo->dqi_sb = sb; |
| 131 | qinfo->dqi_type = type; | 132 | qinfo->dqi_type = type; |
| 132 | qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); | 133 | qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); |
| @@ -157,7 +158,8 @@ static int v2_write_file_info(struct super_block *sb, int type) | |||
| 157 | info->dqi_flags &= ~DQF_INFO_DIRTY; | 158 | info->dqi_flags &= ~DQF_INFO_DIRTY; |
| 158 | dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace); | 159 | dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace); |
| 159 | dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace); | 160 | dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace); |
| 160 | dinfo.dqi_flags = cpu_to_le32(info->dqi_flags & DQF_MASK); | 161 | /* No flags currently supported */ |
| 162 | dinfo.dqi_flags = cpu_to_le32(0); | ||
| 161 | spin_unlock(&dq_data_lock); | 163 | spin_unlock(&dq_data_lock); |
| 162 | dinfo.dqi_blocks = cpu_to_le32(qinfo->dqi_blocks); | 164 | dinfo.dqi_blocks = cpu_to_le32(qinfo->dqi_blocks); |
| 163 | dinfo.dqi_free_blk = cpu_to_le32(qinfo->dqi_free_blk); | 165 | dinfo.dqi_free_blk = cpu_to_le32(qinfo->dqi_free_blk); |
diff --git a/fs/udf/Kconfig b/fs/udf/Kconfig index 0e0e99bd6bce..c6e17a744c3b 100644 --- a/fs/udf/Kconfig +++ b/fs/udf/Kconfig | |||
| @@ -2,10 +2,12 @@ config UDF_FS | |||
| 2 | tristate "UDF file system support" | 2 | tristate "UDF file system support" |
| 3 | select CRC_ITU_T | 3 | select CRC_ITU_T |
| 4 | help | 4 | help |
| 5 | This is the new file system used on some CD-ROMs and DVDs. Say Y if | 5 | This is a file system used on some CD-ROMs and DVDs. Since the |
| 6 | you intend to mount DVD discs or CDRW's written in packet mode, or | 6 | file system is supported by multiple operating systems and is more |
| 7 | if written to by other UDF utilities, such as DirectCD. | 7 | compatible with standard unix file systems, it is also suitable for |
| 8 | Please read <file:Documentation/filesystems/udf.txt>. | 8 | removable USB disks. Say Y if you intend to mount DVD discs or CDRW's |
| 9 | written in packet mode, or if you want to use UDF for removable USB | ||
| 10 | disks. Please read <file:Documentation/filesystems/udf.txt>. | ||
| 9 | 11 | ||
| 10 | To compile this file system support as a module, choose M here: the | 12 | To compile this file system support as a module, choose M here: the |
| 11 | module will be called udf. | 13 | module will be called udf. |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 5bc71d9a674a..a445d599098d 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -750,7 +750,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | |||
| 750 | /* Are we beyond EOF? */ | 750 | /* Are we beyond EOF? */ |
| 751 | if (etype == -1) { | 751 | if (etype == -1) { |
| 752 | int ret; | 752 | int ret; |
| 753 | isBeyondEOF = 1; | 753 | isBeyondEOF = true; |
| 754 | if (count) { | 754 | if (count) { |
| 755 | if (c) | 755 | if (c) |
| 756 | laarr[0] = laarr[1]; | 756 | laarr[0] = laarr[1]; |
| @@ -792,7 +792,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | |||
| 792 | endnum = c + 1; | 792 | endnum = c + 1; |
| 793 | lastblock = 1; | 793 | lastblock = 1; |
| 794 | } else { | 794 | } else { |
| 795 | isBeyondEOF = 0; | 795 | isBeyondEOF = false; |
| 796 | endnum = startnum = ((count > 2) ? 2 : count); | 796 | endnum = startnum = ((count > 2) ? 2 : count); |
| 797 | 797 | ||
| 798 | /* if the current extent is in position 0, | 798 | /* if the current extent is in position 0, |
| @@ -1288,6 +1288,7 @@ static int udf_read_inode(struct inode *inode, bool hidden_inode) | |||
| 1288 | struct kernel_lb_addr *iloc = &iinfo->i_location; | 1288 | struct kernel_lb_addr *iloc = &iinfo->i_location; |
| 1289 | unsigned int link_count; | 1289 | unsigned int link_count; |
| 1290 | unsigned int indirections = 0; | 1290 | unsigned int indirections = 0; |
| 1291 | int bs = inode->i_sb->s_blocksize; | ||
| 1291 | int ret = -EIO; | 1292 | int ret = -EIO; |
| 1292 | 1293 | ||
| 1293 | reread: | 1294 | reread: |
| @@ -1374,38 +1375,35 @@ reread: | |||
| 1374 | if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) { | 1375 | if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) { |
| 1375 | iinfo->i_efe = 1; | 1376 | iinfo->i_efe = 1; |
| 1376 | iinfo->i_use = 0; | 1377 | iinfo->i_use = 0; |
| 1377 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1378 | ret = udf_alloc_i_data(inode, bs - |
| 1378 | sizeof(struct extendedFileEntry)); | 1379 | sizeof(struct extendedFileEntry)); |
| 1379 | if (ret) | 1380 | if (ret) |
| 1380 | goto out; | 1381 | goto out; |
| 1381 | memcpy(iinfo->i_ext.i_data, | 1382 | memcpy(iinfo->i_ext.i_data, |
| 1382 | bh->b_data + sizeof(struct extendedFileEntry), | 1383 | bh->b_data + sizeof(struct extendedFileEntry), |
| 1383 | inode->i_sb->s_blocksize - | 1384 | bs - sizeof(struct extendedFileEntry)); |
| 1384 | sizeof(struct extendedFileEntry)); | ||
| 1385 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) { | 1385 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) { |
| 1386 | iinfo->i_efe = 0; | 1386 | iinfo->i_efe = 0; |
| 1387 | iinfo->i_use = 0; | 1387 | iinfo->i_use = 0; |
| 1388 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1388 | ret = udf_alloc_i_data(inode, bs - sizeof(struct fileEntry)); |
| 1389 | sizeof(struct fileEntry)); | ||
| 1390 | if (ret) | 1389 | if (ret) |
| 1391 | goto out; | 1390 | goto out; |
| 1392 | memcpy(iinfo->i_ext.i_data, | 1391 | memcpy(iinfo->i_ext.i_data, |
| 1393 | bh->b_data + sizeof(struct fileEntry), | 1392 | bh->b_data + sizeof(struct fileEntry), |
| 1394 | inode->i_sb->s_blocksize - sizeof(struct fileEntry)); | 1393 | bs - sizeof(struct fileEntry)); |
| 1395 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_USE)) { | 1394 | } else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_USE)) { |
| 1396 | iinfo->i_efe = 0; | 1395 | iinfo->i_efe = 0; |
| 1397 | iinfo->i_use = 1; | 1396 | iinfo->i_use = 1; |
| 1398 | iinfo->i_lenAlloc = le32_to_cpu( | 1397 | iinfo->i_lenAlloc = le32_to_cpu( |
| 1399 | ((struct unallocSpaceEntry *)bh->b_data)-> | 1398 | ((struct unallocSpaceEntry *)bh->b_data)-> |
| 1400 | lengthAllocDescs); | 1399 | lengthAllocDescs); |
| 1401 | ret = udf_alloc_i_data(inode, inode->i_sb->s_blocksize - | 1400 | ret = udf_alloc_i_data(inode, bs - |
| 1402 | sizeof(struct unallocSpaceEntry)); | 1401 | sizeof(struct unallocSpaceEntry)); |
| 1403 | if (ret) | 1402 | if (ret) |
| 1404 | goto out; | 1403 | goto out; |
| 1405 | memcpy(iinfo->i_ext.i_data, | 1404 | memcpy(iinfo->i_ext.i_data, |
| 1406 | bh->b_data + sizeof(struct unallocSpaceEntry), | 1405 | bh->b_data + sizeof(struct unallocSpaceEntry), |
| 1407 | inode->i_sb->s_blocksize - | 1406 | bs - sizeof(struct unallocSpaceEntry)); |
| 1408 | sizeof(struct unallocSpaceEntry)); | ||
| 1409 | return 0; | 1407 | return 0; |
| 1410 | } | 1408 | } |
| 1411 | 1409 | ||
| @@ -1489,6 +1487,15 @@ reread: | |||
| 1489 | } | 1487 | } |
| 1490 | inode->i_generation = iinfo->i_unique; | 1488 | inode->i_generation = iinfo->i_unique; |
| 1491 | 1489 | ||
| 1490 | /* | ||
| 1491 | * Sanity check length of allocation descriptors and extended attrs to | ||
| 1492 | * avoid integer overflows | ||
| 1493 | */ | ||
| 1494 | if (iinfo->i_lenEAttr > bs || iinfo->i_lenAlloc > bs) | ||
| 1495 | goto out; | ||
| 1496 | /* Now do exact checks */ | ||
| 1497 | if (udf_file_entry_alloc_offset(inode) + iinfo->i_lenAlloc > bs) | ||
| 1498 | goto out; | ||
| 1492 | /* Sanity checks for files in ICB so that we don't get confused later */ | 1499 | /* Sanity checks for files in ICB so that we don't get confused later */ |
| 1493 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { | 1500 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { |
| 1494 | /* | 1501 | /* |
| @@ -1498,8 +1505,7 @@ reread: | |||
| 1498 | if (iinfo->i_lenAlloc != inode->i_size) | 1505 | if (iinfo->i_lenAlloc != inode->i_size) |
| 1499 | goto out; | 1506 | goto out; |
| 1500 | /* File in ICB has to fit in there... */ | 1507 | /* File in ICB has to fit in there... */ |
| 1501 | if (inode->i_size > inode->i_sb->s_blocksize - | 1508 | if (inode->i_size > bs - udf_file_entry_alloc_offset(inode)) |
| 1502 | udf_file_entry_alloc_offset(inode)) | ||
| 1503 | goto out; | 1509 | goto out; |
| 1504 | } | 1510 | } |
| 1505 | 1511 | ||
diff --git a/fs/udf/super.c b/fs/udf/super.c index 3ccb2f11fc76..f169411c4ea0 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -1599,7 +1599,7 @@ static noinline int udf_process_sequence( | |||
| 1599 | struct udf_vds_record *curr; | 1599 | struct udf_vds_record *curr; |
| 1600 | struct generic_desc *gd; | 1600 | struct generic_desc *gd; |
| 1601 | struct volDescPtr *vdp; | 1601 | struct volDescPtr *vdp; |
| 1602 | int done = 0; | 1602 | bool done = false; |
| 1603 | uint32_t vdsn; | 1603 | uint32_t vdsn; |
| 1604 | uint16_t ident; | 1604 | uint16_t ident; |
| 1605 | long next_s = 0, next_e = 0; | 1605 | long next_s = 0, next_e = 0; |
| @@ -1680,7 +1680,7 @@ static noinline int udf_process_sequence( | |||
| 1680 | lastblock = next_e; | 1680 | lastblock = next_e; |
| 1681 | next_s = next_e = 0; | 1681 | next_s = next_e = 0; |
| 1682 | } else | 1682 | } else |
| 1683 | done = 1; | 1683 | done = true; |
| 1684 | break; | 1684 | break; |
| 1685 | } | 1685 | } |
| 1686 | brelse(bh); | 1686 | brelse(bh); |
| @@ -2300,6 +2300,7 @@ static void udf_put_super(struct super_block *sb) | |||
| 2300 | udf_close_lvid(sb); | 2300 | udf_close_lvid(sb); |
| 2301 | brelse(sbi->s_lvid_bh); | 2301 | brelse(sbi->s_lvid_bh); |
| 2302 | udf_sb_free_partitions(sb); | 2302 | udf_sb_free_partitions(sb); |
| 2303 | mutex_destroy(&sbi->s_alloc_mutex); | ||
| 2303 | kfree(sb->s_fs_info); | 2304 | kfree(sb->s_fs_info); |
| 2304 | sb->s_fs_info = NULL; | 2305 | sb->s_fs_info = NULL; |
| 2305 | } | 2306 | } |
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index cb6168ec92c9..d56a4f5155d5 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c | |||
| @@ -329,22 +329,16 @@ xfs_qm_scall_quotaon( | |||
| 329 | return -EINVAL; | 329 | return -EINVAL; |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | /* No fs can turn on quotas with a delayed effect */ | ||
| 333 | ASSERT((flags & XFS_ALL_QUOTA_ACCT) == 0); | ||
| 334 | |||
| 335 | /* | 332 | /* |
| 336 | * Can't enforce without accounting. We check the superblock | 333 | * Can't enforce without accounting. We check the superblock |
| 337 | * qflags here instead of m_qflags because rootfs can have | 334 | * qflags here instead of m_qflags because rootfs can have |
| 338 | * quota acct on ondisk without m_qflags' knowing. | 335 | * quota acct on ondisk without m_qflags' knowing. |
| 339 | */ | 336 | */ |
| 340 | if (((flags & XFS_UQUOTA_ACCT) == 0 && | 337 | if (((mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && |
| 341 | (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && | ||
| 342 | (flags & XFS_UQUOTA_ENFD)) || | 338 | (flags & XFS_UQUOTA_ENFD)) || |
| 343 | ((flags & XFS_GQUOTA_ACCT) == 0 && | 339 | ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && |
| 344 | (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && | ||
| 345 | (flags & XFS_GQUOTA_ENFD)) || | 340 | (flags & XFS_GQUOTA_ENFD)) || |
| 346 | ((flags & XFS_PQUOTA_ACCT) == 0 && | 341 | ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && |
| 347 | (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && | ||
| 348 | (flags & XFS_PQUOTA_ENFD))) { | 342 | (flags & XFS_PQUOTA_ENFD))) { |
| 349 | xfs_debug(mp, | 343 | xfs_debug(mp, |
| 350 | "%s: Can't enforce without acct, flags=%x sbflags=%x", | 344 | "%s: Can't enforce without acct, flags=%x sbflags=%x", |
| @@ -383,8 +377,7 @@ xfs_qm_scall_quotaon( | |||
| 383 | ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) != | 377 | ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) != |
| 384 | (mp->m_qflags & XFS_PQUOTA_ACCT)) || | 378 | (mp->m_qflags & XFS_PQUOTA_ACCT)) || |
| 385 | ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) != | 379 | ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) != |
| 386 | (mp->m_qflags & XFS_GQUOTA_ACCT)) || | 380 | (mp->m_qflags & XFS_GQUOTA_ACCT))) |
| 387 | (flags & XFS_ALL_QUOTA_ENFD) == 0) | ||
| 388 | return 0; | 381 | return 0; |
| 389 | 382 | ||
| 390 | if (! XFS_IS_QUOTA_RUNNING(mp)) | 383 | if (! XFS_IS_QUOTA_RUNNING(mp)) |
| @@ -421,20 +414,12 @@ xfs_qm_scall_getqstat( | |||
| 421 | memset(out, 0, sizeof(fs_quota_stat_t)); | 414 | memset(out, 0, sizeof(fs_quota_stat_t)); |
| 422 | 415 | ||
| 423 | out->qs_version = FS_QSTAT_VERSION; | 416 | out->qs_version = FS_QSTAT_VERSION; |
| 424 | if (!xfs_sb_version_hasquota(&mp->m_sb)) { | ||
| 425 | out->qs_uquota.qfs_ino = NULLFSINO; | ||
| 426 | out->qs_gquota.qfs_ino = NULLFSINO; | ||
| 427 | return 0; | ||
| 428 | } | ||
| 429 | |||
| 430 | out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & | 417 | out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & |
| 431 | (XFS_ALL_QUOTA_ACCT| | 418 | (XFS_ALL_QUOTA_ACCT| |
| 432 | XFS_ALL_QUOTA_ENFD)); | 419 | XFS_ALL_QUOTA_ENFD)); |
| 433 | if (q) { | 420 | uip = q->qi_uquotaip; |
| 434 | uip = q->qi_uquotaip; | 421 | gip = q->qi_gquotaip; |
| 435 | gip = q->qi_gquotaip; | 422 | pip = q->qi_pquotaip; |
| 436 | pip = q->qi_pquotaip; | ||
| 437 | } | ||
| 438 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { | 423 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 439 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 424 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 440 | 0, 0, &uip) == 0) | 425 | 0, 0, &uip) == 0) |
| @@ -480,14 +465,13 @@ xfs_qm_scall_getqstat( | |||
| 480 | if (temppqip) | 465 | if (temppqip) |
| 481 | IRELE(pip); | 466 | IRELE(pip); |
| 482 | } | 467 | } |
| 483 | if (q) { | 468 | out->qs_incoredqs = q->qi_dquots; |
| 484 | out->qs_incoredqs = q->qi_dquots; | 469 | out->qs_btimelimit = q->qi_btimelimit; |
| 485 | out->qs_btimelimit = q->qi_btimelimit; | 470 | out->qs_itimelimit = q->qi_itimelimit; |
| 486 | out->qs_itimelimit = q->qi_itimelimit; | 471 | out->qs_rtbtimelimit = q->qi_rtbtimelimit; |
| 487 | out->qs_rtbtimelimit = q->qi_rtbtimelimit; | 472 | out->qs_bwarnlimit = q->qi_bwarnlimit; |
| 488 | out->qs_bwarnlimit = q->qi_bwarnlimit; | 473 | out->qs_iwarnlimit = q->qi_iwarnlimit; |
| 489 | out->qs_iwarnlimit = q->qi_iwarnlimit; | 474 | |
| 490 | } | ||
| 491 | return 0; | 475 | return 0; |
| 492 | } | 476 | } |
| 493 | 477 | ||
| @@ -508,13 +492,6 @@ xfs_qm_scall_getqstatv( | |||
| 508 | bool tempgqip = false; | 492 | bool tempgqip = false; |
| 509 | bool temppqip = false; | 493 | bool temppqip = false; |
| 510 | 494 | ||
| 511 | if (!xfs_sb_version_hasquota(&mp->m_sb)) { | ||
| 512 | out->qs_uquota.qfs_ino = NULLFSINO; | ||
| 513 | out->qs_gquota.qfs_ino = NULLFSINO; | ||
| 514 | out->qs_pquota.qfs_ino = NULLFSINO; | ||
| 515 | return 0; | ||
| 516 | } | ||
| 517 | |||
| 518 | out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & | 495 | out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & |
| 519 | (XFS_ALL_QUOTA_ACCT| | 496 | (XFS_ALL_QUOTA_ACCT| |
| 520 | XFS_ALL_QUOTA_ENFD)); | 497 | XFS_ALL_QUOTA_ENFD)); |
| @@ -522,11 +499,9 @@ xfs_qm_scall_getqstatv( | |||
| 522 | out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; | 499 | out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; |
| 523 | out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino; | 500 | out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino; |
| 524 | 501 | ||
| 525 | if (q) { | 502 | uip = q->qi_uquotaip; |
| 526 | uip = q->qi_uquotaip; | 503 | gip = q->qi_gquotaip; |
| 527 | gip = q->qi_gquotaip; | 504 | pip = q->qi_pquotaip; |
| 528 | pip = q->qi_pquotaip; | ||
| 529 | } | ||
| 530 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { | 505 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { |
| 531 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 506 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
| 532 | 0, 0, &uip) == 0) | 507 | 0, 0, &uip) == 0) |
| @@ -561,14 +536,13 @@ xfs_qm_scall_getqstatv( | |||
| 561 | if (temppqip) | 536 | if (temppqip) |
| 562 | IRELE(pip); | 537 | IRELE(pip); |
| 563 | } | 538 | } |
| 564 | if (q) { | 539 | out->qs_incoredqs = q->qi_dquots; |
| 565 | out->qs_incoredqs = q->qi_dquots; | 540 | out->qs_btimelimit = q->qi_btimelimit; |
| 566 | out->qs_btimelimit = q->qi_btimelimit; | 541 | out->qs_itimelimit = q->qi_itimelimit; |
| 567 | out->qs_itimelimit = q->qi_itimelimit; | 542 | out->qs_rtbtimelimit = q->qi_rtbtimelimit; |
| 568 | out->qs_rtbtimelimit = q->qi_rtbtimelimit; | 543 | out->qs_bwarnlimit = q->qi_bwarnlimit; |
| 569 | out->qs_bwarnlimit = q->qi_bwarnlimit; | 544 | out->qs_iwarnlimit = q->qi_iwarnlimit; |
| 570 | out->qs_iwarnlimit = q->qi_iwarnlimit; | 545 | |
| 571 | } | ||
| 572 | return 0; | 546 | return 0; |
| 573 | } | 547 | } |
| 574 | 548 | ||
diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 801a84c1cdc3..6923905ab33d 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c | |||
| @@ -64,19 +64,10 @@ xfs_fs_get_xstatev( | |||
| 64 | return xfs_qm_scall_getqstatv(mp, fqs); | 64 | return xfs_qm_scall_getqstatv(mp, fqs); |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | STATIC int | 67 | static unsigned int |
| 68 | xfs_fs_set_xstate( | 68 | xfs_quota_flags(unsigned int uflags) |
| 69 | struct super_block *sb, | ||
| 70 | unsigned int uflags, | ||
| 71 | int op) | ||
| 72 | { | 69 | { |
| 73 | struct xfs_mount *mp = XFS_M(sb); | 70 | unsigned int flags = 0; |
| 74 | unsigned int flags = 0; | ||
| 75 | |||
| 76 | if (sb->s_flags & MS_RDONLY) | ||
| 77 | return -EROFS; | ||
| 78 | if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp)) | ||
| 79 | return -ENOSYS; | ||
| 80 | 71 | ||
| 81 | if (uflags & FS_QUOTA_UDQ_ACCT) | 72 | if (uflags & FS_QUOTA_UDQ_ACCT) |
| 82 | flags |= XFS_UQUOTA_ACCT; | 73 | flags |= XFS_UQUOTA_ACCT; |
| @@ -91,16 +82,39 @@ xfs_fs_set_xstate( | |||
| 91 | if (uflags & FS_QUOTA_PDQ_ENFD) | 82 | if (uflags & FS_QUOTA_PDQ_ENFD) |
| 92 | flags |= XFS_PQUOTA_ENFD; | 83 | flags |= XFS_PQUOTA_ENFD; |
| 93 | 84 | ||
| 94 | switch (op) { | 85 | return flags; |
| 95 | case Q_XQUOTAON: | 86 | } |
| 96 | return xfs_qm_scall_quotaon(mp, flags); | 87 | |
| 97 | case Q_XQUOTAOFF: | 88 | STATIC int |
| 98 | if (!XFS_IS_QUOTA_ON(mp)) | 89 | xfs_quota_enable( |
| 99 | return -EINVAL; | 90 | struct super_block *sb, |
| 100 | return xfs_qm_scall_quotaoff(mp, flags); | 91 | unsigned int uflags) |
| 101 | } | 92 | { |
| 93 | struct xfs_mount *mp = XFS_M(sb); | ||
| 94 | |||
| 95 | if (sb->s_flags & MS_RDONLY) | ||
| 96 | return -EROFS; | ||
| 97 | if (!XFS_IS_QUOTA_RUNNING(mp)) | ||
| 98 | return -ENOSYS; | ||
| 99 | |||
| 100 | return xfs_qm_scall_quotaon(mp, xfs_quota_flags(uflags)); | ||
| 101 | } | ||
| 102 | |||
| 103 | STATIC int | ||
| 104 | xfs_quota_disable( | ||
| 105 | struct super_block *sb, | ||
| 106 | unsigned int uflags) | ||
| 107 | { | ||
| 108 | struct xfs_mount *mp = XFS_M(sb); | ||
| 109 | |||
| 110 | if (sb->s_flags & MS_RDONLY) | ||
| 111 | return -EROFS; | ||
| 112 | if (!XFS_IS_QUOTA_RUNNING(mp)) | ||
| 113 | return -ENOSYS; | ||
| 114 | if (!XFS_IS_QUOTA_ON(mp)) | ||
| 115 | return -EINVAL; | ||
| 102 | 116 | ||
| 103 | return -EINVAL; | 117 | return xfs_qm_scall_quotaoff(mp, xfs_quota_flags(uflags)); |
| 104 | } | 118 | } |
| 105 | 119 | ||
| 106 | STATIC int | 120 | STATIC int |
| @@ -166,7 +180,8 @@ xfs_fs_set_dqblk( | |||
| 166 | const struct quotactl_ops xfs_quotactl_operations = { | 180 | const struct quotactl_ops xfs_quotactl_operations = { |
| 167 | .get_xstatev = xfs_fs_get_xstatev, | 181 | .get_xstatev = xfs_fs_get_xstatev, |
| 168 | .get_xstate = xfs_fs_get_xstate, | 182 | .get_xstate = xfs_fs_get_xstate, |
| 169 | .set_xstate = xfs_fs_set_xstate, | 183 | .quota_enable = xfs_quota_enable, |
| 184 | .quota_disable = xfs_quota_disable, | ||
| 170 | .rm_xquota = xfs_fs_rm_xquota, | 185 | .rm_xquota = xfs_fs_rm_xquota, |
| 171 | .get_dqblk = xfs_fs_get_dqblk, | 186 | .get_dqblk = xfs_fs_get_dqblk, |
| 172 | .set_dqblk = xfs_fs_set_dqblk, | 187 | .set_dqblk = xfs_fs_set_dqblk, |
diff --git a/include/linux/dqblk_v1.h b/include/linux/dqblk_v1.h index 3713a7232dd8..c0d4d1e2a45c 100644 --- a/include/linux/dqblk_v1.h +++ b/include/linux/dqblk_v1.h | |||
| @@ -5,9 +5,6 @@ | |||
| 5 | #ifndef _LINUX_DQBLK_V1_H | 5 | #ifndef _LINUX_DQBLK_V1_H |
| 6 | #define _LINUX_DQBLK_V1_H | 6 | #define _LINUX_DQBLK_V1_H |
| 7 | 7 | ||
| 8 | /* Root squash turned on */ | ||
| 9 | #define V1_DQF_RSQUASH 1 | ||
| 10 | |||
| 11 | /* Numbers of blocks needed for updates */ | 8 | /* Numbers of blocks needed for updates */ |
| 12 | #define V1_INIT_ALLOC 1 | 9 | #define V1_INIT_ALLOC 1 |
| 13 | #define V1_INIT_REWRITE 1 | 10 | #define V1_INIT_REWRITE 1 |
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 31229e0be90b..d32615280be9 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h | |||
| @@ -956,15 +956,6 @@ void __log_wait_for_space(journal_t *journal); | |||
| 956 | extern void __journal_drop_transaction(journal_t *, transaction_t *); | 956 | extern void __journal_drop_transaction(journal_t *, transaction_t *); |
| 957 | extern int cleanup_journal_tail(journal_t *); | 957 | extern int cleanup_journal_tail(journal_t *); |
| 958 | 958 | ||
| 959 | /* Debugging code only: */ | ||
| 960 | |||
| 961 | #define jbd_ENOSYS() \ | ||
| 962 | do { \ | ||
| 963 | printk (KERN_ERR "JBD unimplemented function %s\n", __func__); \ | ||
| 964 | current->state = TASK_UNINTERRUPTIBLE; \ | ||
| 965 | schedule(); \ | ||
| 966 | } while (1) | ||
| 967 | |||
| 968 | /* | 959 | /* |
| 969 | * is_journal_abort | 960 | * is_journal_abort |
| 970 | * | 961 | * |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 704b9a599b26..20e7f78041c8 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
| @@ -1251,15 +1251,6 @@ void __jbd2_log_wait_for_space(journal_t *journal); | |||
| 1251 | extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *); | 1251 | extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *); |
| 1252 | extern int jbd2_cleanup_journal_tail(journal_t *); | 1252 | extern int jbd2_cleanup_journal_tail(journal_t *); |
| 1253 | 1253 | ||
| 1254 | /* Debugging code only: */ | ||
| 1255 | |||
| 1256 | #define jbd_ENOSYS() \ | ||
| 1257 | do { \ | ||
| 1258 | printk (KERN_ERR "JBD unimplemented function %s\n", __func__); \ | ||
| 1259 | current->state = TASK_UNINTERRUPTIBLE; \ | ||
| 1260 | schedule(); \ | ||
| 1261 | } while (1) | ||
| 1262 | |||
| 1263 | /* | 1254 | /* |
| 1264 | * is_journal_abort | 1255 | * is_journal_abort |
| 1265 | * | 1256 | * |
diff --git a/include/linux/quota.h b/include/linux/quota.h index 097d7eb2441e..d534e8ed308a 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
| @@ -216,19 +216,21 @@ struct mem_dqinfo { | |||
| 216 | unsigned long dqi_flags; | 216 | unsigned long dqi_flags; |
| 217 | unsigned int dqi_bgrace; | 217 | unsigned int dqi_bgrace; |
| 218 | unsigned int dqi_igrace; | 218 | unsigned int dqi_igrace; |
| 219 | qsize_t dqi_maxblimit; | 219 | qsize_t dqi_max_spc_limit; |
| 220 | qsize_t dqi_maxilimit; | 220 | qsize_t dqi_max_ino_limit; |
| 221 | void *dqi_priv; | 221 | void *dqi_priv; |
| 222 | }; | 222 | }; |
| 223 | 223 | ||
| 224 | struct super_block; | 224 | struct super_block; |
| 225 | 225 | ||
| 226 | #define DQF_MASK 0xffff /* Mask for format specific flags */ | 226 | /* Mask for flags passed to userspace */ |
| 227 | #define DQF_GETINFO_MASK 0x1ffff /* Mask for flags passed to userspace */ | 227 | #define DQF_GETINFO_MASK (DQF_ROOT_SQUASH | DQF_SYS_FILE) |
| 228 | #define DQF_SETINFO_MASK 0xffff /* Mask for flags modifiable from userspace */ | 228 | /* Mask for flags modifiable from userspace */ |
| 229 | #define DQF_SYS_FILE_B 16 | 229 | #define DQF_SETINFO_MASK DQF_ROOT_SQUASH |
| 230 | #define DQF_SYS_FILE (1 << DQF_SYS_FILE_B) /* Quota file stored as system file */ | 230 | |
| 231 | #define DQF_INFO_DIRTY_B 31 | 231 | enum { |
| 232 | DQF_INFO_DIRTY_B = DQF_PRIVATE, | ||
| 233 | }; | ||
| 232 | #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B) /* Is info dirty? */ | 234 | #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B) /* Is info dirty? */ |
| 233 | 235 | ||
| 234 | extern void mark_info_dirty(struct super_block *sb, int type); | 236 | extern void mark_info_dirty(struct super_block *sb, int type); |
| @@ -367,15 +369,15 @@ struct qc_dqblk { | |||
| 367 | /* Operations handling requests from userspace */ | 369 | /* Operations handling requests from userspace */ |
| 368 | struct quotactl_ops { | 370 | struct quotactl_ops { |
| 369 | int (*quota_on)(struct super_block *, int, int, struct path *); | 371 | int (*quota_on)(struct super_block *, int, int, struct path *); |
| 370 | int (*quota_on_meta)(struct super_block *, int, int); | ||
| 371 | int (*quota_off)(struct super_block *, int); | 372 | int (*quota_off)(struct super_block *, int); |
| 373 | int (*quota_enable)(struct super_block *, unsigned int); | ||
| 374 | int (*quota_disable)(struct super_block *, unsigned int); | ||
| 372 | int (*quota_sync)(struct super_block *, int); | 375 | int (*quota_sync)(struct super_block *, int); |
| 373 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); | 376 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); |
| 374 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); | 377 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); |
| 375 | int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); | 378 | int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); |
| 376 | int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); | 379 | int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); |
| 377 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); | 380 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); |
| 378 | int (*set_xstate)(struct super_block *, unsigned int, int); | ||
| 379 | int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); | 381 | int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); |
| 380 | int (*rm_xquota)(struct super_block *, unsigned int); | 382 | int (*rm_xquota)(struct super_block *, unsigned int); |
| 381 | }; | 383 | }; |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 29e3455f7d41..df73258cca47 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
| @@ -166,6 +166,7 @@ static inline bool sb_has_quota_active(struct super_block *sb, int type) | |||
| 166 | */ | 166 | */ |
| 167 | extern const struct dquot_operations dquot_operations; | 167 | extern const struct dquot_operations dquot_operations; |
| 168 | extern const struct quotactl_ops dquot_quotactl_ops; | 168 | extern const struct quotactl_ops dquot_quotactl_ops; |
| 169 | extern const struct quotactl_ops dquot_quotactl_sysfile_ops; | ||
| 169 | 170 | ||
| 170 | #else | 171 | #else |
| 171 | 172 | ||
| @@ -386,4 +387,6 @@ static inline void dquot_release_reservation_block(struct inode *inode, | |||
| 386 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); | 387 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); |
| 387 | } | 388 | } |
| 388 | 389 | ||
| 390 | unsigned int qtype_enforce_flag(int type); | ||
| 391 | |||
| 389 | #endif /* _LINUX_QUOTAOPS_ */ | 392 | #endif /* _LINUX_QUOTAOPS_ */ |
diff --git a/include/uapi/linux/quota.h b/include/uapi/linux/quota.h index 3b6cfbeb086d..1f49b8341c99 100644 --- a/include/uapi/linux/quota.h +++ b/include/uapi/linux/quota.h | |||
| @@ -126,10 +126,22 @@ struct if_dqblk { | |||
| 126 | #define IIF_FLAGS 4 | 126 | #define IIF_FLAGS 4 |
| 127 | #define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS) | 127 | #define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS) |
| 128 | 128 | ||
| 129 | enum { | ||
| 130 | DQF_ROOT_SQUASH_B = 0, | ||
| 131 | DQF_SYS_FILE_B = 16, | ||
| 132 | /* Kernel internal flags invisible to userspace */ | ||
| 133 | DQF_PRIVATE | ||
| 134 | }; | ||
| 135 | |||
| 136 | /* Root squash enabled (for v1 quota format) */ | ||
| 137 | #define DQF_ROOT_SQUASH (1 << DQF_ROOT_SQUASH_B) | ||
| 138 | /* Quota stored in a system file */ | ||
| 139 | #define DQF_SYS_FILE (1 << DQF_SYS_FILE_B) | ||
| 140 | |||
| 129 | struct if_dqinfo { | 141 | struct if_dqinfo { |
| 130 | __u64 dqi_bgrace; | 142 | __u64 dqi_bgrace; |
| 131 | __u64 dqi_igrace; | 143 | __u64 dqi_igrace; |
| 132 | __u32 dqi_flags; | 144 | __u32 dqi_flags; /* DFQ_* */ |
| 133 | __u32 dqi_valid; | 145 | __u32 dqi_valid; |
| 134 | }; | 146 | }; |
| 135 | 147 | ||
