aboutsummaryrefslogtreecommitdiffstats
path: root/fs/logfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/logfs')
-rw-r--r--fs/logfs/dev_mtd.c96
-rw-r--r--fs/logfs/dir.c6
-rw-r--r--fs/logfs/inode.c3
-rw-r--r--fs/logfs/logfs.h2
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
16static int mtd_read(struct super_block *sb, loff_t ofs, size_t len, void *buf) 16static 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
34static int mtd_write(struct super_block *sb, loff_t ofs, size_t len, void *buf) 35static 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 */
65static void logfs_erase_callback(struct erase_info *ei) 67static 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
70static int mtd_erase_mapping(struct super_block *sb, loff_t ofs, size_t len) 72static 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
87static int mtd_erase(struct super_block *sb, loff_t ofs, size_t len, 90static 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
115static void mtd_sync(struct super_block *sb) 118static 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
123static int mtd_readpage(void *_sb, struct page *page) 125static 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
146static struct page *mtd_find_first_sb(struct super_block *sb, u64 *ofs) 148static 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
165static struct page *mtd_find_last_sb(struct super_block *sb, u64 *ofs) 168static 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
185static int __mtd_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, 189static 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
207static void mtd_writeseg(struct super_block *sb, u64 ofs, size_t len) 211static 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
231static void mtd_put_device(struct logfs_super *s) 235static 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
236static int mtd_can_write_buf(struct super_block *sb, u64 ofs) 240static 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
255static const struct logfs_device_ops mtd_devops = { 259static 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
266int logfs_get_sb_mtd(struct logfs_super *s, int mtdnr) 270int 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
485static int logfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) 485static 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
504static int logfs_create(struct inode *dir, struct dentry *dentry, int mode, 504static 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
520static int logfs_mknod(struct inode *dir, struct dentry *dentry, int mode, 520static 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)
144static void logfs_i_callback(struct rcu_head *head) 144static 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
327struct inode *logfs_new_inode(struct inode *dir, int mode) 326struct 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;
520struct inode *logfs_iget(struct super_block *sb, ino_t ino); 520struct inode *logfs_iget(struct super_block *sb, ino_t ino);
521struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *cookie); 521struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *cookie);
522void logfs_safe_iput(struct inode *inode, int cookie); 522void logfs_safe_iput(struct inode *inode, int cookie);
523struct inode *logfs_new_inode(struct inode *dir, int mode); 523struct inode *logfs_new_inode(struct inode *dir, umode_t mode);
524struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino); 524struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino);
525struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino); 525struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino);
526int logfs_init_inode_cache(void); 526int logfs_init_inode_cache(void);