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/ubifs/lpt.c | |
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/ubifs/lpt.c')
-rw-r--r-- | fs/ubifs/lpt.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/fs/ubifs/lpt.c b/fs/ubifs/lpt.c index db8bd0e518b2..b2792e84d245 100644 --- a/fs/ubifs/lpt.c +++ b/fs/ubifs/lpt.c | |||
@@ -36,15 +36,16 @@ | |||
36 | * can be written into a single eraseblock. In that case, garbage collection | 36 | * can be written into a single eraseblock. In that case, garbage collection |
37 | * consists of just writing the whole table, which therefore makes all other | 37 | * consists of just writing the whole table, which therefore makes all other |
38 | * eraseblocks reusable. In the case of the big model, dirty eraseblocks are | 38 | * eraseblocks reusable. In the case of the big model, dirty eraseblocks are |
39 | * selected for garbage collection, which consists are marking the nodes in | 39 | * selected for garbage collection, which consists of marking the clean nodes in |
40 | * that LEB as dirty, and then only the dirty nodes are written out. Also, in | 40 | * that LEB as dirty, and then only the dirty nodes are written out. Also, in |
41 | * the case of the big model, a table of LEB numbers is saved so that the entire | 41 | * the case of the big model, a table of LEB numbers is saved so that the entire |
42 | * LPT does not to be scanned looking for empty eraseblocks when UBIFS is first | 42 | * LPT does not to be scanned looking for empty eraseblocks when UBIFS is first |
43 | * mounted. | 43 | * mounted. |
44 | */ | 44 | */ |
45 | 45 | ||
46 | #include <linux/crc16.h> | ||
47 | #include "ubifs.h" | 46 | #include "ubifs.h" |
47 | #include <linux/crc16.h> | ||
48 | #include <linux/math64.h> | ||
48 | 49 | ||
49 | /** | 50 | /** |
50 | * do_calc_lpt_geom - calculate sizes for the LPT area. | 51 | * do_calc_lpt_geom - calculate sizes for the LPT area. |
@@ -135,15 +136,13 @@ static void do_calc_lpt_geom(struct ubifs_info *c) | |||
135 | int ubifs_calc_lpt_geom(struct ubifs_info *c) | 136 | int ubifs_calc_lpt_geom(struct ubifs_info *c) |
136 | { | 137 | { |
137 | int lebs_needed; | 138 | int lebs_needed; |
138 | uint64_t sz; | 139 | long long sz; |
139 | 140 | ||
140 | do_calc_lpt_geom(c); | 141 | do_calc_lpt_geom(c); |
141 | 142 | ||
142 | /* Verify that lpt_lebs is big enough */ | 143 | /* Verify that lpt_lebs is big enough */ |
143 | sz = c->lpt_sz * 2; /* Must have at least 2 times the size */ | 144 | sz = c->lpt_sz * 2; /* Must have at least 2 times the size */ |
144 | sz += c->leb_size - 1; | 145 | lebs_needed = div_u64(sz + c->leb_size - 1, c->leb_size); |
145 | do_div(sz, c->leb_size); | ||
146 | lebs_needed = sz; | ||
147 | if (lebs_needed > c->lpt_lebs) { | 146 | if (lebs_needed > c->lpt_lebs) { |
148 | ubifs_err("too few LPT LEBs"); | 147 | ubifs_err("too few LPT LEBs"); |
149 | return -EINVAL; | 148 | return -EINVAL; |
@@ -156,7 +155,6 @@ int ubifs_calc_lpt_geom(struct ubifs_info *c) | |||
156 | } | 155 | } |
157 | 156 | ||
158 | c->check_lpt_free = c->big_lpt; | 157 | c->check_lpt_free = c->big_lpt; |
159 | |||
160 | return 0; | 158 | return 0; |
161 | } | 159 | } |
162 | 160 | ||
@@ -176,7 +174,7 @@ static int calc_dflt_lpt_geom(struct ubifs_info *c, int *main_lebs, | |||
176 | int *big_lpt) | 174 | int *big_lpt) |
177 | { | 175 | { |
178 | int i, lebs_needed; | 176 | int i, lebs_needed; |
179 | uint64_t sz; | 177 | long long sz; |
180 | 178 | ||
181 | /* Start by assuming the minimum number of LPT LEBs */ | 179 | /* Start by assuming the minimum number of LPT LEBs */ |
182 | c->lpt_lebs = UBIFS_MIN_LPT_LEBS; | 180 | c->lpt_lebs = UBIFS_MIN_LPT_LEBS; |
@@ -203,9 +201,7 @@ static int calc_dflt_lpt_geom(struct ubifs_info *c, int *main_lebs, | |||
203 | /* Now check there are enough LPT LEBs */ | 201 | /* Now check there are enough LPT LEBs */ |
204 | for (i = 0; i < 64 ; i++) { | 202 | for (i = 0; i < 64 ; i++) { |
205 | sz = c->lpt_sz * 4; /* Allow 4 times the size */ | 203 | sz = c->lpt_sz * 4; /* Allow 4 times the size */ |
206 | sz += c->leb_size - 1; | 204 | lebs_needed = div_u64(sz + c->leb_size - 1, c->leb_size); |
207 | do_div(sz, c->leb_size); | ||
208 | lebs_needed = sz; | ||
209 | if (lebs_needed > c->lpt_lebs) { | 205 | if (lebs_needed > c->lpt_lebs) { |
210 | /* Not enough LPT LEBs so try again with more */ | 206 | /* Not enough LPT LEBs so try again with more */ |
211 | c->lpt_lebs = lebs_needed; | 207 | c->lpt_lebs = lebs_needed; |
@@ -558,7 +554,7 @@ static int calc_nnode_num(int row, int col) | |||
558 | * This function calculates and returns the nnode number based on the parent's | 554 | * This function calculates and returns the nnode number based on the parent's |
559 | * nnode number and the index in parent. | 555 | * nnode number and the index in parent. |
560 | */ | 556 | */ |
561 | static int calc_nnode_num_from_parent(struct ubifs_info *c, | 557 | static int calc_nnode_num_from_parent(const struct ubifs_info *c, |
562 | struct ubifs_nnode *parent, int iip) | 558 | struct ubifs_nnode *parent, int iip) |
563 | { | 559 | { |
564 | int num, shft; | 560 | int num, shft; |
@@ -583,7 +579,7 @@ static int calc_nnode_num_from_parent(struct ubifs_info *c, | |||
583 | * This function calculates and returns the pnode number based on the parent's | 579 | * This function calculates and returns the pnode number based on the parent's |
584 | * nnode number and the index in parent. | 580 | * nnode number and the index in parent. |
585 | */ | 581 | */ |
586 | static int calc_pnode_num_from_parent(struct ubifs_info *c, | 582 | static int calc_pnode_num_from_parent(const struct ubifs_info *c, |
587 | struct ubifs_nnode *parent, int iip) | 583 | struct ubifs_nnode *parent, int iip) |
588 | { | 584 | { |
589 | int i, n = c->lpt_hght - 1, pnum = parent->num, num = 0; | 585 | int i, n = c->lpt_hght - 1, pnum = parent->num, num = 0; |
@@ -966,7 +962,7 @@ static int check_lpt_type(uint8_t **addr, int *pos, int type) | |||
966 | * | 962 | * |
967 | * This function returns %0 on success and a negative error code on failure. | 963 | * This function returns %0 on success and a negative error code on failure. |
968 | */ | 964 | */ |
969 | static int unpack_pnode(struct ubifs_info *c, void *buf, | 965 | static int unpack_pnode(const struct ubifs_info *c, void *buf, |
970 | struct ubifs_pnode *pnode) | 966 | struct ubifs_pnode *pnode) |
971 | { | 967 | { |
972 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; | 968 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; |
@@ -996,15 +992,15 @@ static int unpack_pnode(struct ubifs_info *c, void *buf, | |||
996 | } | 992 | } |
997 | 993 | ||
998 | /** | 994 | /** |
999 | * unpack_nnode - unpack a nnode. | 995 | * ubifs_unpack_nnode - unpack a nnode. |
1000 | * @c: UBIFS file-system description object | 996 | * @c: UBIFS file-system description object |
1001 | * @buf: buffer containing packed nnode to unpack | 997 | * @buf: buffer containing packed nnode to unpack |
1002 | * @nnode: nnode structure to fill | 998 | * @nnode: nnode structure to fill |
1003 | * | 999 | * |
1004 | * This function returns %0 on success and a negative error code on failure. | 1000 | * This function returns %0 on success and a negative error code on failure. |
1005 | */ | 1001 | */ |
1006 | static int unpack_nnode(struct ubifs_info *c, void *buf, | 1002 | int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf, |
1007 | struct ubifs_nnode *nnode) | 1003 | struct ubifs_nnode *nnode) |
1008 | { | 1004 | { |
1009 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; | 1005 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; |
1010 | int i, pos = 0, err; | 1006 | int i, pos = 0, err; |
@@ -1036,7 +1032,7 @@ static int unpack_nnode(struct ubifs_info *c, void *buf, | |||
1036 | * | 1032 | * |
1037 | * This function returns %0 on success and a negative error code on failure. | 1033 | * This function returns %0 on success and a negative error code on failure. |
1038 | */ | 1034 | */ |
1039 | static int unpack_ltab(struct ubifs_info *c, void *buf) | 1035 | static int unpack_ltab(const struct ubifs_info *c, void *buf) |
1040 | { | 1036 | { |
1041 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; | 1037 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; |
1042 | int i, pos = 0, err; | 1038 | int i, pos = 0, err; |
@@ -1068,7 +1064,7 @@ static int unpack_ltab(struct ubifs_info *c, void *buf) | |||
1068 | * | 1064 | * |
1069 | * This function returns %0 on success and a negative error code on failure. | 1065 | * This function returns %0 on success and a negative error code on failure. |
1070 | */ | 1066 | */ |
1071 | static int unpack_lsave(struct ubifs_info *c, void *buf) | 1067 | static int unpack_lsave(const struct ubifs_info *c, void *buf) |
1072 | { | 1068 | { |
1073 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; | 1069 | uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES; |
1074 | int i, pos = 0, err; | 1070 | int i, pos = 0, err; |
@@ -1096,7 +1092,7 @@ static int unpack_lsave(struct ubifs_info *c, void *buf) | |||
1096 | * | 1092 | * |
1097 | * This function returns %0 on success and a negative error code on failure. | 1093 | * This function returns %0 on success and a negative error code on failure. |
1098 | */ | 1094 | */ |
1099 | static int validate_nnode(struct ubifs_info *c, struct ubifs_nnode *nnode, | 1095 | static int validate_nnode(const struct ubifs_info *c, struct ubifs_nnode *nnode, |
1100 | struct ubifs_nnode *parent, int iip) | 1096 | struct ubifs_nnode *parent, int iip) |
1101 | { | 1097 | { |
1102 | int i, lvl, max_offs; | 1098 | int i, lvl, max_offs; |
@@ -1140,7 +1136,7 @@ static int validate_nnode(struct ubifs_info *c, struct ubifs_nnode *nnode, | |||
1140 | * | 1136 | * |
1141 | * This function returns %0 on success and a negative error code on failure. | 1137 | * This function returns %0 on success and a negative error code on failure. |
1142 | */ | 1138 | */ |
1143 | static int validate_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode, | 1139 | static int validate_pnode(const struct ubifs_info *c, struct ubifs_pnode *pnode, |
1144 | struct ubifs_nnode *parent, int iip) | 1140 | struct ubifs_nnode *parent, int iip) |
1145 | { | 1141 | { |
1146 | int i; | 1142 | int i; |
@@ -1174,7 +1170,8 @@ static int validate_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode, | |||
1174 | * This function calculates the LEB numbers for the LEB properties it contains | 1170 | * This function calculates the LEB numbers for the LEB properties it contains |
1175 | * based on the pnode number. | 1171 | * based on the pnode number. |
1176 | */ | 1172 | */ |
1177 | static void set_pnode_lnum(struct ubifs_info *c, struct ubifs_pnode *pnode) | 1173 | static void set_pnode_lnum(const struct ubifs_info *c, |
1174 | struct ubifs_pnode *pnode) | ||
1178 | { | 1175 | { |
1179 | int i, lnum; | 1176 | int i, lnum; |
1180 | 1177 | ||
@@ -1227,7 +1224,7 @@ int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip) | |||
1227 | err = ubi_read(c->ubi, lnum, buf, offs, c->nnode_sz); | 1224 | err = ubi_read(c->ubi, lnum, buf, offs, c->nnode_sz); |
1228 | if (err) | 1225 | if (err) |
1229 | goto out; | 1226 | goto out; |
1230 | err = unpack_nnode(c, buf, nnode); | 1227 | err = ubifs_unpack_nnode(c, buf, nnode); |
1231 | if (err) | 1228 | if (err) |
1232 | goto out; | 1229 | goto out; |
1233 | } | 1230 | } |
@@ -1816,7 +1813,7 @@ static struct ubifs_nnode *scan_get_nnode(struct ubifs_info *c, | |||
1816 | c->nnode_sz); | 1813 | c->nnode_sz); |
1817 | if (err) | 1814 | if (err) |
1818 | return ERR_PTR(err); | 1815 | return ERR_PTR(err); |
1819 | err = unpack_nnode(c, buf, nnode); | 1816 | err = ubifs_unpack_nnode(c, buf, nnode); |
1820 | if (err) | 1817 | if (err) |
1821 | return ERR_PTR(err); | 1818 | return ERR_PTR(err); |
1822 | } | 1819 | } |