switch ->mknod() to umode_t
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / jffs2 / dir.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
c00c310e 4 * Copyright © 2001-2007 Red Hat, Inc.
6088c058 5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
1da177e4
LT
6 *
7 * Created by David Woodhouse <dwmw2@infradead.org>
8 *
9 * For licensing information, see the file 'LICENCE' in this directory.
10 *
1da177e4
LT
11 */
12
13#include <linux/kernel.h>
14#include <linux/slab.h>
1da177e4
LT
15#include <linux/fs.h>
16#include <linux/crc32.h>
17#include <linux/jffs2.h>
cbb9a561
DW
18#include "jffs2_fs_i.h"
19#include "jffs2_fs_sb.h"
1da177e4
LT
20#include <linux/time.h>
21#include "nodelist.h"
22
1da177e4
LT
23static int jffs2_readdir (struct file *, void *, filldir_t);
24
4acdaf27 25static int jffs2_create (struct inode *,struct dentry *,umode_t,
1da177e4
LT
26 struct nameidata *);
27static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
28 struct nameidata *);
29static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
30static int jffs2_unlink (struct inode *,struct dentry *);
31static int jffs2_symlink (struct inode *,struct dentry *,const char *);
18bb1db3 32static int jffs2_mkdir (struct inode *,struct dentry *,umode_t);
1da177e4 33static int jffs2_rmdir (struct inode *,struct dentry *);
1a67aafb 34static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
1da177e4 35static int jffs2_rename (struct inode *, struct dentry *,
ef53cb02 36 struct inode *, struct dentry *);
1da177e4 37
4b6f5d20 38const struct file_operations jffs2_dir_operations =
1da177e4
LT
39{
40 .read = generic_read_dir,
41 .readdir = jffs2_readdir,
0533400b 42 .unlocked_ioctl=jffs2_ioctl,
3222a3e5
CH
43 .fsync = jffs2_fsync,
44 .llseek = generic_file_llseek,
1da177e4
LT
45};
46
47
92e1d5be 48const struct inode_operations jffs2_dir_inode_operations =
1da177e4 49{
265489f0
DW
50 .create = jffs2_create,
51 .lookup = jffs2_lookup,
1da177e4
LT
52 .link = jffs2_link,
53 .unlink = jffs2_unlink,
54 .symlink = jffs2_symlink,
55 .mkdir = jffs2_mkdir,
56 .rmdir = jffs2_rmdir,
57 .mknod = jffs2_mknod,
58 .rename = jffs2_rename,
4e34e719 59 .get_acl = jffs2_get_acl,
1da177e4 60 .setattr = jffs2_setattr,
aa98d7cf
KK
61 .setxattr = jffs2_setxattr,
62 .getxattr = jffs2_getxattr,
63 .listxattr = jffs2_listxattr,
64 .removexattr = jffs2_removexattr
1da177e4
LT
65};
66
67/***********************************************************************/
68
69
70/* We keep the dirent list sorted in increasing order of name hash,
182ec4ee 71 and we use the same hash function as the dentries. Makes this
1da177e4
LT
72 nice and simple
73*/
74static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
75 struct nameidata *nd)
76{
77 struct jffs2_inode_info *dir_f;
1da177e4
LT
78 struct jffs2_full_dirent *fd = NULL, *fd_list;
79 uint32_t ino = 0;
80 struct inode *inode = NULL;
81
82 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
83
373d5e71
RP
84 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
85 return ERR_PTR(-ENAMETOOLONG);
86
1da177e4 87 dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4 88
ced22070 89 mutex_lock(&dir_f->sem);
1da177e4
LT
90
91 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
92 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
182ec4ee 93 if (fd_list->nhash == target->d_name.hash &&
1da177e4
LT
94 (!fd || fd_list->version > fd->version) &&
95 strlen(fd_list->name) == target->d_name.len &&
96 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
97 fd = fd_list;
98 }
99 }
100 if (fd)
101 ino = fd->ino;
ced22070 102 mutex_unlock(&dir_f->sem);
1da177e4 103 if (ino) {
5451f79f 104 inode = jffs2_iget(dir_i->i_sb, ino);
a9049376 105 if (IS_ERR(inode))
1da177e4 106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
1da177e4
LT
107 }
108
8966c5e0 109 return d_splice_alias(inode, target);
1da177e4
LT
110}
111
112/***********************************************************************/
113
114
115static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
116{
117 struct jffs2_inode_info *f;
ec2e203c 118 struct inode *inode = filp->f_path.dentry->d_inode;
1da177e4
LT
119 struct jffs2_full_dirent *fd;
120 unsigned long offset, curofs;
121
ec2e203c 122 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
1da177e4
LT
123
124 f = JFFS2_INODE_INFO(inode);
1da177e4
LT
125
126 offset = filp->f_pos;
127
128 if (offset == 0) {
129 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
130 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
131 goto out;
132 offset++;
133 }
134 if (offset == 1) {
ec2e203c 135 unsigned long pino = parent_ino(filp->f_path.dentry);
1da177e4
LT
136 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
137 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
138 goto out;
139 offset++;
140 }
141
142 curofs=1;
ced22070 143 mutex_lock(&f->sem);
1da177e4
LT
144 for (fd = f->dents; fd; fd = fd->next) {
145
146 curofs++;
147 /* First loop: curofs = 2; offset = 2 */
148 if (curofs < offset) {
182ec4ee 149 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
1da177e4
LT
150 fd->name, fd->ino, fd->type, curofs, offset));
151 continue;
152 }
153 if (!fd->ino) {
154 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
155 offset++;
156 continue;
157 }
158 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
159 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
160 break;
161 offset++;
162 }
ced22070 163 mutex_unlock(&f->sem);
1da177e4
LT
164 out:
165 filp->f_pos = offset;
166 return 0;
167}
168
169/***********************************************************************/
170
171
4acdaf27
AV
172static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
173 umode_t mode, struct nameidata *nd)
1da177e4
LT
174{
175 struct jffs2_raw_inode *ri;
176 struct jffs2_inode_info *f, *dir_f;
177 struct jffs2_sb_info *c;
178 struct inode *inode;
179 int ret;
180
181 ri = jffs2_alloc_raw_inode();
182 if (!ri)
183 return -ENOMEM;
182ec4ee 184
1da177e4
LT
185 c = JFFS2_SB_INFO(dir_i->i_sb);
186
187 D1(printk(KERN_DEBUG "jffs2_create()\n"));
188
cfc8dc6f 189 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
190
191 if (IS_ERR(inode)) {
192 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
193 jffs2_free_raw_inode(ri);
194 return PTR_ERR(inode);
195 }
196
197 inode->i_op = &jffs2_file_inode_operations;
198 inode->i_fop = &jffs2_file_operations;
199 inode->i_mapping->a_ops = &jffs2_file_address_operations;
200 inode->i_mapping->nrpages = 0;
201
202 f = JFFS2_INODE_INFO(inode);
203 dir_f = JFFS2_INODE_INFO(dir_i);
204
590fe34c
DW
205 /* jffs2_do_create() will want to lock it, _after_ reserving
206 space and taking c-alloc_sem. If we keep it locked here,
207 lockdep gets unhappy (although it's a false positive;
208 nothing else will be looking at this inode yet so there's
209 no chance of AB-BA deadlock involving its f->sem). */
210 mutex_unlock(&f->sem);
211
2a7dba39 212 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
aa98d7cf
KK
213 if (ret)
214 goto fail;
1da177e4
LT
215
216 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
217
218 jffs2_free_raw_inode(ri);
1da177e4
LT
219
220 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
27c72b04
DW
221 inode->i_ino, inode->i_mode, inode->i_nlink,
222 f->inocache->pino_nlink, inode->i_mapping->nrpages));
e72e6497
DW
223
224 d_instantiate(dentry, inode);
225 unlock_new_inode(inode);
1da177e4 226 return 0;
aa98d7cf
KK
227
228 fail:
41cce647 229 iget_failed(inode);
aa98d7cf
KK
230 jffs2_free_raw_inode(ri);
231 return ret;
1da177e4
LT
232}
233
234/***********************************************************************/
235
236
237static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
238{
239 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
240 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
241 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
242 int ret;
3a69e0cd 243 uint32_t now = get_seconds();
1da177e4 244
182ec4ee 245 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 246 dentry->d_name.len, dead_f, now);
1da177e4 247 if (dead_f->inocache)
bfe86848 248 set_nlink(dentry->d_inode, dead_f->inocache->pino_nlink);
3a69e0cd
AB
249 if (!ret)
250 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
251 return ret;
252}
253/***********************************************************************/
254
255
256static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
257{
258 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
259 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
260 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
261 int ret;
262 uint8_t type;
3a69e0cd 263 uint32_t now;
1da177e4
LT
264
265 /* Don't let people make hard links to bad inodes. */
266 if (!f->inocache)
267 return -EIO;
268
269 if (S_ISDIR(old_dentry->d_inode->i_mode))
270 return -EPERM;
271
272 /* XXX: This is ugly */
273 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
274 if (!type) type = DT_REG;
275
3a69e0cd
AB
276 now = get_seconds();
277 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
278
279 if (!ret) {
ced22070 280 mutex_lock(&f->sem);
bfe86848 281 set_nlink(old_dentry->d_inode, ++f->inocache->pino_nlink);
ced22070 282 mutex_unlock(&f->sem);
1da177e4 283 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 284 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
7de9c6ee 285 ihold(old_dentry->d_inode);
1da177e4
LT
286 }
287 return ret;
288}
289
290/***********************************************************************/
291
292static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
293{
294 struct jffs2_inode_info *f, *dir_f;
295 struct jffs2_sb_info *c;
296 struct inode *inode;
297 struct jffs2_raw_inode *ri;
298 struct jffs2_raw_dirent *rd;
299 struct jffs2_full_dnode *fn;
300 struct jffs2_full_dirent *fd;
301 int namelen;
9fe4854c 302 uint32_t alloclen;
32f1a95d 303 int ret, targetlen = strlen(target);
1da177e4
LT
304
305 /* FIXME: If you care. We'd need to use frags for the target
306 if it grows much more than this */
32f1a95d 307 if (targetlen > 254)
bde86fec 308 return -ENAMETOOLONG;
1da177e4
LT
309
310 ri = jffs2_alloc_raw_inode();
311
312 if (!ri)
313 return -ENOMEM;
182ec4ee 314
1da177e4 315 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
316
317 /* Try to reserve enough space for both node and dirent.
318 * Just the node will do for now, though
1da177e4
LT
319 */
320 namelen = dentry->d_name.len;
9fe4854c
DW
321 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
322 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
323
324 if (ret) {
325 jffs2_free_raw_inode(ri);
326 return ret;
327 }
328
cfc8dc6f 329 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
1da177e4
LT
330
331 if (IS_ERR(inode)) {
332 jffs2_free_raw_inode(ri);
333 jffs2_complete_reservation(c);
334 return PTR_ERR(inode);
335 }
336
337 inode->i_op = &jffs2_symlink_inode_operations;
338
339 f = JFFS2_INODE_INFO(inode);
340
32f1a95d 341 inode->i_size = targetlen;
1da177e4
LT
342 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
343 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
344 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
345
346 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 347 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 348 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 349
9fe4854c 350 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
351
352 jffs2_free_raw_inode(ri);
353
354 if (IS_ERR(fn)) {
355 /* Eeek. Wave bye bye */
ced22070 356 mutex_unlock(&f->sem);
1da177e4 357 jffs2_complete_reservation(c);
f324e4cb
DW
358 ret = PTR_ERR(fn);
359 goto fail;
1da177e4 360 }
32f1a95d 361
2b79adcc 362 /* We use f->target field to store the target path. */
04aadf36 363 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
2b79adcc 364 if (!f->target) {
32f1a95d 365 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
ced22070 366 mutex_unlock(&f->sem);
32f1a95d 367 jffs2_complete_reservation(c);
f324e4cb
DW
368 ret = -ENOMEM;
369 goto fail;
32f1a95d
AB
370 }
371
2b79adcc 372 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 373
182ec4ee 374 /* No data here. Only a metadata node, which will be
1da177e4
LT
375 obsoleted by the first data write
376 */
377 f->metadata = fn;
ced22070 378 mutex_unlock(&f->sem);
1da177e4
LT
379
380 jffs2_complete_reservation(c);
aa98d7cf 381
2a7dba39 382 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
383 if (ret)
384 goto fail;
385
cfc8dc6f 386 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
387 if (ret)
388 goto fail;
aa98d7cf 389
9fe4854c
DW
390 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
391 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
392 if (ret)
393 goto fail;
1da177e4
LT
394
395 rd = jffs2_alloc_raw_dirent();
396 if (!rd) {
397 /* Argh. Now we treat it like a normal delete */
398 jffs2_complete_reservation(c);
f324e4cb
DW
399 ret = -ENOMEM;
400 goto fail;
1da177e4
LT
401 }
402
403 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 404 mutex_lock(&dir_f->sem);
1da177e4
LT
405
406 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
407 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
408 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
409 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
410
411 rd->pino = cpu_to_je32(dir_i->i_ino);
412 rd->version = cpu_to_je32(++dir_f->highest_version);
413 rd->ino = cpu_to_je32(inode->i_ino);
414 rd->mctime = cpu_to_je32(get_seconds());
415 rd->nsize = namelen;
416 rd->type = DT_LNK;
417 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
418 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
419
9fe4854c 420 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
421
422 if (IS_ERR(fd)) {
182ec4ee 423 /* dirent failed to write. Delete the inode normally
1da177e4
LT
424 as if it were the final unlink() */
425 jffs2_complete_reservation(c);
426 jffs2_free_raw_dirent(rd);
ced22070 427 mutex_unlock(&dir_f->sem);
f324e4cb
DW
428 ret = PTR_ERR(fd);
429 goto fail;
1da177e4
LT
430 }
431
432 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
433
434 jffs2_free_raw_dirent(rd);
435
436 /* Link the fd into the inode's list, obsoleting an old
437 one if necessary. */
438 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
439
ced22070 440 mutex_unlock(&dir_f->sem);
1da177e4
LT
441 jffs2_complete_reservation(c);
442
443 d_instantiate(dentry, inode);
e72e6497 444 unlock_new_inode(inode);
1da177e4 445 return 0;
f324e4cb
DW
446
447 fail:
41cce647 448 iget_failed(inode);
f324e4cb 449 return ret;
1da177e4
LT
450}
451
452
18bb1db3 453static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode)
1da177e4
LT
454{
455 struct jffs2_inode_info *f, *dir_f;
456 struct jffs2_sb_info *c;
457 struct inode *inode;
458 struct jffs2_raw_inode *ri;
459 struct jffs2_raw_dirent *rd;
460 struct jffs2_full_dnode *fn;
461 struct jffs2_full_dirent *fd;
462 int namelen;
9fe4854c 463 uint32_t alloclen;
1da177e4
LT
464 int ret;
465
466 mode |= S_IFDIR;
467
468 ri = jffs2_alloc_raw_inode();
469 if (!ri)
470 return -ENOMEM;
182ec4ee 471
1da177e4
LT
472 c = JFFS2_SB_INFO(dir_i->i_sb);
473
182ec4ee
TG
474 /* Try to reserve enough space for both node and dirent.
475 * Just the node will do for now, though
1da177e4
LT
476 */
477 namelen = dentry->d_name.len;
9fe4854c
DW
478 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
479 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
480
481 if (ret) {
482 jffs2_free_raw_inode(ri);
483 return ret;
484 }
485
cfc8dc6f 486 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
487
488 if (IS_ERR(inode)) {
489 jffs2_free_raw_inode(ri);
490 jffs2_complete_reservation(c);
491 return PTR_ERR(inode);
492 }
493
494 inode->i_op = &jffs2_dir_inode_operations;
495 inode->i_fop = &jffs2_dir_operations;
1da177e4
LT
496
497 f = JFFS2_INODE_INFO(inode);
498
27c72b04 499 /* Directories get nlink 2 at start */
bfe86848 500 set_nlink(inode, 2);
27c72b04
DW
501 /* but ic->pino_nlink is the parent ino# */
502 f->inocache->pino_nlink = dir_i->i_ino;
503
1da177e4
LT
504 ri->data_crc = cpu_to_je32(0);
505 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 506
9fe4854c 507 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
508
509 jffs2_free_raw_inode(ri);
510
511 if (IS_ERR(fn)) {
512 /* Eeek. Wave bye bye */
ced22070 513 mutex_unlock(&f->sem);
1da177e4 514 jffs2_complete_reservation(c);
f324e4cb
DW
515 ret = PTR_ERR(fn);
516 goto fail;
1da177e4 517 }
182ec4ee 518 /* No data here. Only a metadata node, which will be
1da177e4
LT
519 obsoleted by the first data write
520 */
521 f->metadata = fn;
ced22070 522 mutex_unlock(&f->sem);
1da177e4
LT
523
524 jffs2_complete_reservation(c);
aa98d7cf 525
2a7dba39 526 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
527 if (ret)
528 goto fail;
529
cfc8dc6f 530 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
531 if (ret)
532 goto fail;
aa98d7cf 533
9fe4854c
DW
534 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
535 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
536 if (ret)
537 goto fail;
182ec4ee 538
1da177e4
LT
539 rd = jffs2_alloc_raw_dirent();
540 if (!rd) {
541 /* Argh. Now we treat it like a normal delete */
542 jffs2_complete_reservation(c);
f324e4cb
DW
543 ret = -ENOMEM;
544 goto fail;
1da177e4
LT
545 }
546
547 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 548 mutex_lock(&dir_f->sem);
1da177e4
LT
549
550 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
551 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
552 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
553 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
554
555 rd->pino = cpu_to_je32(dir_i->i_ino);
556 rd->version = cpu_to_je32(++dir_f->highest_version);
557 rd->ino = cpu_to_je32(inode->i_ino);
558 rd->mctime = cpu_to_je32(get_seconds());
559 rd->nsize = namelen;
560 rd->type = DT_DIR;
561 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
562 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
563
9fe4854c 564 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 565
1da177e4 566 if (IS_ERR(fd)) {
182ec4ee 567 /* dirent failed to write. Delete the inode normally
1da177e4
LT
568 as if it were the final unlink() */
569 jffs2_complete_reservation(c);
570 jffs2_free_raw_dirent(rd);
ced22070 571 mutex_unlock(&dir_f->sem);
f324e4cb
DW
572 ret = PTR_ERR(fd);
573 goto fail;
1da177e4
LT
574 }
575
576 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 577 inc_nlink(dir_i);
1da177e4
LT
578
579 jffs2_free_raw_dirent(rd);
580
581 /* Link the fd into the inode's list, obsoleting an old
582 one if necessary. */
583 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
584
ced22070 585 mutex_unlock(&dir_f->sem);
1da177e4
LT
586 jffs2_complete_reservation(c);
587
588 d_instantiate(dentry, inode);
e72e6497 589 unlock_new_inode(inode);
1da177e4 590 return 0;
f324e4cb
DW
591
592 fail:
41cce647 593 iget_failed(inode);
f324e4cb 594 return ret;
1da177e4
LT
595}
596
597static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
598{
27c72b04
DW
599 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
600 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4
LT
601 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
602 struct jffs2_full_dirent *fd;
603 int ret;
27c72b04 604 uint32_t now = get_seconds();
1da177e4
LT
605
606 for (fd = f->dents ; fd; fd = fd->next) {
607 if (fd->ino)
608 return -ENOTEMPTY;
609 }
27c72b04
DW
610
611 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
612 dentry->d_name.len, f, now);
613 if (!ret) {
614 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
615 clear_nlink(dentry->d_inode);
9a53c3a7 616 drop_nlink(dir_i);
27c72b04 617 }
1da177e4
LT
618 return ret;
619}
620
1a67aafb 621static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev)
1da177e4
LT
622{
623 struct jffs2_inode_info *f, *dir_f;
624 struct jffs2_sb_info *c;
625 struct inode *inode;
626 struct jffs2_raw_inode *ri;
627 struct jffs2_raw_dirent *rd;
628 struct jffs2_full_dnode *fn;
629 struct jffs2_full_dirent *fd;
630 int namelen;
aef9ab47 631 union jffs2_device_node dev;
1da177e4 632 int devlen = 0;
9fe4854c 633 uint32_t alloclen;
1da177e4
LT
634 int ret;
635
aef9ab47 636 if (!new_valid_dev(rdev))
1da177e4
LT
637 return -EINVAL;
638
639 ri = jffs2_alloc_raw_inode();
640 if (!ri)
641 return -ENOMEM;
182ec4ee 642
1da177e4 643 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 644
aef9ab47
DW
645 if (S_ISBLK(mode) || S_ISCHR(mode))
646 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
647
648 /* Try to reserve enough space for both node and dirent.
649 * Just the node will do for now, though
1da177e4
LT
650 */
651 namelen = dentry->d_name.len;
9fe4854c 652 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 653 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
654
655 if (ret) {
656 jffs2_free_raw_inode(ri);
657 return ret;
658 }
659
cfc8dc6f 660 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
661
662 if (IS_ERR(inode)) {
663 jffs2_free_raw_inode(ri);
664 jffs2_complete_reservation(c);
665 return PTR_ERR(inode);
666 }
667 inode->i_op = &jffs2_file_inode_operations;
668 init_special_inode(inode, inode->i_mode, rdev);
669
670 f = JFFS2_INODE_INFO(inode);
671
672 ri->dsize = ri->csize = cpu_to_je32(devlen);
673 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
674 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
675
676 ri->compr = JFFS2_COMPR_NONE;
677 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
678 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 679
9fe4854c 680 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
681
682 jffs2_free_raw_inode(ri);
683
684 if (IS_ERR(fn)) {
685 /* Eeek. Wave bye bye */
ced22070 686 mutex_unlock(&f->sem);
1da177e4 687 jffs2_complete_reservation(c);
f324e4cb
DW
688 ret = PTR_ERR(fn);
689 goto fail;
1da177e4 690 }
182ec4ee 691 /* No data here. Only a metadata node, which will be
1da177e4
LT
692 obsoleted by the first data write
693 */
694 f->metadata = fn;
ced22070 695 mutex_unlock(&f->sem);
1da177e4
LT
696
697 jffs2_complete_reservation(c);
aa98d7cf 698
2a7dba39 699 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
f324e4cb
DW
700 if (ret)
701 goto fail;
702
cfc8dc6f 703 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
704 if (ret)
705 goto fail;
aa98d7cf 706
9fe4854c
DW
707 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
708 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
709 if (ret)
710 goto fail;
1da177e4
LT
711
712 rd = jffs2_alloc_raw_dirent();
713 if (!rd) {
714 /* Argh. Now we treat it like a normal delete */
715 jffs2_complete_reservation(c);
f324e4cb
DW
716 ret = -ENOMEM;
717 goto fail;
1da177e4
LT
718 }
719
720 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 721 mutex_lock(&dir_f->sem);
1da177e4
LT
722
723 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
724 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
725 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
726 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
727
728 rd->pino = cpu_to_je32(dir_i->i_ino);
729 rd->version = cpu_to_je32(++dir_f->highest_version);
730 rd->ino = cpu_to_je32(inode->i_ino);
731 rd->mctime = cpu_to_je32(get_seconds());
732 rd->nsize = namelen;
733
734 /* XXX: This is ugly. */
735 rd->type = (mode & S_IFMT) >> 12;
736
737 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
738 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
739
9fe4854c 740 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 741
1da177e4 742 if (IS_ERR(fd)) {
182ec4ee 743 /* dirent failed to write. Delete the inode normally
1da177e4
LT
744 as if it were the final unlink() */
745 jffs2_complete_reservation(c);
746 jffs2_free_raw_dirent(rd);
ced22070 747 mutex_unlock(&dir_f->sem);
f324e4cb
DW
748 ret = PTR_ERR(fd);
749 goto fail;
1da177e4
LT
750 }
751
752 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
753
754 jffs2_free_raw_dirent(rd);
755
756 /* Link the fd into the inode's list, obsoleting an old
757 one if necessary. */
758 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
759
ced22070 760 mutex_unlock(&dir_f->sem);
1da177e4
LT
761 jffs2_complete_reservation(c);
762
763 d_instantiate(dentry, inode);
e72e6497 764 unlock_new_inode(inode);
1da177e4 765 return 0;
f324e4cb
DW
766
767 fail:
41cce647 768 iget_failed(inode);
f324e4cb 769 return ret;
1da177e4
LT
770}
771
772static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 773 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
774{
775 int ret;
776 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
777 struct jffs2_inode_info *victim_f = NULL;
778 uint8_t type;
3a69e0cd 779 uint32_t now;
1da177e4 780
182ec4ee 781 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
782 * file over a directory and vice versa, but if it's a directory,
783 * the VFS can't check whether the victim is empty. The filesystem
784 * needs to do that for itself.
785 */
786 if (new_dentry->d_inode) {
787 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
788 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
789 struct jffs2_full_dirent *fd;
790
ced22070 791 mutex_lock(&victim_f->sem);
1da177e4
LT
792 for (fd = victim_f->dents; fd; fd = fd->next) {
793 if (fd->ino) {
ced22070 794 mutex_unlock(&victim_f->sem);
1da177e4
LT
795 return -ENOTEMPTY;
796 }
797 }
ced22070 798 mutex_unlock(&victim_f->sem);
1da177e4
LT
799 }
800 }
801
802 /* XXX: We probably ought to alloc enough space for
182ec4ee 803 both nodes at the same time. Writing the new link,
1da177e4
LT
804 then getting -ENOSPC, is quite bad :)
805 */
806
807 /* Make a hard link */
182ec4ee 808
1da177e4
LT
809 /* XXX: This is ugly */
810 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
811 if (!type) type = DT_REG;
812
3a69e0cd 813 now = get_seconds();
182ec4ee 814 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 815 old_dentry->d_inode->i_ino, type,
3a69e0cd 816 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
817
818 if (ret)
819 return ret;
820
821 if (victim_f) {
822 /* There was a victim. Kill it off nicely */
22ba747f
AV
823 if (S_ISDIR(new_dentry->d_inode->i_mode))
824 clear_nlink(new_dentry->d_inode);
825 else
826 drop_nlink(new_dentry->d_inode);
1da177e4
LT
827 /* Don't oops if the victim was a dirent pointing to an
828 inode which didn't exist. */
829 if (victim_f->inocache) {
ced22070 830 mutex_lock(&victim_f->sem);
27c72b04
DW
831 if (S_ISDIR(new_dentry->d_inode->i_mode))
832 victim_f->inocache->pino_nlink = 0;
833 else
834 victim_f->inocache->pino_nlink--;
ced22070 835 mutex_unlock(&victim_f->sem);
1da177e4
LT
836 }
837 }
838
182ec4ee 839 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
840 increase i_nlink on its new parent */
841 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 842 inc_nlink(new_dir_i);
1da177e4
LT
843
844 /* Unlink the original */
182ec4ee 845 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 846 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
847
848 /* We don't touch inode->i_nlink */
849
850 if (ret) {
851 /* Oh shit. We really ought to make a single node which can do both atomically */
852 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
ced22070 853 mutex_lock(&f->sem);
d8c76e6f 854 inc_nlink(old_dentry->d_inode);
27c72b04
DW
855 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
856 f->inocache->pino_nlink++;
ced22070 857 mutex_unlock(&f->sem);
1da177e4
LT
858
859 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
860 /* Might as well let the VFS know */
861 d_instantiate(new_dentry, old_dentry->d_inode);
7de9c6ee 862 ihold(old_dentry->d_inode);
3a69e0cd 863 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
864 return ret;
865 }
866
867 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 868 drop_nlink(old_dir_i);
1da177e4 869
3a69e0cd
AB
870 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
871
1da177e4
LT
872 return 0;
873}
874