diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /fs/jffs2/dir.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'fs/jffs2/dir.c')
-rw-r--r-- | fs/jffs2/dir.c | 75 |
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 | ||
25 | static int jffs2_readdir (struct file *, void *, filldir_t); | 23 | static int jffs2_readdir (struct file *, void *, filldir_t); |
26 | 24 | ||
27 | static int jffs2_create (struct inode *,struct dentry *,umode_t, | 25 | static int jffs2_create (struct inode *,struct dentry *,int, |
28 | bool); | 26 | struct nameidata *); |
29 | static struct dentry *jffs2_lookup (struct inode *,struct dentry *, | 27 | static struct dentry *jffs2_lookup (struct inode *,struct dentry *, |
30 | unsigned int); | 28 | struct nameidata *); |
31 | static int jffs2_link (struct dentry *,struct inode *,struct dentry *); | 29 | static int jffs2_link (struct dentry *,struct inode *,struct dentry *); |
32 | static int jffs2_unlink (struct inode *,struct dentry *); | 30 | static int jffs2_unlink (struct inode *,struct dentry *); |
33 | static int jffs2_symlink (struct inode *,struct dentry *,const char *); | 31 | static int jffs2_symlink (struct inode *,struct dentry *,const char *); |
34 | static int jffs2_mkdir (struct inode *,struct dentry *,umode_t); | 32 | static int jffs2_mkdir (struct inode *,struct dentry *,int); |
35 | static int jffs2_rmdir (struct inode *,struct dentry *); | 33 | static int jffs2_rmdir (struct inode *,struct dentry *); |
36 | static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t); | 34 | static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t); |
37 | static int jffs2_rename (struct inode *, struct dentry *, | 35 | static 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 | */ |
76 | static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target, | 74 | static 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 | ||
177 | static int jffs2_create(struct inode *dir_i, struct dentry *dentry, | 172 | static 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 | ||
459 | static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode) | 453 | static 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 | ||
627 | static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev) | 621 | static 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); |