udf: convert UDF_SB_ALLOC_PARTMAPS macro to udf_sb_alloc_partition_maps function
[sfrench/cifs-2.6.git] / fs / udf / udf_sb.h
1 #ifndef __LINUX_UDF_SB_H
2 #define __LINUX_UDF_SB_H
3
4 /* Since UDF 2.01 is ISO 13346 based... */
5 #define UDF_SUPER_MAGIC                 0x15013346
6
7 #define UDF_MAX_READ_VERSION            0x0201
8 #define UDF_MAX_WRITE_VERSION           0x0201
9
10 #define UDF_FLAG_USE_EXTENDED_FE        0
11 #define UDF_VERS_USE_EXTENDED_FE        0x0200
12 #define UDF_FLAG_USE_STREAMS            1
13 #define UDF_VERS_USE_STREAMS            0x0200
14 #define UDF_FLAG_USE_SHORT_AD           2
15 #define UDF_FLAG_USE_AD_IN_ICB          3
16 #define UDF_FLAG_USE_FILE_CTIME_EA      4
17 #define UDF_FLAG_STRICT                 5
18 #define UDF_FLAG_UNDELETE               6
19 #define UDF_FLAG_UNHIDE                 7
20 #define UDF_FLAG_VARCONV                8
21 #define UDF_FLAG_NLS_MAP                9
22 #define UDF_FLAG_UTF8                   10
23 #define UDF_FLAG_UID_FORGET     11    /* save -1 for uid to disk */
24 #define UDF_FLAG_UID_IGNORE     12    /* use sb uid instead of on disk uid */
25 #define UDF_FLAG_GID_FORGET     13
26 #define UDF_FLAG_GID_IGNORE     14
27 #define UDF_FLAG_UID_SET        15
28 #define UDF_FLAG_GID_SET        16
29
30 #define UDF_PART_FLAG_UNALLOC_BITMAP    0x0001
31 #define UDF_PART_FLAG_UNALLOC_TABLE     0x0002
32 #define UDF_PART_FLAG_FREED_BITMAP      0x0004
33 #define UDF_PART_FLAG_FREED_TABLE       0x0008
34 #define UDF_PART_FLAG_READ_ONLY         0x0010
35 #define UDF_PART_FLAG_WRITE_ONCE        0x0020
36 #define UDF_PART_FLAG_REWRITABLE        0x0040
37 #define UDF_PART_FLAG_OVERWRITABLE      0x0080
38
39 static inline struct udf_sb_info *UDF_SB(struct super_block *sb)
40 {
41         return sb->s_fs_info;
42 }
43
44 struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi);
45
46 #define UDF_SB_ALLOC_BITMAP(X,Y,Z)\
47 {\
48         struct udf_sb_info *sbi = UDF_SB(X);\
49         int nr_groups = ((sbi->s_partmaps[(Y)].s_partition_len + (sizeof(struct spaceBitmapDesc) << 3) +\
50                 ((X)->s_blocksize * 8) - 1) / ((X)->s_blocksize * 8));\
51         int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\
52         if (size <= PAGE_SIZE)\
53                 sbi->s_partmaps[(Y)].Z.s_bitmap = kmalloc(size, GFP_KERNEL);\
54         else\
55                 sbi->s_partmaps[(Y)].Z.s_bitmap = vmalloc(size);\
56         if (sbi->s_partmaps[(Y)].Z.s_bitmap != NULL) {\
57                 memset(sbi->s_partmaps[(Y)].Z.s_bitmap, 0x00, size);\
58                 sbi->s_partmaps[(Y)].Z.s_bitmap->s_block_bitmap =\
59                         (struct buffer_head **)(sbi->s_partmaps[(Y)].Z.s_bitmap + 1);\
60                 sbi->s_partmaps[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\
61         } else {\
62                 udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\
63         }\
64 }
65
66 #define UDF_SB_FREE_BITMAP(X,Y,Z)\
67 {\
68         int i;\
69         int nr_groups = UDF_SB_BITMAP_NR_GROUPS(X,Y,Z);\
70         int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\
71         for (i = 0; i < nr_groups; i++) {\
72                 if (UDF_SB_BITMAP(X,Y,Z,i))\
73                         brelse(UDF_SB_BITMAP(X,Y,Z,i));\
74         }\
75         if (size <= PAGE_SIZE)\
76                 kfree(UDF_SB(X)->s_partmaps[Y].Z.s_bitmap);\
77         else\
78                 vfree(UDF_SB(X)->s_partmaps[Y].Z.s_bitmap);\
79 }
80
81 #define UDF_QUERY_FLAG(X,Y)                     ( UDF_SB(X)->s_flags & ( 1 << (Y) ) )
82 #define UDF_SET_FLAG(X,Y)                       ( UDF_SB(X)->s_flags |= ( 1 << (Y) ) )
83 #define UDF_CLEAR_FLAG(X,Y)                     ( UDF_SB(X)->s_flags &= ~( 1 << (Y) ) )
84
85 #define UDF_SB_BITMAP(X,Y,Z,I)                  ( UDF_SB(X)->s_partmaps[(Y)].Z.s_bitmap->s_block_bitmap[I] )
86 #define UDF_SB_BITMAP_NR_GROUPS(X,Y,Z)          ( UDF_SB(X)->s_partmaps[(Y)].Z.s_bitmap->s_nr_groups )
87
88 #endif /* __LINUX_UDF_SB_H */