aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/dir.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /fs/jffs2/dir.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'fs/jffs2/dir.c')
-rw-r--r--fs/jffs2/dir.c75
1 files changed, 34 insertions, 41 deletions
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index ad7774d3209..9659b7c0046 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -10,8 +10,6 @@
10 * 10 *
11 */ 11 */
12 12
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
15#include <linux/kernel.h> 13#include <linux/kernel.h>
16#include <linux/slab.h> 14#include <linux/slab.h>
17#include <linux/fs.h> 15#include <linux/fs.h>
@@ -24,16 +22,16 @@
24 22
25static int jffs2_readdir (struct file *, void *, filldir_t); 23static int jffs2_readdir (struct file *, void *, filldir_t);
26 24
27static int jffs2_create (struct inode *,struct dentry *,umode_t, 25static int jffs2_create (struct inode *,struct dentry *,int,
28 bool); 26 struct nameidata *);
29static struct dentry *jffs2_lookup (struct inode *,struct dentry *, 27static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
30 unsigned int); 28 struct nameidata *);
31static int jffs2_link (struct dentry *,struct inode *,struct dentry *); 29static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
32static int jffs2_unlink (struct inode *,struct dentry *); 30static int jffs2_unlink (struct inode *,struct dentry *);
33static int jffs2_symlink (struct inode *,struct dentry *,const char *); 31static int jffs2_symlink (struct inode *,struct dentry *,const char *);
34static int jffs2_mkdir (struct inode *,struct dentry *,umode_t); 32static int jffs2_mkdir (struct inode *,struct dentry *,int);
35static int jffs2_rmdir (struct inode *,struct dentry *); 33static int jffs2_rmdir (struct inode *,struct dentry *);
36static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t); 34static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
37static int jffs2_rename (struct inode *, struct dentry *, 35static int jffs2_rename (struct inode *, struct dentry *,
38 struct inode *, struct dentry *); 36 struct inode *, struct dentry *);
39 37
@@ -74,14 +72,14 @@ const struct inode_operations jffs2_dir_inode_operations =
74 nice and simple 72 nice and simple
75*/ 73*/
76static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target, 74static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
77 unsigned int flags) 75 struct nameidata *nd)
78{ 76{
79 struct jffs2_inode_info *dir_f; 77 struct jffs2_inode_info *dir_f;
80 struct jffs2_full_dirent *fd = NULL, *fd_list; 78 struct jffs2_full_dirent *fd = NULL, *fd_list;
81 uint32_t ino = 0; 79 uint32_t ino = 0;
82 struct inode *inode = NULL; 80 struct inode *inode = NULL;
83 81
84 jffs2_dbg(1, "jffs2_lookup()\n"); 82 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
85 83
86 if (target->d_name.len > JFFS2_MAX_NAME_LEN) 84 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
87 return ERR_PTR(-ENAMETOOLONG); 85 return ERR_PTR(-ENAMETOOLONG);
@@ -105,7 +103,7 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
105 if (ino) { 103 if (ino) {
106 inode = jffs2_iget(dir_i->i_sb, ino); 104 inode = jffs2_iget(dir_i->i_sb, ino);
107 if (IS_ERR(inode)) 105 if (IS_ERR(inode))
108 pr_warn("iget() failed for ino #%u\n", ino); 106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
109 } 107 }
110 108
111 return d_splice_alias(inode, target); 109 return d_splice_alias(inode, target);
@@ -121,22 +119,21 @@ static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
121 struct jffs2_full_dirent *fd; 119 struct jffs2_full_dirent *fd;
122 unsigned long offset, curofs; 120 unsigned long offset, curofs;
123 121
124 jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", 122 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
125 filp->f_path.dentry->d_inode->i_ino);
126 123
127 f = JFFS2_INODE_INFO(inode); 124 f = JFFS2_INODE_INFO(inode);
128 125
129 offset = filp->f_pos; 126 offset = filp->f_pos;
130 127
131 if (offset == 0) { 128 if (offset == 0) {
132 jffs2_dbg(1, "Dirent 0: \".\", ino #%lu\n", inode->i_ino); 129 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
133 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0) 130 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
134 goto out; 131 goto out;
135 offset++; 132 offset++;
136 } 133 }
137 if (offset == 1) { 134 if (offset == 1) {
138 unsigned long pino = parent_ino(filp->f_path.dentry); 135 unsigned long pino = parent_ino(filp->f_path.dentry);
139 jffs2_dbg(1, "Dirent 1: \"..\", ino #%lu\n", pino); 136 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
140 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0) 137 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
141 goto out; 138 goto out;
142 offset++; 139 offset++;
@@ -149,18 +146,16 @@ static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
149 curofs++; 146 curofs++;
150 /* First loop: curofs = 2; offset = 2 */ 147 /* First loop: curofs = 2; offset = 2 */
151 if (curofs < offset) { 148 if (curofs < offset) {
152 jffs2_dbg(2, "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n", 149 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
153 fd->name, fd->ino, fd->type, curofs, offset); 150 fd->name, fd->ino, fd->type, curofs, offset));
154 continue; 151 continue;
155 } 152 }
156 if (!fd->ino) { 153 if (!fd->ino) {
157 jffs2_dbg(2, "Skipping deletion dirent \"%s\"\n", 154 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
158 fd->name);
159 offset++; 155 offset++;
160 continue; 156 continue;
161 } 157 }
162 jffs2_dbg(2, "Dirent %ld: \"%s\", ino #%u, type %d\n", 158 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
163 offset, fd->name, fd->ino, fd->type);
164 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0) 159 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
165 break; 160 break;
166 offset++; 161 offset++;
@@ -174,8 +169,8 @@ static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
174/***********************************************************************/ 169/***********************************************************************/
175 170
176 171
177static int jffs2_create(struct inode *dir_i, struct dentry *dentry, 172static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
178 umode_t mode, bool excl) 173 struct nameidata *nd)
179{ 174{
180 struct jffs2_raw_inode *ri; 175 struct jffs2_raw_inode *ri;
181 struct jffs2_inode_info *f, *dir_f; 176 struct jffs2_inode_info *f, *dir_f;
@@ -189,12 +184,12 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
189 184
190 c = JFFS2_SB_INFO(dir_i->i_sb); 185 c = JFFS2_SB_INFO(dir_i->i_sb);
191 186
192 jffs2_dbg(1, "%s()\n", __func__); 187 D1(printk(KERN_DEBUG "jffs2_create()\n"));
193 188
194 inode = jffs2_new_inode(dir_i, mode, ri); 189 inode = jffs2_new_inode(dir_i, mode, ri);
195 190
196 if (IS_ERR(inode)) { 191 if (IS_ERR(inode)) {
197 jffs2_dbg(1, "jffs2_new_inode() failed\n"); 192 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
198 jffs2_free_raw_inode(ri); 193 jffs2_free_raw_inode(ri);
199 return PTR_ERR(inode); 194 return PTR_ERR(inode);
200 } 195 }
@@ -222,12 +217,12 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
222 217
223 jffs2_free_raw_inode(ri); 218 jffs2_free_raw_inode(ri);
224 219
225 jffs2_dbg(1, "%s(): Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n", 220 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
226 __func__, inode->i_ino, inode->i_mode, inode->i_nlink, 221 inode->i_ino, inode->i_mode, inode->i_nlink,
227 f->inocache->pino_nlink, inode->i_mapping->nrpages); 222 f->inocache->pino_nlink, inode->i_mapping->nrpages));
228 223
229 unlock_new_inode(inode);
230 d_instantiate(dentry, inode); 224 d_instantiate(dentry, inode);
225 unlock_new_inode(inode);
231 return 0; 226 return 0;
232 227
233 fail: 228 fail:
@@ -250,7 +245,7 @@ static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
250 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name, 245 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
251 dentry->d_name.len, dead_f, now); 246 dentry->d_name.len, dead_f, now);
252 if (dead_f->inocache) 247 if (dead_f->inocache)
253 set_nlink(dentry->d_inode, dead_f->inocache->pino_nlink); 248 dentry->d_inode->i_nlink = dead_f->inocache->pino_nlink;
254 if (!ret) 249 if (!ret)
255 dir_i->i_mtime = dir_i->i_ctime = ITIME(now); 250 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
256 return ret; 251 return ret;
@@ -283,7 +278,7 @@ static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct de
283 278
284 if (!ret) { 279 if (!ret) {
285 mutex_lock(&f->sem); 280 mutex_lock(&f->sem);
286 set_nlink(old_dentry->d_inode, ++f->inocache->pino_nlink); 281 old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
287 mutex_unlock(&f->sem); 282 mutex_unlock(&f->sem);
288 d_instantiate(dentry, old_dentry->d_inode); 283 d_instantiate(dentry, old_dentry->d_inode);
289 dir_i->i_mtime = dir_i->i_ctime = ITIME(now); 284 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
@@ -367,15 +362,14 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
367 /* We use f->target field to store the target path. */ 362 /* We use f->target field to store the target path. */
368 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL); 363 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
369 if (!f->target) { 364 if (!f->target) {
370 pr_warn("Can't allocate %d bytes of memory\n", targetlen + 1); 365 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
371 mutex_unlock(&f->sem); 366 mutex_unlock(&f->sem);
372 jffs2_complete_reservation(c); 367 jffs2_complete_reservation(c);
373 ret = -ENOMEM; 368 ret = -ENOMEM;
374 goto fail; 369 goto fail;
375 } 370 }
376 371
377 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n", 372 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
378 __func__, (char *)f->target);
379 373
380 /* No data here. Only a metadata node, which will be 374 /* No data here. Only a metadata node, which will be
381 obsoleted by the first data write 375 obsoleted by the first data write
@@ -446,8 +440,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
446 mutex_unlock(&dir_f->sem); 440 mutex_unlock(&dir_f->sem);
447 jffs2_complete_reservation(c); 441 jffs2_complete_reservation(c);
448 442
449 unlock_new_inode(inode);
450 d_instantiate(dentry, inode); 443 d_instantiate(dentry, inode);
444 unlock_new_inode(inode);
451 return 0; 445 return 0;
452 446
453 fail: 447 fail:
@@ -456,7 +450,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
456} 450}
457 451
458 452
459static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode) 453static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
460{ 454{
461 struct jffs2_inode_info *f, *dir_f; 455 struct jffs2_inode_info *f, *dir_f;
462 struct jffs2_sb_info *c; 456 struct jffs2_sb_info *c;
@@ -503,7 +497,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode
503 f = JFFS2_INODE_INFO(inode); 497 f = JFFS2_INODE_INFO(inode);
504 498
505 /* Directories get nlink 2 at start */ 499 /* Directories get nlink 2 at start */
506 set_nlink(inode, 2); 500 inode->i_nlink = 2;
507 /* but ic->pino_nlink is the parent ino# */ 501 /* but ic->pino_nlink is the parent ino# */
508 f->inocache->pino_nlink = dir_i->i_ino; 502 f->inocache->pino_nlink = dir_i->i_ino;
509 503
@@ -591,8 +585,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode
591 mutex_unlock(&dir_f->sem); 585 mutex_unlock(&dir_f->sem);
592 jffs2_complete_reservation(c); 586 jffs2_complete_reservation(c);
593 587
594 unlock_new_inode(inode);
595 d_instantiate(dentry, inode); 588 d_instantiate(dentry, inode);
589 unlock_new_inode(inode);
596 return 0; 590 return 0;
597 591
598 fail: 592 fail:
@@ -624,7 +618,7 @@ static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
624 return ret; 618 return ret;
625} 619}
626 620
627static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev) 621static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
628{ 622{
629 struct jffs2_inode_info *f, *dir_f; 623 struct jffs2_inode_info *f, *dir_f;
630 struct jffs2_sb_info *c; 624 struct jffs2_sb_info *c;
@@ -766,8 +760,8 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode
766 mutex_unlock(&dir_f->sem); 760 mutex_unlock(&dir_f->sem);
767 jffs2_complete_reservation(c); 761 jffs2_complete_reservation(c);
768 762
769 unlock_new_inode(inode);
770 d_instantiate(dentry, inode); 763 d_instantiate(dentry, inode);
764 unlock_new_inode(inode);
771 return 0; 765 return 0;
772 766
773 fail: 767 fail:
@@ -862,8 +856,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
862 f->inocache->pino_nlink++; 856 f->inocache->pino_nlink++;
863 mutex_unlock(&f->sem); 857 mutex_unlock(&f->sem);
864 858
865 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n", 859 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
866 __func__, ret);
867 /* Might as well let the VFS know */ 860 /* Might as well let the VFS know */
868 d_instantiate(new_dentry, old_dentry->d_inode); 861 d_instantiate(new_dentry, old_dentry->d_inode);
869 ihold(old_dentry->d_inode); 862 ihold(old_dentry->d_inode);