diff options
Diffstat (limited to 'fs/logfs')
-rw-r--r-- | fs/logfs/dev_mtd.c | 96 | ||||
-rw-r--r-- | fs/logfs/dir.c | 6 | ||||
-rw-r--r-- | fs/logfs/inode.c | 3 | ||||
-rw-r--r-- | fs/logfs/logfs.h | 2 |
4 files changed, 55 insertions, 52 deletions
diff --git a/fs/logfs/dev_mtd.c b/fs/logfs/dev_mtd.c index d054d7e975ca..e97404d611e0 100644 --- a/fs/logfs/dev_mtd.c +++ b/fs/logfs/dev_mtd.c | |||
@@ -13,13 +13,14 @@ | |||
13 | 13 | ||
14 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) | 14 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) |
15 | 15 | ||
16 | static int mtd_read(struct super_block *sb, loff_t ofs, size_t len, void *buf) | 16 | static int logfs_mtd_read(struct super_block *sb, loff_t ofs, size_t len, |
17 | void *buf) | ||
17 | { | 18 | { |
18 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; | 19 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; |
19 | size_t retlen; | 20 | size_t retlen; |
20 | int ret; | 21 | int ret; |
21 | 22 | ||
22 | ret = mtd->read(mtd, ofs, len, &retlen, buf); | 23 | ret = mtd_read(mtd, ofs, len, &retlen, buf); |
23 | BUG_ON(ret == -EINVAL); | 24 | BUG_ON(ret == -EINVAL); |
24 | if (ret) | 25 | if (ret) |
25 | return ret; | 26 | return ret; |
@@ -31,7 +32,8 @@ static int mtd_read(struct super_block *sb, loff_t ofs, size_t len, void *buf) | |||
31 | return 0; | 32 | return 0; |
32 | } | 33 | } |
33 | 34 | ||
34 | static int mtd_write(struct super_block *sb, loff_t ofs, size_t len, void *buf) | 35 | static int loffs_mtd_write(struct super_block *sb, loff_t ofs, size_t len, |
36 | void *buf) | ||
35 | { | 37 | { |
36 | struct logfs_super *super = logfs_super(sb); | 38 | struct logfs_super *super = logfs_super(sb); |
37 | struct mtd_info *mtd = super->s_mtd; | 39 | struct mtd_info *mtd = super->s_mtd; |
@@ -47,7 +49,7 @@ static int mtd_write(struct super_block *sb, loff_t ofs, size_t len, void *buf) | |||
47 | BUG_ON(len > PAGE_CACHE_SIZE); | 49 | BUG_ON(len > PAGE_CACHE_SIZE); |
48 | page_start = ofs & PAGE_CACHE_MASK; | 50 | page_start = ofs & PAGE_CACHE_MASK; |
49 | page_end = PAGE_CACHE_ALIGN(ofs + len) - 1; | 51 | page_end = PAGE_CACHE_ALIGN(ofs + len) - 1; |
50 | ret = mtd->write(mtd, ofs, len, &retlen, buf); | 52 | ret = mtd_write(mtd, ofs, len, &retlen, buf); |
51 | if (ret || (retlen != len)) | 53 | if (ret || (retlen != len)) |
52 | return -EIO; | 54 | return -EIO; |
53 | 55 | ||
@@ -60,14 +62,15 @@ static int mtd_write(struct super_block *sb, loff_t ofs, size_t len, void *buf) | |||
60 | * asynchronous properties. So just to prevent the first implementor of such | 62 | * asynchronous properties. So just to prevent the first implementor of such |
61 | * a thing from breaking logfs in 2350, we do the usual pointless dance to | 63 | * a thing from breaking logfs in 2350, we do the usual pointless dance to |
62 | * declare a completion variable and wait for completion before returning | 64 | * declare a completion variable and wait for completion before returning |
63 | * from mtd_erase(). What an exercise in futility! | 65 | * from logfs_mtd_erase(). What an exercise in futility! |
64 | */ | 66 | */ |
65 | static void logfs_erase_callback(struct erase_info *ei) | 67 | static void logfs_erase_callback(struct erase_info *ei) |
66 | { | 68 | { |
67 | complete((struct completion *)ei->priv); | 69 | complete((struct completion *)ei->priv); |
68 | } | 70 | } |
69 | 71 | ||
70 | static int mtd_erase_mapping(struct super_block *sb, loff_t ofs, size_t len) | 72 | static int logfs_mtd_erase_mapping(struct super_block *sb, loff_t ofs, |
73 | size_t len) | ||
71 | { | 74 | { |
72 | struct logfs_super *super = logfs_super(sb); | 75 | struct logfs_super *super = logfs_super(sb); |
73 | struct address_space *mapping = super->s_mapping_inode->i_mapping; | 76 | struct address_space *mapping = super->s_mapping_inode->i_mapping; |
@@ -84,7 +87,7 @@ static int mtd_erase_mapping(struct super_block *sb, loff_t ofs, size_t len) | |||
84 | return 0; | 87 | return 0; |
85 | } | 88 | } |
86 | 89 | ||
87 | static int mtd_erase(struct super_block *sb, loff_t ofs, size_t len, | 90 | static int logfs_mtd_erase(struct super_block *sb, loff_t ofs, size_t len, |
88 | int ensure_write) | 91 | int ensure_write) |
89 | { | 92 | { |
90 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; | 93 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; |
@@ -102,30 +105,29 @@ static int mtd_erase(struct super_block *sb, loff_t ofs, size_t len, | |||
102 | ei.len = len; | 105 | ei.len = len; |
103 | ei.callback = logfs_erase_callback; | 106 | ei.callback = logfs_erase_callback; |
104 | ei.priv = (long)&complete; | 107 | ei.priv = (long)&complete; |
105 | ret = mtd->erase(mtd, &ei); | 108 | ret = mtd_erase(mtd, &ei); |
106 | if (ret) | 109 | if (ret) |
107 | return -EIO; | 110 | return -EIO; |
108 | 111 | ||
109 | wait_for_completion(&complete); | 112 | wait_for_completion(&complete); |
110 | if (ei.state != MTD_ERASE_DONE) | 113 | if (ei.state != MTD_ERASE_DONE) |
111 | return -EIO; | 114 | return -EIO; |
112 | return mtd_erase_mapping(sb, ofs, len); | 115 | return logfs_mtd_erase_mapping(sb, ofs, len); |
113 | } | 116 | } |
114 | 117 | ||
115 | static void mtd_sync(struct super_block *sb) | 118 | static void logfs_mtd_sync(struct super_block *sb) |
116 | { | 119 | { |
117 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; | 120 | struct mtd_info *mtd = logfs_super(sb)->s_mtd; |
118 | 121 | ||
119 | if (mtd->sync) | 122 | mtd_sync(mtd); |
120 | mtd->sync(mtd); | ||
121 | } | 123 | } |
122 | 124 | ||
123 | static int mtd_readpage(void *_sb, struct page *page) | 125 | static int logfs_mtd_readpage(void *_sb, struct page *page) |
124 | { | 126 | { |
125 | struct super_block *sb = _sb; | 127 | struct super_block *sb = _sb; |
126 | int err; | 128 | int err; |
127 | 129 | ||
128 | err = mtd_read(sb, page->index << PAGE_SHIFT, PAGE_SIZE, | 130 | err = logfs_mtd_read(sb, page->index << PAGE_SHIFT, PAGE_SIZE, |
129 | page_address(page)); | 131 | page_address(page)); |
130 | if (err == -EUCLEAN || err == -EBADMSG) { | 132 | if (err == -EUCLEAN || err == -EBADMSG) { |
131 | /* -EBADMSG happens regularly on power failures */ | 133 | /* -EBADMSG happens regularly on power failures */ |
@@ -143,46 +145,48 @@ static int mtd_readpage(void *_sb, struct page *page) | |||
143 | return err; | 145 | return err; |
144 | } | 146 | } |
145 | 147 | ||
146 | static struct page *mtd_find_first_sb(struct super_block *sb, u64 *ofs) | 148 | static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs) |
147 | { | 149 | { |
148 | struct logfs_super *super = logfs_super(sb); | 150 | struct logfs_super *super = logfs_super(sb); |
149 | struct address_space *mapping = super->s_mapping_inode->i_mapping; | 151 | struct address_space *mapping = super->s_mapping_inode->i_mapping; |
150 | filler_t *filler = mtd_readpage; | 152 | filler_t *filler = logfs_mtd_readpage; |
151 | struct mtd_info *mtd = super->s_mtd; | 153 | struct mtd_info *mtd = super->s_mtd; |
152 | 154 | ||
155 | if (!mtd_can_have_bb(mtd)) | ||
156 | return NULL; | ||
157 | |||
153 | *ofs = 0; | 158 | *ofs = 0; |
154 | if (mtd->block_isbad) { | 159 | while (mtd_block_isbad(mtd, *ofs)) { |
155 | while (mtd->block_isbad(mtd, *ofs)) { | 160 | *ofs += mtd->erasesize; |
156 | *ofs += mtd->erasesize; | 161 | if (*ofs >= mtd->size) |
157 | if (*ofs >= mtd->size) | 162 | return NULL; |
158 | return NULL; | ||
159 | } | ||
160 | } | 163 | } |
161 | BUG_ON(*ofs & ~PAGE_MASK); | 164 | BUG_ON(*ofs & ~PAGE_MASK); |
162 | return read_cache_page(mapping, *ofs >> PAGE_SHIFT, filler, sb); | 165 | return read_cache_page(mapping, *ofs >> PAGE_SHIFT, filler, sb); |
163 | } | 166 | } |
164 | 167 | ||
165 | static struct page *mtd_find_last_sb(struct super_block *sb, u64 *ofs) | 168 | static struct page *logfs_mtd_find_last_sb(struct super_block *sb, u64 *ofs) |
166 | { | 169 | { |
167 | struct logfs_super *super = logfs_super(sb); | 170 | struct logfs_super *super = logfs_super(sb); |
168 | struct address_space *mapping = super->s_mapping_inode->i_mapping; | 171 | struct address_space *mapping = super->s_mapping_inode->i_mapping; |
169 | filler_t *filler = mtd_readpage; | 172 | filler_t *filler = logfs_mtd_readpage; |
170 | struct mtd_info *mtd = super->s_mtd; | 173 | struct mtd_info *mtd = super->s_mtd; |
171 | 174 | ||
175 | if (!mtd_can_have_bb(mtd)) | ||
176 | return NULL; | ||
177 | |||
172 | *ofs = mtd->size - mtd->erasesize; | 178 | *ofs = mtd->size - mtd->erasesize; |
173 | if (mtd->block_isbad) { | 179 | while (mtd_block_isbad(mtd, *ofs)) { |
174 | while (mtd->block_isbad(mtd, *ofs)) { | 180 | *ofs -= mtd->erasesize; |
175 | *ofs -= mtd->erasesize; | 181 | if (*ofs <= 0) |
176 | if (*ofs <= 0) | 182 | return NULL; |
177 | return NULL; | ||
178 | } | ||
179 | } | 183 | } |
180 | *ofs = *ofs + mtd->erasesize - 0x1000; | 184 | *ofs = *ofs + mtd->erasesize - 0x1000; |
181 | BUG_ON(*ofs & ~PAGE_MASK); | 185 | BUG_ON(*ofs & ~PAGE_MASK); |
182 | return read_cache_page(mapping, *ofs >> PAGE_SHIFT, filler, sb); | 186 | return read_cache_page(mapping, *ofs >> PAGE_SHIFT, filler, sb); |
183 | } | 187 | } |
184 | 188 | ||
185 | static int __mtd_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, | 189 | static int __logfs_mtd_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, |
186 | size_t nr_pages) | 190 | size_t nr_pages) |
187 | { | 191 | { |
188 | struct logfs_super *super = logfs_super(sb); | 192 | struct logfs_super *super = logfs_super(sb); |
@@ -194,8 +198,8 @@ static int __mtd_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, | |||
194 | page = find_lock_page(mapping, index + i); | 198 | page = find_lock_page(mapping, index + i); |
195 | BUG_ON(!page); | 199 | BUG_ON(!page); |
196 | 200 | ||
197 | err = mtd_write(sb, page->index << PAGE_SHIFT, PAGE_SIZE, | 201 | err = loffs_mtd_write(sb, page->index << PAGE_SHIFT, PAGE_SIZE, |
198 | page_address(page)); | 202 | page_address(page)); |
199 | unlock_page(page); | 203 | unlock_page(page); |
200 | page_cache_release(page); | 204 | page_cache_release(page); |
201 | if (err) | 205 | if (err) |
@@ -204,7 +208,7 @@ static int __mtd_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, | |||
204 | return 0; | 208 | return 0; |
205 | } | 209 | } |
206 | 210 | ||
207 | static void mtd_writeseg(struct super_block *sb, u64 ofs, size_t len) | 211 | static void logfs_mtd_writeseg(struct super_block *sb, u64 ofs, size_t len) |
208 | { | 212 | { |
209 | struct logfs_super *super = logfs_super(sb); | 213 | struct logfs_super *super = logfs_super(sb); |
210 | int head; | 214 | int head; |
@@ -225,15 +229,15 @@ static void mtd_writeseg(struct super_block *sb, u64 ofs, size_t len) | |||
225 | len += head; | 229 | len += head; |
226 | } | 230 | } |
227 | len = PAGE_ALIGN(len); | 231 | len = PAGE_ALIGN(len); |
228 | __mtd_writeseg(sb, ofs, ofs >> PAGE_SHIFT, len >> PAGE_SHIFT); | 232 | __logfs_mtd_writeseg(sb, ofs, ofs >> PAGE_SHIFT, len >> PAGE_SHIFT); |
229 | } | 233 | } |
230 | 234 | ||
231 | static void mtd_put_device(struct logfs_super *s) | 235 | static void logfs_mtd_put_device(struct logfs_super *s) |
232 | { | 236 | { |
233 | put_mtd_device(s->s_mtd); | 237 | put_mtd_device(s->s_mtd); |
234 | } | 238 | } |
235 | 239 | ||
236 | static int mtd_can_write_buf(struct super_block *sb, u64 ofs) | 240 | static int logfs_mtd_can_write_buf(struct super_block *sb, u64 ofs) |
237 | { | 241 | { |
238 | struct logfs_super *super = logfs_super(sb); | 242 | struct logfs_super *super = logfs_super(sb); |
239 | void *buf; | 243 | void *buf; |
@@ -242,7 +246,7 @@ static int mtd_can_write_buf(struct super_block *sb, u64 ofs) | |||
242 | buf = kmalloc(super->s_writesize, GFP_KERNEL); | 246 | buf = kmalloc(super->s_writesize, GFP_KERNEL); |
243 | if (!buf) | 247 | if (!buf) |
244 | return -ENOMEM; | 248 | return -ENOMEM; |
245 | err = mtd_read(sb, ofs, super->s_writesize, buf); | 249 | err = logfs_mtd_read(sb, ofs, super->s_writesize, buf); |
246 | if (err) | 250 | if (err) |
247 | goto out; | 251 | goto out; |
248 | if (memchr_inv(buf, 0xff, super->s_writesize)) | 252 | if (memchr_inv(buf, 0xff, super->s_writesize)) |
@@ -253,14 +257,14 @@ out: | |||
253 | } | 257 | } |
254 | 258 | ||
255 | static const struct logfs_device_ops mtd_devops = { | 259 | static const struct logfs_device_ops mtd_devops = { |
256 | .find_first_sb = mtd_find_first_sb, | 260 | .find_first_sb = logfs_mtd_find_first_sb, |
257 | .find_last_sb = mtd_find_last_sb, | 261 | .find_last_sb = logfs_mtd_find_last_sb, |
258 | .readpage = mtd_readpage, | 262 | .readpage = logfs_mtd_readpage, |
259 | .writeseg = mtd_writeseg, | 263 | .writeseg = logfs_mtd_writeseg, |
260 | .erase = mtd_erase, | 264 | .erase = logfs_mtd_erase, |
261 | .can_write_buf = mtd_can_write_buf, | 265 | .can_write_buf = logfs_mtd_can_write_buf, |
262 | .sync = mtd_sync, | 266 | .sync = logfs_mtd_sync, |
263 | .put_device = mtd_put_device, | 267 | .put_device = logfs_mtd_put_device, |
264 | }; | 268 | }; |
265 | 269 | ||
266 | int logfs_get_sb_mtd(struct logfs_super *s, int mtdnr) | 270 | int logfs_get_sb_mtd(struct logfs_super *s, int mtdnr) |
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c index b6404898da83..3de7a32cadbe 100644 --- a/fs/logfs/dir.c +++ b/fs/logfs/dir.c | |||
@@ -482,7 +482,7 @@ out: | |||
482 | return ret; | 482 | return ret; |
483 | } | 483 | } |
484 | 484 | ||
485 | static int logfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | 485 | static int logfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
486 | { | 486 | { |
487 | struct inode *inode; | 487 | struct inode *inode; |
488 | 488 | ||
@@ -501,7 +501,7 @@ static int logfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
501 | return __logfs_create(dir, dentry, inode, NULL, 0); | 501 | return __logfs_create(dir, dentry, inode, NULL, 0); |
502 | } | 502 | } |
503 | 503 | ||
504 | static int logfs_create(struct inode *dir, struct dentry *dentry, int mode, | 504 | static int logfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
505 | struct nameidata *nd) | 505 | struct nameidata *nd) |
506 | { | 506 | { |
507 | struct inode *inode; | 507 | struct inode *inode; |
@@ -517,7 +517,7 @@ static int logfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
517 | return __logfs_create(dir, dentry, inode, NULL, 0); | 517 | return __logfs_create(dir, dentry, inode, NULL, 0); |
518 | } | 518 | } |
519 | 519 | ||
520 | static int logfs_mknod(struct inode *dir, struct dentry *dentry, int mode, | 520 | static int logfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, |
521 | dev_t rdev) | 521 | dev_t rdev) |
522 | { | 522 | { |
523 | struct inode *inode; | 523 | struct inode *inode; |
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index 7c42c132c177..a422f42238b2 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
@@ -144,7 +144,6 @@ struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *is_cached) | |||
144 | static void logfs_i_callback(struct rcu_head *head) | 144 | static void logfs_i_callback(struct rcu_head *head) |
145 | { | 145 | { |
146 | struct inode *inode = container_of(head, struct inode, i_rcu); | 146 | struct inode *inode = container_of(head, struct inode, i_rcu); |
147 | INIT_LIST_HEAD(&inode->i_dentry); | ||
148 | kmem_cache_free(logfs_inode_cache, logfs_inode(inode)); | 147 | kmem_cache_free(logfs_inode_cache, logfs_inode(inode)); |
149 | } | 148 | } |
150 | 149 | ||
@@ -324,7 +323,7 @@ static void logfs_set_ino_generation(struct super_block *sb, | |||
324 | mutex_unlock(&super->s_journal_mutex); | 323 | mutex_unlock(&super->s_journal_mutex); |
325 | } | 324 | } |
326 | 325 | ||
327 | struct inode *logfs_new_inode(struct inode *dir, int mode) | 326 | struct inode *logfs_new_inode(struct inode *dir, umode_t mode) |
328 | { | 327 | { |
329 | struct super_block *sb = dir->i_sb; | 328 | struct super_block *sb = dir->i_sb; |
330 | struct inode *inode; | 329 | struct inode *inode; |
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index 59ed32cd62d1..5f0937609465 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h | |||
@@ -520,7 +520,7 @@ extern const struct super_operations logfs_super_operations; | |||
520 | struct inode *logfs_iget(struct super_block *sb, ino_t ino); | 520 | struct inode *logfs_iget(struct super_block *sb, ino_t ino); |
521 | struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *cookie); | 521 | struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *cookie); |
522 | void logfs_safe_iput(struct inode *inode, int cookie); | 522 | void logfs_safe_iput(struct inode *inode, int cookie); |
523 | struct inode *logfs_new_inode(struct inode *dir, int mode); | 523 | struct inode *logfs_new_inode(struct inode *dir, umode_t mode); |
524 | struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino); | 524 | struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino); |
525 | struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino); | 525 | struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino); |
526 | int logfs_init_inode_cache(void); | 526 | int logfs_init_inode_cache(void); |