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