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