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