diff options
author | James Morris <jmorris@namei.org> | 2009-02-05 19:01:45 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2009-02-05 19:01:45 -0500 |
commit | cb5629b10d64a8006622ce3a52bc887d91057d69 (patch) | |
tree | 7c06d8f30783115e3384721046258ce615b129c5 /fs/ocfs2/ocfs2_fs.h | |
parent | 8920d5ad6ba74ae8ab020e90cc4d976980e68701 (diff) | |
parent | f01d1d546abb2f4028b5299092f529eefb01253a (diff) |
Merge branch 'master' into next
Conflicts:
fs/namei.c
Manually merged per:
diff --cc fs/namei.c
index 734f2b5,bbc15c2..0000000
--- a/fs/namei.c
+++ b/fs/namei.c
@@@ -860,9 -848,8 +849,10 @@@ static int __link_path_walk(const char
nd->flags |= LOOKUP_CONTINUE;
err = exec_permission_lite(inode);
if (err == -EAGAIN)
- err = vfs_permission(nd, MAY_EXEC);
+ err = inode_permission(nd->path.dentry->d_inode,
+ MAY_EXEC);
+ if (!err)
+ err = ima_path_check(&nd->path, MAY_EXEC);
if (err)
break;
@@@ -1525,14 -1506,9 +1509,14 @@@ int may_open(struct path *path, int acc
flag &= ~O_TRUNC;
}
- error = vfs_permission(nd, acc_mode);
+ error = inode_permission(inode, acc_mode);
if (error)
return error;
+
- error = ima_path_check(&nd->path,
++ error = ima_path_check(path,
+ acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC));
+ if (error)
+ return error;
/*
* An append-only file must be opened in append mode for writing.
*/
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'fs/ocfs2/ocfs2_fs.h')
-rw-r--r-- | fs/ocfs2/ocfs2_fs.h | 213 |
1 files changed, 204 insertions, 9 deletions
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index 5e0c0d0aef7d..c7ae45aaa36c 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h | |||
@@ -65,6 +65,7 @@ | |||
65 | #define OCFS2_EXTENT_BLOCK_SIGNATURE "EXBLK01" | 65 | #define OCFS2_EXTENT_BLOCK_SIGNATURE "EXBLK01" |
66 | #define OCFS2_GROUP_DESC_SIGNATURE "GROUP01" | 66 | #define OCFS2_GROUP_DESC_SIGNATURE "GROUP01" |
67 | #define OCFS2_XATTR_BLOCK_SIGNATURE "XATTR01" | 67 | #define OCFS2_XATTR_BLOCK_SIGNATURE "XATTR01" |
68 | #define OCFS2_DIR_TRAILER_SIGNATURE "DIRTRL1" | ||
68 | 69 | ||
69 | /* Compatibility flags */ | 70 | /* Compatibility flags */ |
70 | #define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \ | 71 | #define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \ |
@@ -93,8 +94,11 @@ | |||
93 | | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \ | 94 | | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \ |
94 | | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \ | 95 | | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \ |
95 | | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \ | 96 | | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \ |
96 | | OCFS2_FEATURE_INCOMPAT_XATTR) | 97 | | OCFS2_FEATURE_INCOMPAT_XATTR \ |
97 | #define OCFS2_FEATURE_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN | 98 | | OCFS2_FEATURE_INCOMPAT_META_ECC) |
99 | #define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \ | ||
100 | | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \ | ||
101 | | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) | ||
98 | 102 | ||
99 | /* | 103 | /* |
100 | * Heartbeat-only devices are missing journals and other files. The | 104 | * Heartbeat-only devices are missing journals and other files. The |
@@ -147,6 +151,9 @@ | |||
147 | /* Support for extended attributes */ | 151 | /* Support for extended attributes */ |
148 | #define OCFS2_FEATURE_INCOMPAT_XATTR 0x0200 | 152 | #define OCFS2_FEATURE_INCOMPAT_XATTR 0x0200 |
149 | 153 | ||
154 | /* Metadata checksum and error correction */ | ||
155 | #define OCFS2_FEATURE_INCOMPAT_META_ECC 0x0800 | ||
156 | |||
150 | /* | 157 | /* |
151 | * backup superblock flag is used to indicate that this volume | 158 | * backup superblock flag is used to indicate that this volume |
152 | * has backup superblocks. | 159 | * has backup superblocks. |
@@ -163,6 +170,12 @@ | |||
163 | */ | 170 | */ |
164 | #define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN 0x0001 | 171 | #define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN 0x0001 |
165 | 172 | ||
173 | /* | ||
174 | * Maintain quota information for this filesystem | ||
175 | */ | ||
176 | #define OCFS2_FEATURE_RO_COMPAT_USRQUOTA 0x0002 | ||
177 | #define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA 0x0004 | ||
178 | |||
166 | /* The byte offset of the first backup block will be 1G. | 179 | /* The byte offset of the first backup block will be 1G. |
167 | * The following will be 4G, 16G, 64G, 256G and 1T. | 180 | * The following will be 4G, 16G, 64G, 256G and 1T. |
168 | */ | 181 | */ |
@@ -192,6 +205,7 @@ | |||
192 | #define OCFS2_HEARTBEAT_FL (0x00000200) /* Heartbeat area */ | 205 | #define OCFS2_HEARTBEAT_FL (0x00000200) /* Heartbeat area */ |
193 | #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ | 206 | #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ |
194 | #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ | 207 | #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ |
208 | #define OCFS2_QUOTA_FL (0x00001000) /* Quota file */ | ||
195 | 209 | ||
196 | /* | 210 | /* |
197 | * Flags on ocfs2_dinode.i_dyn_features | 211 | * Flags on ocfs2_dinode.i_dyn_features |
@@ -329,13 +343,17 @@ enum { | |||
329 | #define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE | 343 | #define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE |
330 | HEARTBEAT_SYSTEM_INODE, | 344 | HEARTBEAT_SYSTEM_INODE, |
331 | GLOBAL_BITMAP_SYSTEM_INODE, | 345 | GLOBAL_BITMAP_SYSTEM_INODE, |
332 | #define OCFS2_LAST_GLOBAL_SYSTEM_INODE GLOBAL_BITMAP_SYSTEM_INODE | 346 | USER_QUOTA_SYSTEM_INODE, |
347 | GROUP_QUOTA_SYSTEM_INODE, | ||
348 | #define OCFS2_LAST_GLOBAL_SYSTEM_INODE GROUP_QUOTA_SYSTEM_INODE | ||
333 | ORPHAN_DIR_SYSTEM_INODE, | 349 | ORPHAN_DIR_SYSTEM_INODE, |
334 | EXTENT_ALLOC_SYSTEM_INODE, | 350 | EXTENT_ALLOC_SYSTEM_INODE, |
335 | INODE_ALLOC_SYSTEM_INODE, | 351 | INODE_ALLOC_SYSTEM_INODE, |
336 | JOURNAL_SYSTEM_INODE, | 352 | JOURNAL_SYSTEM_INODE, |
337 | LOCAL_ALLOC_SYSTEM_INODE, | 353 | LOCAL_ALLOC_SYSTEM_INODE, |
338 | TRUNCATE_LOG_SYSTEM_INODE, | 354 | TRUNCATE_LOG_SYSTEM_INODE, |
355 | LOCAL_USER_QUOTA_SYSTEM_INODE, | ||
356 | LOCAL_GROUP_QUOTA_SYSTEM_INODE, | ||
339 | NUM_SYSTEM_INODES | 357 | NUM_SYSTEM_INODES |
340 | }; | 358 | }; |
341 | 359 | ||
@@ -349,6 +367,8 @@ static struct ocfs2_system_inode_info ocfs2_system_inodes[NUM_SYSTEM_INODES] = { | |||
349 | [SLOT_MAP_SYSTEM_INODE] = { "slot_map", 0, S_IFREG | 0644 }, | 367 | [SLOT_MAP_SYSTEM_INODE] = { "slot_map", 0, S_IFREG | 0644 }, |
350 | [HEARTBEAT_SYSTEM_INODE] = { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 }, | 368 | [HEARTBEAT_SYSTEM_INODE] = { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 }, |
351 | [GLOBAL_BITMAP_SYSTEM_INODE] = { "global_bitmap", 0, S_IFREG | 0644 }, | 369 | [GLOBAL_BITMAP_SYSTEM_INODE] = { "global_bitmap", 0, S_IFREG | 0644 }, |
370 | [USER_QUOTA_SYSTEM_INODE] = { "aquota.user", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | ||
371 | [GROUP_QUOTA_SYSTEM_INODE] = { "aquota.group", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | ||
352 | 372 | ||
353 | /* Slot-specific system inodes (one copy per slot) */ | 373 | /* Slot-specific system inodes (one copy per slot) */ |
354 | [ORPHAN_DIR_SYSTEM_INODE] = { "orphan_dir:%04d", 0, S_IFDIR | 0755 }, | 374 | [ORPHAN_DIR_SYSTEM_INODE] = { "orphan_dir:%04d", 0, S_IFDIR | 0755 }, |
@@ -356,7 +376,9 @@ static struct ocfs2_system_inode_info ocfs2_system_inodes[NUM_SYSTEM_INODES] = { | |||
356 | [INODE_ALLOC_SYSTEM_INODE] = { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 }, | 376 | [INODE_ALLOC_SYSTEM_INODE] = { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 }, |
357 | [JOURNAL_SYSTEM_INODE] = { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 }, | 377 | [JOURNAL_SYSTEM_INODE] = { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 }, |
358 | [LOCAL_ALLOC_SYSTEM_INODE] = { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 }, | 378 | [LOCAL_ALLOC_SYSTEM_INODE] = { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 }, |
359 | [TRUNCATE_LOG_SYSTEM_INODE] = { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 } | 379 | [TRUNCATE_LOG_SYSTEM_INODE] = { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 }, |
380 | [LOCAL_USER_QUOTA_SYSTEM_INODE] = { "aquota.user:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | ||
381 | [LOCAL_GROUP_QUOTA_SYSTEM_INODE] = { "aquota.group:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | ||
360 | }; | 382 | }; |
361 | 383 | ||
362 | /* Parameter passed from mount.ocfs2 to module */ | 384 | /* Parameter passed from mount.ocfs2 to module */ |
@@ -410,6 +432,22 @@ static unsigned char ocfs2_type_by_mode[S_IFMT >> S_SHIFT] = { | |||
410 | #define OCFS2_RAW_SB(dinode) (&((dinode)->id2.i_super)) | 432 | #define OCFS2_RAW_SB(dinode) (&((dinode)->id2.i_super)) |
411 | 433 | ||
412 | /* | 434 | /* |
435 | * Block checking structure. This is used in metadata to validate the | ||
436 | * contents. If OCFS2_FEATURE_INCOMPAT_META_ECC is not set, it is all | ||
437 | * zeros. | ||
438 | */ | ||
439 | struct ocfs2_block_check { | ||
440 | /*00*/ __le32 bc_crc32e; /* 802.3 Ethernet II CRC32 */ | ||
441 | __le16 bc_ecc; /* Single-error-correction parity vector. | ||
442 | This is a simple Hamming code dependant | ||
443 | on the blocksize. OCFS2's maximum | ||
444 | blocksize, 4K, requires 16 parity bits, | ||
445 | so we fit in __le16. */ | ||
446 | __le16 bc_reserved1; | ||
447 | /*08*/ | ||
448 | }; | ||
449 | |||
450 | /* | ||
413 | * On disk extent record for OCFS2 | 451 | * On disk extent record for OCFS2 |
414 | * It describes a range of clusters on disk. | 452 | * It describes a range of clusters on disk. |
415 | * | 453 | * |
@@ -496,7 +534,7 @@ struct ocfs2_truncate_log { | |||
496 | struct ocfs2_extent_block | 534 | struct ocfs2_extent_block |
497 | { | 535 | { |
498 | /*00*/ __u8 h_signature[8]; /* Signature for verification */ | 536 | /*00*/ __u8 h_signature[8]; /* Signature for verification */ |
499 | __le64 h_reserved1; | 537 | struct ocfs2_block_check h_check; /* Error checking */ |
500 | /*10*/ __le16 h_suballoc_slot; /* Slot suballocator this | 538 | /*10*/ __le16 h_suballoc_slot; /* Slot suballocator this |
501 | extent_header belongs to */ | 539 | extent_header belongs to */ |
502 | __le16 h_suballoc_bit; /* Bit offset in suballocator | 540 | __le16 h_suballoc_bit; /* Bit offset in suballocator |
@@ -666,7 +704,8 @@ struct ocfs2_dinode { | |||
666 | was set in i_flags */ | 704 | was set in i_flags */ |
667 | __le16 i_dyn_features; | 705 | __le16 i_dyn_features; |
668 | __le64 i_xattr_loc; | 706 | __le64 i_xattr_loc; |
669 | /*80*/ __le64 i_reserved2[7]; | 707 | /*80*/ struct ocfs2_block_check i_check; /* Error checking */ |
708 | /*88*/ __le64 i_reserved2[6]; | ||
670 | /*B8*/ union { | 709 | /*B8*/ union { |
671 | __le64 i_pad1; /* Generic way to refer to this | 710 | __le64 i_pad1; /* Generic way to refer to this |
672 | 64bit union */ | 711 | 64bit union */ |
@@ -715,6 +754,34 @@ struct ocfs2_dir_entry { | |||
715 | } __attribute__ ((packed)); | 754 | } __attribute__ ((packed)); |
716 | 755 | ||
717 | /* | 756 | /* |
757 | * Per-block record for the unindexed directory btree. This is carefully | ||
758 | * crafted so that the rec_len and name_len records of an ocfs2_dir_entry are | ||
759 | * mirrored. That way, the directory manipulation code needs a minimal amount | ||
760 | * of update. | ||
761 | * | ||
762 | * NOTE: Keep this structure aligned to a multiple of 4 bytes. | ||
763 | */ | ||
764 | struct ocfs2_dir_block_trailer { | ||
765 | /*00*/ __le64 db_compat_inode; /* Always zero. Was inode */ | ||
766 | |||
767 | __le16 db_compat_rec_len; /* Backwards compatible with | ||
768 | * ocfs2_dir_entry. */ | ||
769 | __u8 db_compat_name_len; /* Always zero. Was name_len */ | ||
770 | __u8 db_reserved0; | ||
771 | __le16 db_reserved1; | ||
772 | __le16 db_free_rec_len; /* Size of largest empty hole | ||
773 | * in this block. (unused) */ | ||
774 | /*10*/ __u8 db_signature[8]; /* Signature for verification */ | ||
775 | __le64 db_reserved2; | ||
776 | __le64 db_free_next; /* Next block in list (unused) */ | ||
777 | /*20*/ __le64 db_blkno; /* Offset on disk, in blocks */ | ||
778 | __le64 db_parent_dinode; /* dinode which owns me, in | ||
779 | blocks */ | ||
780 | /*30*/ struct ocfs2_block_check db_check; /* Error checking */ | ||
781 | /*40*/ | ||
782 | }; | ||
783 | |||
784 | /* | ||
718 | * On disk allocator group structure for OCFS2 | 785 | * On disk allocator group structure for OCFS2 |
719 | */ | 786 | */ |
720 | struct ocfs2_group_desc | 787 | struct ocfs2_group_desc |
@@ -733,7 +800,8 @@ struct ocfs2_group_desc | |||
733 | /*20*/ __le64 bg_parent_dinode; /* dinode which owns me, in | 800 | /*20*/ __le64 bg_parent_dinode; /* dinode which owns me, in |
734 | blocks */ | 801 | blocks */ |
735 | __le64 bg_blkno; /* Offset on disk, in blocks */ | 802 | __le64 bg_blkno; /* Offset on disk, in blocks */ |
736 | /*30*/ __le64 bg_reserved2[2]; | 803 | /*30*/ struct ocfs2_block_check bg_check; /* Error checking */ |
804 | __le64 bg_reserved2; | ||
737 | /*40*/ __u8 bg_bitmap[0]; | 805 | /*40*/ __u8 bg_bitmap[0]; |
738 | }; | 806 | }; |
739 | 807 | ||
@@ -776,7 +844,12 @@ struct ocfs2_xattr_header { | |||
776 | in this extent record, | 844 | in this extent record, |
777 | only valid in the first | 845 | only valid in the first |
778 | bucket. */ | 846 | bucket. */ |
779 | __le64 xh_csum; | 847 | struct ocfs2_block_check xh_check; /* Error checking |
848 | (Note, this is only | ||
849 | used for xattr | ||
850 | buckets. A block uses | ||
851 | xb_check and sets | ||
852 | this field to zero.) */ | ||
780 | struct ocfs2_xattr_entry xh_entries[0]; /* xattr entry list. */ | 853 | struct ocfs2_xattr_entry xh_entries[0]; /* xattr entry list. */ |
781 | }; | 854 | }; |
782 | 855 | ||
@@ -827,7 +900,7 @@ struct ocfs2_xattr_block { | |||
827 | block group */ | 900 | block group */ |
828 | __le32 xb_fs_generation; /* Must match super block */ | 901 | __le32 xb_fs_generation; /* Must match super block */ |
829 | /*10*/ __le64 xb_blkno; /* Offset on disk, in blocks */ | 902 | /*10*/ __le64 xb_blkno; /* Offset on disk, in blocks */ |
830 | __le64 xb_csum; | 903 | struct ocfs2_block_check xb_check; /* Error checking */ |
831 | /*20*/ __le16 xb_flags; /* Indicates whether this block contains | 904 | /*20*/ __le16 xb_flags; /* Indicates whether this block contains |
832 | real xattr or a xattr tree. */ | 905 | real xattr or a xattr tree. */ |
833 | __le16 xb_reserved0; | 906 | __le16 xb_reserved0; |
@@ -868,6 +941,128 @@ static inline int ocfs2_xattr_get_type(struct ocfs2_xattr_entry *xe) | |||
868 | return xe->xe_type & OCFS2_XATTR_TYPE_MASK; | 941 | return xe->xe_type & OCFS2_XATTR_TYPE_MASK; |
869 | } | 942 | } |
870 | 943 | ||
944 | /* | ||
945 | * On disk structures for global quota file | ||
946 | */ | ||
947 | |||
948 | /* Magic numbers and known versions for global quota files */ | ||
949 | #define OCFS2_GLOBAL_QMAGICS {\ | ||
950 | 0x0cf52470, /* USRQUOTA */ \ | ||
951 | 0x0cf52471 /* GRPQUOTA */ \ | ||
952 | } | ||
953 | |||
954 | #define OCFS2_GLOBAL_QVERSIONS {\ | ||
955 | 0, \ | ||
956 | 0, \ | ||
957 | } | ||
958 | |||
959 | |||
960 | /* Each block of each quota file has a certain fixed number of bytes reserved | ||
961 | * for OCFS2 internal use at its end. OCFS2 can use it for things like | ||
962 | * checksums, etc. */ | ||
963 | #define OCFS2_QBLK_RESERVED_SPACE 8 | ||
964 | |||
965 | /* Generic header of all quota files */ | ||
966 | struct ocfs2_disk_dqheader { | ||
967 | __le32 dqh_magic; /* Magic number identifying file */ | ||
968 | __le32 dqh_version; /* Quota format version */ | ||
969 | }; | ||
970 | |||
971 | #define OCFS2_GLOBAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader)) | ||
972 | |||
973 | /* Information header of global quota file (immediately follows the generic | ||
974 | * header) */ | ||
975 | struct ocfs2_global_disk_dqinfo { | ||
976 | /*00*/ __le32 dqi_bgrace; /* Grace time for space softlimit excess */ | ||
977 | __le32 dqi_igrace; /* Grace time for inode softlimit excess */ | ||
978 | __le32 dqi_syncms; /* Time after which we sync local changes to | ||
979 | * global quota file */ | ||
980 | __le32 dqi_blocks; /* Number of blocks in quota file */ | ||
981 | /*10*/ __le32 dqi_free_blk; /* First free block in quota file */ | ||
982 | __le32 dqi_free_entry; /* First block with free dquot entry in quota | ||
983 | * file */ | ||
984 | }; | ||
985 | |||
986 | /* Structure with global user / group information. We reserve some space | ||
987 | * for future use. */ | ||
988 | struct ocfs2_global_disk_dqblk { | ||
989 | /*00*/ __le32 dqb_id; /* ID the structure belongs to */ | ||
990 | __le32 dqb_use_count; /* Number of nodes having reference to this structure */ | ||
991 | __le64 dqb_ihardlimit; /* absolute limit on allocated inodes */ | ||
992 | /*10*/ __le64 dqb_isoftlimit; /* preferred inode limit */ | ||
993 | __le64 dqb_curinodes; /* current # allocated inodes */ | ||
994 | /*20*/ __le64 dqb_bhardlimit; /* absolute limit on disk space */ | ||
995 | __le64 dqb_bsoftlimit; /* preferred limit on disk space */ | ||
996 | /*30*/ __le64 dqb_curspace; /* current space occupied */ | ||
997 | __le64 dqb_btime; /* time limit for excessive disk use */ | ||
998 | /*40*/ __le64 dqb_itime; /* time limit for excessive inode use */ | ||
999 | __le64 dqb_pad1; | ||
1000 | /*50*/ __le64 dqb_pad2; | ||
1001 | }; | ||
1002 | |||
1003 | /* | ||
1004 | * On-disk structures for local quota file | ||
1005 | */ | ||
1006 | |||
1007 | /* Magic numbers and known versions for local quota files */ | ||
1008 | #define OCFS2_LOCAL_QMAGICS {\ | ||
1009 | 0x0cf524c0, /* USRQUOTA */ \ | ||
1010 | 0x0cf524c1 /* GRPQUOTA */ \ | ||
1011 | } | ||
1012 | |||
1013 | #define OCFS2_LOCAL_QVERSIONS {\ | ||
1014 | 0, \ | ||
1015 | 0, \ | ||
1016 | } | ||
1017 | |||
1018 | /* Quota flags in dqinfo header */ | ||
1019 | #define OLQF_CLEAN 0x0001 /* Quota file is empty (this should be after\ | ||
1020 | * quota has been cleanly turned off) */ | ||
1021 | |||
1022 | #define OCFS2_LOCAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader)) | ||
1023 | |||
1024 | /* Information header of local quota file (immediately follows the generic | ||
1025 | * header) */ | ||
1026 | struct ocfs2_local_disk_dqinfo { | ||
1027 | __le32 dqi_flags; /* Flags for quota file */ | ||
1028 | __le32 dqi_chunks; /* Number of chunks of quota structures | ||
1029 | * with a bitmap */ | ||
1030 | __le32 dqi_blocks; /* Number of blocks allocated for quota file */ | ||
1031 | }; | ||
1032 | |||
1033 | /* Header of one chunk of a quota file */ | ||
1034 | struct ocfs2_local_disk_chunk { | ||
1035 | __le32 dqc_free; /* Number of free entries in the bitmap */ | ||
1036 | u8 dqc_bitmap[0]; /* Bitmap of entries in the corresponding | ||
1037 | * chunk of quota file */ | ||
1038 | }; | ||
1039 | |||
1040 | /* One entry in local quota file */ | ||
1041 | struct ocfs2_local_disk_dqblk { | ||
1042 | /*00*/ __le64 dqb_id; /* id this quota applies to */ | ||
1043 | __le64 dqb_spacemod; /* Change in the amount of used space */ | ||
1044 | /*10*/ __le64 dqb_inodemod; /* Change in the amount of used inodes */ | ||
1045 | }; | ||
1046 | |||
1047 | |||
1048 | /* | ||
1049 | * The quota trailer lives at the end of each quota block. | ||
1050 | */ | ||
1051 | |||
1052 | struct ocfs2_disk_dqtrailer { | ||
1053 | /*00*/ struct ocfs2_block_check dq_check; /* Error checking */ | ||
1054 | /*08*/ /* Cannot be larger than OCFS2_QBLK_RESERVED_SPACE */ | ||
1055 | }; | ||
1056 | |||
1057 | static inline struct ocfs2_disk_dqtrailer *ocfs2_block_dqtrailer(int blocksize, | ||
1058 | void *buf) | ||
1059 | { | ||
1060 | char *ptr = buf; | ||
1061 | ptr += blocksize - OCFS2_QBLK_RESERVED_SPACE; | ||
1062 | |||
1063 | return (struct ocfs2_disk_dqtrailer *)ptr; | ||
1064 | } | ||
1065 | |||
871 | #ifdef __KERNEL__ | 1066 | #ifdef __KERNEL__ |
872 | static inline int ocfs2_fast_symlink_chars(struct super_block *sb) | 1067 | static inline int ocfs2_fast_symlink_chars(struct super_block *sb) |
873 | { | 1068 | { |