1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
5 * Copyright (C) 2000 Stelias Computing, Inc.
6 * Copyright (C) 2000 Red Hat, Inc.
8 * This file is part of InterMezzo, http://www.inter-mezzo.org.
10 * InterMezzo is free software; you can redistribute it and/or
11 * modify it under the terms of version 2 of the GNU General Public
12 * License as published by the Free Software Foundation.
14 * InterMezzo is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with InterMezzo; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 * This file implements kernel downcalls from lento.
27 * Author: Rob Simmonds <simmonds@stelias.com>
28 * Andreas Dilger <adilger@stelias.com>
29 * Copyright (C) 2000 Stelias Computing Inc
30 * Copyright (C) 2000 Red Hat Inc.
32 * Extended attribute support
33 * Copyright (C) 2001 Shirish H. Phatak, Tacit Networks, Inc.
35 * This code is based on code from namei.c in the linux file system;
36 * see copyright notice below.
39 /** namei.c copyright **/
44 * Copyright (C) 1991, 1992 Linus Torvalds
48 * Some corrections by tytso.
51 /* [Feb 1997 T. Schoebel-Theuer] Complete rewrite of the pathname
55 /** end of namei.c copyright **/
58 #include <linux/proc_fs.h>
59 #include <linux/smp_lock.h>
60 #include <linux/quotaops.h>
62 #include <asm/uaccess.h>
63 #include <asm/unaligned.h>
64 #include <asm/semaphore.h>
65 #include <asm/pgtable.h>
67 #include <linux/file.h>
69 #include <linux/blk.h>
71 #include <linux/intermezzo_fs.h>
72 #include <linux/intermezzo_psdev.h>
74 #ifdef CONFIG_FS_EXT_ATTR
75 # include <linux/ext_attr.h>
77 # ifdef CONFIG_FS_POSIX_ACL
78 # include <linux/posix_acl.h>
82 extern struct inode_operations presto_sym_iops;
84 /* Write the last_rcvd values to the last_rcvd file. We don't know what the
85 * UUID or last_ctime values are, so we have to read from the file first
87 * exported for branch_reinter in kml_reint.c*/
88 int presto_write_last_rcvd(struct rec_info *recinfo,
89 struct presto_file_set *fset,
90 struct lento_vfs_context *info)
93 struct izo_rcvd_rec rcvd_rec;
97 memset(&rcvd_rec, 0, sizeof(rcvd_rec));
98 memcpy(rcvd_rec.lr_uuid, info->uuid, sizeof(rcvd_rec.lr_uuid));
99 rcvd_rec.lr_remote_recno = HTON__u64(info->recno);
100 rcvd_rec.lr_remote_offset = HTON__u64(info->kml_offset);
101 rcvd_rec.lr_local_recno = HTON__u64(recinfo->recno);
102 rcvd_rec.lr_local_offset = HTON__u64(recinfo->offset + recinfo->size);
104 rc = izo_rcvd_write(fset, &rcvd_rec);
106 /* izo_rcvd_write returns negative errors and non-negative
108 CERROR("InterMezzo: izo_rcvd_write failed: %d\n", rc);
117 * It's inline, so penalty for filesystems that don't use sticky bit is
120 static inline int check_sticky(struct inode *dir, struct inode *inode)
122 if (!(dir->i_mode & S_ISVTX))
124 if (inode->i_uid == current->fsuid)
126 if (dir->i_uid == current->fsuid)
128 return !capable(CAP_FOWNER);
131 /* from linux/fs/namei.c */
132 static inline int may_delete(struct inode *dir,struct dentry *victim, int isdir)
135 if (!victim->d_inode || victim->d_parent->d_inode != dir)
137 error = permission(dir,MAY_WRITE | MAY_EXEC);
142 if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)||
143 IS_IMMUTABLE(victim->d_inode))
146 if (!S_ISDIR(victim->d_inode->i_mode))
150 } else if (S_ISDIR(victim->d_inode->i_mode))
155 /* from linux/fs/namei.c */
156 static inline int may_create(struct inode *dir, struct dentry *child) {
161 return permission(dir,MAY_WRITE | MAY_EXEC);
165 /* The loop_discard_io() function is available via a kernel patch to the
166 * loop block device. It "works" by accepting writes, but throwing them
167 * away, rather than trying to write them to disk. The old method worked
168 * by setting the underlying device read-only, but that has the problem
169 * that dirty buffers are kept in memory, and ext3 didn't like that at all.
171 #ifdef CONFIG_LOOP_DISCARD
172 #define BLKDEV_FAIL(dev,fail) loop_discard_io(dev,fail)
174 #define BLKDEV_FAIL(dev,fail) set_device_ro(dev, 1)
177 /* If a breakpoint has been set via /proc/sys/intermezzo/intermezzoX/errorval,
178 * that is the same as "value", the underlying device will "fail" now.
180 inline void presto_debug_fail_blkdev(struct presto_file_set *fset,
183 int minor = presto_f2m(fset);
184 int errorval = izo_channels[minor].uc_errorval;
185 kdev_t dev = fset->fset_dentry->d_inode->i_dev;
187 if (errorval && errorval == (long)value && !is_read_only(dev)) {
188 CDEBUG(D_SUPER, "setting device %s read only\n", kdevname(dev));
190 izo_channels[minor].uc_errorval = -dev;
194 #define presto_debug_fail_blkdev(dev,value) do {} while (0)
198 static inline int presto_do_kml(struct lento_vfs_context *info,
199 struct dentry *dentry)
201 if ( ! (info->flags & LENTO_FL_KML) )
203 if ( presto_chk(dentry, PRESTO_DONT_JOURNAL) )
208 static inline int presto_do_rcvd(struct lento_vfs_context *info,
209 struct dentry *dentry)
211 if ( ! (info->flags & LENTO_FL_EXPECT) )
213 if ( presto_chk(dentry, PRESTO_DONT_JOURNAL) )
219 /* XXX fixme: this should not fail, all these dentries are in memory
220 when _we_ call this */
221 int presto_settime(struct presto_file_set *fset,
222 struct dentry *newobj,
223 struct dentry *parent,
224 struct dentry *target,
225 struct lento_vfs_context *ctx,
229 struct dentry *dentry;
231 struct inode_operations *iops;
235 if (ctx->flags & LENTO_FL_IGNORE_TIME ) {
240 iattr.ia_ctime = ctx->updated_time;
241 iattr.ia_mtime = ctx->updated_time;
242 iattr.ia_valid = valid;
245 if (parent && ctx->flags & LENTO_FL_TOUCH_PARENT) {
248 } else if (newobj && ctx->flags & LENTO_FL_TOUCH_NEWOBJ) {
257 inode = dentry->d_inode;
260 if (IS_RDONLY(inode)) {
265 if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
271 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
277 if (iops->setattr != NULL)
278 error = iops->setattr(dentry, &iattr);
281 inode_setattr(dentry->d_inode, &iattr);
288 void izo_get_rollback_data(struct inode *inode, struct izo_rollback_data *rb)
290 rb->rb_mode = (__u32)inode->i_mode;
291 rb->rb_rdev = (__u32)inode->i_rdev;
292 rb->rb_uid = (__u64)inode->i_uid;
293 rb->rb_gid = (__u64)inode->i_gid;
297 int presto_do_close(struct presto_file_set *fset, struct file *file)
302 struct inode *inode = file->f_dentry->d_inode;
303 struct presto_file_data *fdata =
304 (struct presto_file_data *)file->private_data;
307 presto_getversion(&fdata->fd_info.remote_version, inode);
309 rc = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
315 handle = presto_trans_start(fset, file->f_dentry->d_inode,
317 if ( IS_ERR(handle) ) {
318 CERROR("presto_release: no space for transaction\n");
322 if (fdata->fd_info.flags & LENTO_FL_KML)
323 rc = presto_journal_close(&rec, fset, file, file->f_dentry,
325 &fdata->fd_info.remote_version);
327 CERROR("presto_close: cannot journal close\n");
331 if (fdata->fd_info.flags & LENTO_FL_EXPECT)
332 rc = presto_write_last_rcvd(&rec, fset, &fdata->fd_info);
335 CERROR("presto_close: cannot journal last_rcvd\n");
338 presto_trans_commit(fset, handle);
340 /* cancel the LML record */
341 handle = presto_trans_start(fset, inode, KML_OPCODE_WRITE);
342 if ( IS_ERR(handle) ) {
343 CERROR("presto_release: no space for clear\n");
347 rc = presto_clear_lml_close(fset, fdata->fd_lml_offset);
349 CERROR("presto_close: cannot journal close\n");
352 presto_truncate_lml(fset);
355 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
356 presto_trans_commit(fset, handle);
361 int presto_do_setattr(struct presto_file_set *fset, struct dentry *dentry,
362 struct iattr *iattr, struct lento_vfs_context *info)
365 struct inode *inode = dentry->d_inode;
366 struct inode_operations *iops;
368 struct presto_version old_ver, new_ver;
369 struct izo_rollback_data rb;
371 loff_t old_size=inode->i_size;
375 if (IS_RDONLY(inode)) {
380 if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
385 presto_getversion(&old_ver, dentry->d_inode);
386 izo_get_rollback_data(dentry->d_inode, &rb);
388 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
390 error = presto_reserve_space(fset->fset_cache, 2*PRESTO_REQHIGH);
396 if (iattr->ia_valid & ATTR_SIZE) {
397 if (izo_mark_dentry(dentry, ~PRESTO_DATA, 0, NULL) != 0)
398 CERROR("izo_mark_dentry(inode %ld, ~PRESTO_DATA) "
399 "failed\n", dentry->d_inode->i_ino);
400 handle = presto_trans_start(fset, dentry->d_inode,
403 handle = presto_trans_start(fset, dentry->d_inode,
407 if ( IS_ERR(handle) ) {
408 CERROR("presto_do_setattr: no space for transaction\n");
409 presto_release_space(fset->fset_cache, 2*PRESTO_REQHIGH);
413 if (dentry->d_inode && iops && iops->setattr) {
414 error = iops->setattr(dentry, iattr);
416 error = inode_change_ok(dentry->d_inode, iattr);
418 inode_setattr(inode, iattr);
421 if (!error && (iattr->ia_valid & ATTR_SIZE))
422 vmtruncate(inode, iattr->ia_size);
429 presto_debug_fail_blkdev(fset, KML_OPCODE_SETATTR | 0x10);
431 if ( presto_do_kml(info, dentry) ) {
432 if ((iattr->ia_valid & ATTR_SIZE) && (old_size != inode->i_size)) {
434 /* Journal a close whenever we see a potential truncate
435 * At the receiving end, lento should explicitly remove
436 * ATTR_SIZE from the list of valid attributes */
437 presto_getversion(&new_ver, inode);
438 file.private_data = NULL;
439 file.f_dentry = dentry;
440 error = presto_journal_close(&rec, fset, &file, dentry,
445 error = presto_journal_setattr(&rec, fset, dentry,
446 &old_ver, &rb, iattr);
449 presto_debug_fail_blkdev(fset, KML_OPCODE_SETATTR | 0x20);
450 if ( presto_do_rcvd(info, dentry) )
451 error = presto_write_last_rcvd(&rec, fset, info);
453 presto_debug_fail_blkdev(fset, KML_OPCODE_SETATTR | 0x30);
457 presto_release_space(fset->fset_cache, 2*PRESTO_REQHIGH);
458 presto_trans_commit(fset, handle);
462 int lento_setattr(const char *name, struct iattr *iattr,
463 struct lento_vfs_context *info)
466 struct dentry *dentry;
467 struct presto_file_set *fset;
469 #ifdef CONFIG_FS_POSIX_ACL
470 int (*set_posix_acl)(struct inode *, int type, posix_acl_t *)=NULL;
474 CDEBUG(D_PIOCTL,"name %s, valid %#x, mode %#o, uid %d, gid %d, size %Ld\n",
475 name, iattr->ia_valid, iattr->ia_mode, iattr->ia_uid,
476 iattr->ia_gid, iattr->ia_size);
477 CDEBUG(D_PIOCTL, "atime %#lx, mtime %#lx, ctime %#lx, attr_flags %#x\n",
478 iattr->ia_atime, iattr->ia_mtime, iattr->ia_ctime,
479 iattr->ia_attr_flags);
480 CDEBUG(D_PIOCTL, "offset %d, recno %d, flags %#x\n",
481 info->slot_offset, info->recno, info->flags);
484 error = presto_walk(name, &nd);
491 fset = presto_fset(dentry);
494 CERROR("No fileset!\n");
499 /* NOTE: this prevents us from changing the filetype on setattr,
500 * as we normally only want to change permission bits.
501 * If this is not correct, then we need to fix the perl code
502 * to always send the file type OR'ed with the permission.
504 if (iattr->ia_valid & ATTR_MODE) {
505 int set_mode = iattr->ia_mode;
506 iattr->ia_mode = (iattr->ia_mode & S_IALLUGO) |
507 (dentry->d_inode->i_mode & ~S_IALLUGO);
508 CDEBUG(D_PIOCTL, "chmod: orig %#o, set %#o, result %#o\n",
509 dentry->d_inode->i_mode, set_mode, iattr->ia_mode);
510 #ifdef CONFIG_FS_POSIX_ACL
511 /* ACl code interacts badly with setattr
512 * since it tries to modify the ACL using
513 * set_ext_attr which recurses back into presto.
514 * This only happens if ATTR_MODE is set.
515 * Here we are doing a "forced" mode set
516 * (initiated by lento), so we disable the
517 * set_posix_acl operation which
518 * prevents such recursion. -SHP
520 * This will probably still be required when native
521 * acl journalling is in place.
523 set_posix_acl=dentry->d_inode->i_op->set_posix_acl;
524 dentry->d_inode->i_op->set_posix_acl=NULL;
528 error = presto_do_setattr(fset, dentry, iattr, info);
530 if (info->flags & LENTO_FL_SET_DDFILEID) {
531 struct presto_dentry_data *dd = presto_d2d(dentry);
533 dd->remote_ino = info->remote_ino;
534 dd->remote_generation = info->remote_generation;
538 #ifdef CONFIG_FS_POSIX_ACL
539 /* restore the inode_operations if we changed them*/
540 if (iattr->ia_valid & ATTR_MODE)
541 dentry->d_inode->i_op->set_posix_acl=set_posix_acl;
553 int presto_do_create(struct presto_file_set *fset, struct dentry *dir,
554 struct dentry *dentry, int mode,
555 struct lento_vfs_context *info)
559 struct presto_version tgt_dir_ver, new_file_ver;
560 struct inode_operations *iops;
567 down(&dir->d_inode->i_zombie);
568 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
571 up(&dir->d_inode->i_zombie);
575 error = may_create(dir->d_inode, dentry);
582 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
588 presto_getversion(&tgt_dir_ver, dir->d_inode);
589 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_CREATE);
590 if ( IS_ERR(handle) ) {
592 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
593 CERROR("presto_do_create: no space for transaction\n");
597 DQUOT_INIT(dir->d_inode);
599 error = iops->create(dir->d_inode, dentry, mode);
605 if (dentry->d_inode) {
606 struct presto_cache *cache = fset->fset_cache;
607 /* was this already done? */
608 presto_set_ops(dentry->d_inode, cache->cache_filter);
610 filter_setup_dentry_ops(cache->cache_filter,
613 dentry->d_op = filter_c2udops(cache->cache_filter);
615 /* if Lento creates this file, we won't have data */
616 if ( ISLENTO(presto_c2m(cache)) ) {
617 presto_set(dentry, PRESTO_ATTR);
619 presto_set(dentry, PRESTO_ATTR | PRESTO_DATA);
623 info->flags |= LENTO_FL_TOUCH_PARENT;
624 error = presto_settime(fset, NULL, dir, dentry,
625 info, ATTR_CTIME | ATTR_MTIME);
631 presto_debug_fail_blkdev(fset, KML_OPCODE_CREATE | 0x10);
633 if ( presto_do_kml(info, dentry) ) {
634 presto_getversion(&new_file_ver, dentry->d_inode);
635 error = presto_journal_create(&rec, fset, dentry, &tgt_dir_ver,
637 dentry->d_inode->i_mode);
640 presto_debug_fail_blkdev(fset, KML_OPCODE_CREATE | 0x20);
642 if ( presto_do_rcvd(info, dentry) )
643 error = presto_write_last_rcvd(&rec, fset, info);
645 presto_debug_fail_blkdev(fset, KML_OPCODE_CREATE | 0x30);
647 /* add inode dentry */
648 if (fset->fset_cache->cache_filter->o_trops->tr_add_ilookup ) {
650 d = fset->fset_cache->cache_filter->o_trops->tr_add_ilookup
651 (dir->d_inode->i_sb->s_root, dentry);
658 presto_trans_commit(fset, handle);
660 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
661 up(&dir->d_inode->i_zombie);
666 static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
668 struct dentry *dentry;
670 down(&nd->dentry->d_inode->i_sem);
671 dentry = ERR_PTR(-EEXIST);
672 if (nd->last_type != LAST_NORM)
674 dentry = lookup_hash(&nd->last, nd->dentry);
677 if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
682 dentry = ERR_PTR(-ENOENT);
687 int lento_create(const char *name, int mode, struct lento_vfs_context *info)
692 struct dentry *dentry;
693 struct presto_file_set *fset;
696 pathname = getname(name);
697 error = PTR_ERR(pathname);
698 if (IS_ERR(pathname)) {
703 /* this looks up the parent */
704 // if (path_init(pathname, LOOKUP_FOLLOW | LOOKUP_POSITIVE, &nd))
705 if (path_init(pathname, LOOKUP_PARENT, &nd))
706 error = path_walk(pathname, &nd);
711 dentry = lookup_create(&nd, 0);
712 error = PTR_ERR(dentry);
713 if (IS_ERR(dentry)) {
718 fset = presto_fset(dentry);
721 CERROR("No fileset!\n");
725 error = presto_do_create(fset, dentry->d_parent, dentry, (mode&S_IALLUGO)|S_IFREG,
733 up(&dentry->d_parent->d_inode->i_sem);
739 int presto_do_link(struct presto_file_set *fset, struct dentry *old_dentry,
740 struct dentry *dir, struct dentry *new_dentry,
741 struct lento_vfs_context *info)
746 struct inode_operations *iops;
747 struct presto_version tgt_dir_ver;
748 struct presto_version new_link_ver;
751 down(&dir->d_inode->i_zombie);
752 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
755 up(&dir->d_inode->i_zombie);
759 inode = old_dentry->d_inode;
763 error = may_create(dir->d_inode, new_dentry);
768 if (dir->d_inode->i_dev != inode->i_dev)
772 * A link to an append-only or immutable file cannot be created.
775 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) {
780 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
787 presto_getversion(&tgt_dir_ver, dir->d_inode);
788 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_LINK);
789 if ( IS_ERR(handle) ) {
790 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
791 CERROR("presto_do_link: no space for transaction\n");
795 DQUOT_INIT(dir->d_inode);
797 error = iops->link(old_dentry, dir->d_inode, new_dentry);
804 /* link dd data to that of existing dentry */
805 old_dentry->d_op->d_release(new_dentry);
806 if (!presto_d2d(old_dentry))
808 presto_d2d(old_dentry)->dd_count++;
810 new_dentry->d_fsdata = presto_d2d(old_dentry);
812 info->flags |= LENTO_FL_TOUCH_PARENT;
813 error = presto_settime(fset, NULL, dir, new_dentry,
820 presto_debug_fail_blkdev(fset, KML_OPCODE_LINK | 0x10);
821 presto_getversion(&new_link_ver, new_dentry->d_inode);
822 if ( presto_do_kml(info, old_dentry) )
823 error = presto_journal_link(&rec, fset, old_dentry, new_dentry,
824 &tgt_dir_ver, &new_link_ver);
826 presto_debug_fail_blkdev(fset, KML_OPCODE_LINK | 0x20);
827 if ( presto_do_rcvd(info, old_dentry) )
828 error = presto_write_last_rcvd(&rec, fset, info);
830 presto_debug_fail_blkdev(fset, KML_OPCODE_LINK | 0x30);
832 presto_trans_commit(fset, handle);
834 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
835 up(&dir->d_inode->i_zombie);
840 int lento_link(const char * oldname, const char * newname,
841 struct lento_vfs_context *info)
846 struct presto_file_set *fset;
848 from = getname(oldname);
850 return PTR_ERR(from);
851 to = getname(newname);
854 struct dentry *new_dentry;
855 struct nameidata nd, old_nd;
858 if (path_init(from, LOOKUP_POSITIVE, &old_nd))
859 error = path_walk(from, &old_nd);
862 if (path_init(to, LOOKUP_PARENT, &nd))
863 error = path_walk(to, &nd);
867 if (old_nd.mnt != nd.mnt)
869 new_dentry = lookup_create(&nd, 0);
870 error = PTR_ERR(new_dentry);
872 if (!IS_ERR(new_dentry)) {
873 fset = presto_fset(new_dentry);
876 CERROR("No fileset!\n");
880 error = presto_do_link(fset, old_nd.dentry,
886 up(&nd.dentry->d_inode->i_sem);
889 path_release(&old_nd);
898 int presto_do_unlink(struct presto_file_set *fset, struct dentry *dir,
899 struct dentry *dentry, struct lento_vfs_context *info)
902 struct inode_operations *iops;
903 struct presto_version tgt_dir_ver, old_file_ver;
904 struct izo_rollback_data rb;
906 int do_kml = 0, do_rcvd = 0, linkno = 0, error, old_targetlen = 0;
907 char *old_target = NULL;
910 down(&dir->d_inode->i_zombie);
911 error = may_delete(dir->d_inode, dentry, 0);
914 up(&dir->d_inode->i_zombie);
919 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
922 up(&dir->d_inode->i_zombie);
926 error = presto_reserve_space(fset->fset_cache, PRESTO_REQLOW);
929 up(&dir->d_inode->i_zombie);
934 if (presto_d2d(dentry)) {
935 struct presto_dentry_data *dd = presto_d2d(dentry);
936 struct dentry *de = dd->dd_inodentry;
937 if (de && dentry->d_inode->i_nlink == 1) {
939 dd->dd_inodentry = NULL;
941 atomic_dec(&de->d_inode->i_count);
947 presto_getversion(&tgt_dir_ver, dir->d_inode);
948 presto_getversion(&old_file_ver, dentry->d_inode);
949 izo_get_rollback_data(dentry->d_inode, &rb);
950 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_UNLINK);
951 if ( IS_ERR(handle) ) {
952 presto_release_space(fset->fset_cache, PRESTO_REQLOW);
953 CERROR("ERROR: presto_do_unlink: no space for transaction. Tell Peter.\n");
954 up(&dir->d_inode->i_zombie);
957 DQUOT_INIT(dir->d_inode);
958 if (d_mountpoint(dentry))
962 linkno = dentry->d_inode->i_nlink;
967 if (S_ISLNK(dentry->d_inode->i_mode)) {
969 struct inode_operations *riops;
970 riops = filter_c2csiops(fset->fset_cache->cache_filter);
972 PRESTO_ALLOC(old_target, PATH_MAX);
973 if (old_target == NULL) {
982 if (riops->readlink == NULL)
983 CERROR("InterMezzo %s: no readlink iops.\n",
987 riops->readlink(dentry, old_target,
989 if (old_targetlen < 0) {
990 CERROR("InterMezzo: readlink failed: %ld\n",
991 PTR_ERR(old_target));
992 PRESTO_FREE(old_target, PATH_MAX);
999 do_kml = presto_do_kml(info, dir);
1000 do_rcvd = presto_do_rcvd(info, dir);
1001 error = iops->unlink(dir->d_inode, dentry);
1008 /* FIXME: Combine this with the next call? */
1009 error = presto_settime(fset, NULL, NULL, dentry,
1018 error = presto_settime(fset, NULL, NULL, dir,
1019 info, ATTR_CTIME | ATTR_MTIME);
1025 up(&dir->d_inode->i_zombie);
1031 presto_debug_fail_blkdev(fset, KML_OPCODE_UNLINK | 0x10);
1033 error = presto_journal_unlink(&rec, fset, dir, &tgt_dir_ver,
1034 &old_file_ver, &rb, dentry,
1035 old_target, old_targetlen);
1036 presto_debug_fail_blkdev(fset, KML_OPCODE_UNLINK | 0x20);
1038 error = presto_write_last_rcvd(&rec, fset, info);
1040 presto_debug_fail_blkdev(fset, KML_OPCODE_UNLINK | 0x30);
1043 presto_release_space(fset->fset_cache, PRESTO_REQLOW);
1044 presto_trans_commit(fset, handle);
1045 if (old_target != NULL)
1046 PRESTO_FREE(old_target, PATH_MAX);
1051 int lento_unlink(const char *pathname, struct lento_vfs_context *info)
1055 struct dentry *dentry;
1056 struct nameidata nd;
1057 struct presto_file_set *fset;
1061 name = getname(pathname);
1063 return PTR_ERR(name);
1065 if (path_init(name, LOOKUP_PARENT, &nd))
1066 error = path_walk(name, &nd);
1070 if (nd.last_type != LAST_NORM)
1072 down(&nd.dentry->d_inode->i_sem);
1073 dentry = lookup_hash(&nd.last, nd.dentry);
1074 error = PTR_ERR(dentry);
1075 if (!IS_ERR(dentry)) {
1076 fset = presto_fset(dentry);
1079 CERROR("No fileset!\n");
1083 /* Why not before? Because we want correct error value */
1084 if (nd.last.name[nd.last.len])
1086 error = presto_do_unlink(fset, nd.dentry, dentry, info);
1091 up(&nd.dentry->d_inode->i_sem);
1100 error = !dentry->d_inode ? -ENOENT :
1101 S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR;
1105 int presto_do_symlink(struct presto_file_set *fset, struct dentry *dir,
1106 struct dentry *dentry, const char *oldname,
1107 struct lento_vfs_context *info)
1109 struct rec_info rec;
1111 struct presto_version tgt_dir_ver, new_link_ver;
1112 struct inode_operations *iops;
1116 down(&dir->d_inode->i_zombie);
1117 /* record + max path len + space to free */
1118 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1121 up(&dir->d_inode->i_zombie);
1125 error = may_create(dir->d_inode, dentry);
1132 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
1133 if (!iops->symlink) {
1138 presto_getversion(&tgt_dir_ver, dir->d_inode);
1139 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_SYMLINK);
1140 if ( IS_ERR(handle) ) {
1141 presto_release_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1142 CERROR("ERROR: presto_do_symlink: no space for transaction. Tell Peter.\n");
1144 up(&dir->d_inode->i_zombie);
1147 DQUOT_INIT(dir->d_inode);
1149 error = iops->symlink(dir->d_inode, dentry, oldname);
1155 if (dentry->d_inode) {
1156 struct presto_cache *cache = fset->fset_cache;
1158 presto_set_ops(dentry->d_inode, cache->cache_filter);
1160 filter_setup_dentry_ops(cache->cache_filter, dentry->d_op,
1161 &presto_dentry_ops);
1162 dentry->d_op = filter_c2udops(cache->cache_filter);
1163 /* XXX ? Cache state ? if Lento creates a symlink */
1164 if ( ISLENTO(presto_c2m(cache)) ) {
1165 presto_set(dentry, PRESTO_ATTR);
1167 presto_set(dentry, PRESTO_ATTR | PRESTO_DATA);
1171 info->flags |= LENTO_FL_TOUCH_PARENT;
1172 error = presto_settime(fset, NULL, dir, dentry,
1173 info, ATTR_CTIME | ATTR_MTIME);
1179 presto_debug_fail_blkdev(fset, KML_OPCODE_SYMLINK | 0x10);
1180 presto_getversion(&new_link_ver, dentry->d_inode);
1181 if ( presto_do_kml(info, dentry) )
1182 error = presto_journal_symlink(&rec, fset, dentry, oldname,
1183 &tgt_dir_ver, &new_link_ver);
1185 presto_debug_fail_blkdev(fset, KML_OPCODE_SYMLINK | 0x20);
1186 if ( presto_do_rcvd(info, dentry) )
1187 error = presto_write_last_rcvd(&rec, fset, info);
1189 presto_debug_fail_blkdev(fset, KML_OPCODE_SYMLINK | 0x30);
1193 presto_trans_commit(fset, handle);
1195 presto_release_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1196 up(&dir->d_inode->i_zombie);
1200 int lento_symlink(const char *oldname, const char *newname,
1201 struct lento_vfs_context *info)
1206 struct dentry *dentry;
1207 struct presto_file_set *fset;
1208 struct nameidata nd;
1212 from = getname(oldname);
1213 error = PTR_ERR(from);
1219 to = getname(newname);
1220 error = PTR_ERR(to);
1226 if (path_init(to, LOOKUP_PARENT, &nd))
1227 error = path_walk(to, &nd);
1233 dentry = lookup_create(&nd, 0);
1234 error = PTR_ERR(dentry);
1235 if (IS_ERR(dentry)) {
1241 fset = presto_fset(dentry);
1244 CERROR("No fileset!\n");
1249 error = presto_do_symlink(fset, nd.dentry,
1250 dentry, from, info);
1254 up(&nd.dentry->d_inode->i_sem);
1265 int presto_do_mkdir(struct presto_file_set *fset, struct dentry *dir,
1266 struct dentry *dentry, int mode,
1267 struct lento_vfs_context *info)
1269 struct rec_info rec;
1271 struct presto_version tgt_dir_ver, new_dir_ver;
1275 down(&dir->d_inode->i_zombie);
1277 /* one journal record + directory block + room for removals*/
1278 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1281 up(&dir->d_inode->i_zombie);
1285 error = may_create(dir->d_inode, dentry);
1292 if (!filter_c2cdiops(fset->fset_cache->cache_filter)->mkdir) {
1298 presto_getversion(&tgt_dir_ver, dir->d_inode);
1299 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_MKDIR);
1300 if ( IS_ERR(handle) ) {
1301 presto_release_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1302 CERROR("presto_do_mkdir: no space for transaction\n");
1306 DQUOT_INIT(dir->d_inode);
1307 mode &= (S_IRWXUGO|S_ISVTX);
1309 error = filter_c2cdiops(fset->fset_cache->cache_filter)->mkdir(dir->d_inode, dentry, mode);
1315 if ( dentry->d_inode && !error) {
1316 struct presto_cache *cache = fset->fset_cache;
1318 presto_set_ops(dentry->d_inode, cache->cache_filter);
1320 filter_setup_dentry_ops(cache->cache_filter,
1322 &presto_dentry_ops);
1323 dentry->d_op = filter_c2udops(cache->cache_filter);
1324 /* if Lento does this, we won't have data */
1325 if ( ISLENTO(presto_c2m(cache)) ) {
1326 presto_set(dentry, PRESTO_ATTR);
1328 presto_set(dentry, PRESTO_ATTR | PRESTO_DATA);
1332 info->flags |= LENTO_FL_TOUCH_PARENT;
1333 error = presto_settime(fset, NULL, dir, dentry,
1334 info, ATTR_CTIME | ATTR_MTIME);
1340 presto_debug_fail_blkdev(fset, KML_OPCODE_MKDIR | 0x10);
1341 presto_getversion(&new_dir_ver, dentry->d_inode);
1342 if ( presto_do_kml(info, dir) )
1343 error = presto_journal_mkdir(&rec, fset, dentry, &tgt_dir_ver,
1345 dentry->d_inode->i_mode);
1347 presto_debug_fail_blkdev(fset, KML_OPCODE_MKDIR | 0x20);
1348 if ( presto_do_rcvd(info, dentry) )
1349 error = presto_write_last_rcvd(&rec, fset, info);
1351 presto_debug_fail_blkdev(fset, KML_OPCODE_MKDIR | 0x30);
1355 presto_trans_commit(fset, handle);
1357 presto_release_space(fset->fset_cache, PRESTO_REQHIGH + 4096);
1358 up(&dir->d_inode->i_zombie);
1363 * Look out: this function may change a normal dentry
1364 * into a directory dentry (different size)..
1366 int lento_mkdir(const char *name, int mode, struct lento_vfs_context *info)
1370 struct dentry *dentry;
1371 struct presto_file_set *fset;
1372 struct nameidata nd;
1375 CDEBUG(D_PIOCTL, "name: %s, mode %o, offset %d, recno %d, flags %x\n",
1376 name, mode, info->slot_offset, info->recno, info->flags);
1377 pathname = getname(name);
1378 error = PTR_ERR(pathname);
1379 if (IS_ERR(pathname)) {
1384 if (path_init(pathname, LOOKUP_PARENT, &nd))
1385 error = path_walk(pathname, &nd);
1389 dentry = lookup_create(&nd, 1);
1390 error = PTR_ERR(dentry);
1391 if (!IS_ERR(dentry)) {
1392 fset = presto_fset(dentry);
1395 CERROR("No fileset!\n");
1400 error = presto_do_mkdir(fset, nd.dentry, dentry,
1401 mode & S_IALLUGO, info);
1405 up(&nd.dentry->d_inode->i_sem);
1410 CDEBUG(D_PIOCTL, "error: %d\n", error);
1414 static void d_unhash(struct dentry *dentry)
1417 switch (atomic_read(&dentry->d_count)) {
1419 shrink_dcache_parent(dentry);
1420 if (atomic_read(&dentry->d_count) != 2)
1427 int presto_do_rmdir(struct presto_file_set *fset, struct dentry *dir,
1428 struct dentry *dentry, struct lento_vfs_context *info)
1430 struct rec_info rec;
1432 struct presto_version tgt_dir_ver, old_dir_ver;
1433 struct izo_rollback_data rb;
1434 struct inode_operations *iops;
1436 int do_kml, do_rcvd;
1440 error = may_delete(dir->d_inode, dentry, 1);
1445 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
1451 size = PRESTO_REQHIGH - dentry->d_inode->i_size;
1452 error = presto_reserve_space(fset->fset_cache, size);
1458 presto_getversion(&tgt_dir_ver, dir->d_inode);
1459 presto_getversion(&old_dir_ver, dentry->d_inode);
1460 izo_get_rollback_data(dentry->d_inode, &rb);
1461 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_RMDIR);
1462 if ( IS_ERR(handle) ) {
1463 presto_release_space(fset->fset_cache, size);
1464 CERROR("ERROR: presto_do_rmdir: no space for transaction. Tell Peter.\n");
1468 DQUOT_INIT(dir->d_inode);
1470 do_kml = presto_do_kml(info, dir);
1471 do_rcvd = presto_do_rcvd(info, dir);
1473 double_down(&dir->d_inode->i_zombie, &dentry->d_inode->i_zombie);
1475 if (IS_DEADDIR(dir->d_inode))
1477 else if (d_mountpoint(dentry)) {
1478 CERROR("foo: d_mountpoint(dentry): ino %ld\n",
1479 dentry->d_inode->i_ino);
1483 error = iops->rmdir(dir->d_inode, dentry);
1486 dentry->d_inode->i_flags |= S_DEAD;
1487 error = presto_settime(fset, NULL, NULL, dir, info,
1488 ATTR_CTIME | ATTR_MTIME);
1491 double_up(&dir->d_inode->i_zombie, &dentry->d_inode->i_zombie);
1496 presto_debug_fail_blkdev(fset, KML_OPCODE_RMDIR | 0x10);
1497 if ( !error && do_kml )
1498 error = presto_journal_rmdir(&rec, fset, dir, &tgt_dir_ver,
1501 dentry->d_name.name);
1503 presto_debug_fail_blkdev(fset, KML_OPCODE_RMDIR | 0x20);
1504 if ( !error && do_rcvd )
1505 error = presto_write_last_rcvd(&rec, fset, info);
1507 presto_debug_fail_blkdev(fset, KML_OPCODE_RMDIR | 0x30);
1510 presto_trans_commit(fset, handle);
1511 presto_release_space(fset->fset_cache, size);
1515 int lento_rmdir(const char *pathname, struct lento_vfs_context *info)
1519 struct dentry *dentry;
1520 struct presto_file_set *fset;
1521 struct nameidata nd;
1524 name = getname(pathname);
1527 return PTR_ERR(name);
1530 if (path_init(name, LOOKUP_PARENT, &nd))
1531 error = path_walk(name, &nd);
1536 switch(nd.last_type) {
1547 down(&nd.dentry->d_inode->i_sem);
1548 dentry = lookup_hash(&nd.last, nd.dentry);
1549 error = PTR_ERR(dentry);
1550 if (!IS_ERR(dentry)) {
1551 fset = presto_fset(dentry);
1554 CERROR("No fileset!\n");
1558 error = presto_do_rmdir(fset, nd.dentry, dentry, info);
1562 up(&nd.dentry->d_inode->i_sem);
1571 int presto_do_mknod(struct presto_file_set *fset, struct dentry *dir,
1572 struct dentry *dentry, int mode, dev_t dev,
1573 struct lento_vfs_context *info)
1575 struct rec_info rec;
1577 struct presto_version tgt_dir_ver, new_node_ver;
1578 struct inode_operations *iops;
1583 down(&dir->d_inode->i_zombie);
1585 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
1588 up(&dir->d_inode->i_zombie);
1592 if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD)) {
1597 error = may_create(dir->d_inode, dentry);
1604 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
1610 DQUOT_INIT(dir->d_inode);
1614 presto_getversion(&tgt_dir_ver, dir->d_inode);
1615 handle = presto_trans_start(fset, dir->d_inode, KML_OPCODE_MKNOD);
1616 if ( IS_ERR(handle) ) {
1617 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
1618 CERROR("presto_do_mknod: no space for transaction\n");
1622 error = iops->mknod(dir->d_inode, dentry, mode, dev);
1627 if ( dentry->d_inode) {
1628 struct presto_cache *cache = fset->fset_cache;
1630 presto_set_ops(dentry->d_inode, cache->cache_filter);
1632 filter_setup_dentry_ops(cache->cache_filter, dentry->d_op,
1633 &presto_dentry_ops);
1634 dentry->d_op = filter_c2udops(cache->cache_filter);
1636 /* if Lento does this, we won't have data */
1637 if ( ISLENTO(presto_c2m(cache)) ) {
1638 presto_set(dentry, PRESTO_ATTR);
1640 presto_set(dentry, PRESTO_ATTR | PRESTO_DATA);
1644 error = presto_settime(fset, NULL, NULL, dir,
1649 error = presto_settime(fset, NULL, NULL, dentry,
1650 info, ATTR_CTIME | ATTR_MTIME);
1655 presto_debug_fail_blkdev(fset, KML_OPCODE_MKNOD | 0x10);
1656 presto_getversion(&new_node_ver, dentry->d_inode);
1657 if ( presto_do_kml(info, dentry) )
1658 error = presto_journal_mknod(&rec, fset, dentry, &tgt_dir_ver,
1660 dentry->d_inode->i_mode,
1661 MAJOR(dev), MINOR(dev) );
1663 presto_debug_fail_blkdev(fset, KML_OPCODE_MKNOD | 0x20);
1664 if ( presto_do_rcvd(info, dentry) )
1665 error = presto_write_last_rcvd(&rec, fset, info);
1667 presto_debug_fail_blkdev(fset, KML_OPCODE_MKNOD | 0x30);
1670 presto_trans_commit(fset, handle);
1674 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
1675 up(&dir->d_inode->i_zombie);
1679 int lento_mknod(const char *filename, int mode, dev_t dev,
1680 struct lento_vfs_context *info)
1684 struct dentry * dentry;
1685 struct nameidata nd;
1686 struct presto_file_set *fset;
1692 tmp = getname(filename);
1694 return PTR_ERR(tmp);
1696 if (path_init(tmp, LOOKUP_PARENT, &nd))
1697 error = path_walk(tmp, &nd);
1700 dentry = lookup_create(&nd, 0);
1701 error = PTR_ERR(dentry);
1702 if (!IS_ERR(dentry)) {
1703 fset = presto_fset(dentry);
1706 CERROR("No fileset!\n");
1710 switch (mode & S_IFMT) {
1711 case 0: case S_IFREG:
1712 error = -EOPNOTSUPP;
1714 case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK:
1715 error = presto_do_mknod(fset, nd.dentry, dentry,
1727 up(&nd.dentry->d_inode->i_sem);
1735 int do_rename(struct presto_file_set *fset,
1736 struct dentry *old_parent, struct dentry *old_dentry,
1737 struct dentry *new_parent, struct dentry *new_dentry,
1738 struct lento_vfs_context *info)
1740 struct rec_info rec;
1742 struct inode_operations *iops;
1743 struct presto_version src_dir_ver, tgt_dir_ver;
1745 int new_inode_unlink = 0;
1746 struct inode *old_dir = old_parent->d_inode;
1747 struct inode *new_dir = new_parent->d_inode;
1750 presto_getversion(&src_dir_ver, old_dir);
1751 presto_getversion(&tgt_dir_ver, new_dir);
1754 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
1755 if (!iops || !iops->rename) {
1760 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
1765 handle = presto_trans_start(fset, old_dir, KML_OPCODE_RENAME);
1766 if ( IS_ERR(handle) ) {
1767 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
1768 CERROR("presto_do_rename: no space for transaction\n");
1771 if (new_dentry->d_inode && new_dentry->d_inode->i_nlink > 1) {
1773 new_inode_unlink = 1;
1776 error = iops->rename(old_dir, old_dentry, new_dir, new_dentry);
1783 if (new_inode_unlink) {
1784 error = presto_settime(fset, NULL, NULL, old_dentry,
1792 info->flags |= LENTO_FL_TOUCH_PARENT;
1793 error = presto_settime(fset, NULL, new_parent, old_parent,
1794 info, ATTR_CTIME | ATTR_MTIME);
1800 /* XXX make a distinction between cross file set
1801 * and intra file set renames here
1803 presto_debug_fail_blkdev(fset, KML_OPCODE_RENAME | 0x10);
1804 if ( presto_do_kml(info, old_dentry) )
1805 error = presto_journal_rename(&rec, fset, old_dentry,
1807 &src_dir_ver, &tgt_dir_ver);
1809 presto_debug_fail_blkdev(fset, KML_OPCODE_RENAME | 0x20);
1811 if ( presto_do_rcvd(info, old_dentry) )
1812 error = presto_write_last_rcvd(&rec, fset, info);
1814 presto_debug_fail_blkdev(fset, KML_OPCODE_RENAME | 0x30);
1817 presto_trans_commit(fset, handle);
1818 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
1823 int presto_rename_dir(struct presto_file_set *fset, struct dentry *old_parent,
1824 struct dentry *old_dentry, struct dentry *new_parent,
1825 struct dentry *new_dentry, struct lento_vfs_context *info)
1828 struct inode *target;
1829 struct inode *old_dir = old_parent->d_inode;
1830 struct inode *new_dir = new_parent->d_inode;
1832 if (old_dentry->d_inode == new_dentry->d_inode)
1835 error = may_delete(old_dir, old_dentry, 1);
1839 if (new_dir->i_dev != old_dir->i_dev)
1842 if (!new_dentry->d_inode)
1843 error = may_create(new_dir, new_dentry);
1845 error = may_delete(new_dir, new_dentry, 1);
1849 if (!old_dir->i_op || !old_dir->i_op->rename)
1853 * If we are going to change the parent - check write permissions,
1854 * we'll need to flip '..'.
1856 if (new_dir != old_dir) {
1857 error = permission(old_dentry->d_inode, MAY_WRITE);
1862 DQUOT_INIT(old_dir);
1863 DQUOT_INIT(new_dir);
1864 down(&old_dir->i_sb->s_vfs_rename_sem);
1866 if (is_subdir(new_dentry, old_dentry))
1868 target = new_dentry->d_inode;
1869 if (target) { /* Hastur! Hastur! Hastur! */
1870 triple_down(&old_dir->i_zombie,
1873 d_unhash(new_dentry);
1875 double_down(&old_dir->i_zombie,
1876 &new_dir->i_zombie);
1877 if (IS_DEADDIR(old_dir)||IS_DEADDIR(new_dir))
1879 else if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
1882 error = do_rename(fset, old_parent, old_dentry,
1883 new_parent, new_dentry, info);
1886 target->i_flags |= S_DEAD;
1887 triple_up(&old_dir->i_zombie,
1890 if (d_unhashed(new_dentry))
1891 d_rehash(new_dentry);
1894 double_up(&old_dir->i_zombie,
1895 &new_dir->i_zombie);
1898 d_move(old_dentry,new_dentry);
1900 up(&old_dir->i_sb->s_vfs_rename_sem);
1905 int presto_rename_other(struct presto_file_set *fset, struct dentry *old_parent,
1906 struct dentry *old_dentry, struct dentry *new_parent,
1907 struct dentry *new_dentry, struct lento_vfs_context *info)
1909 struct inode *old_dir = old_parent->d_inode;
1910 struct inode *new_dir = new_parent->d_inode;
1913 if (old_dentry->d_inode == new_dentry->d_inode)
1916 error = may_delete(old_dir, old_dentry, 0);
1920 if (new_dir->i_dev != old_dir->i_dev)
1923 if (!new_dentry->d_inode)
1924 error = may_create(new_dir, new_dentry);
1926 error = may_delete(new_dir, new_dentry, 0);
1930 if (!old_dir->i_op || !old_dir->i_op->rename)
1933 DQUOT_INIT(old_dir);
1934 DQUOT_INIT(new_dir);
1935 double_down(&old_dir->i_zombie, &new_dir->i_zombie);
1936 if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry))
1939 error = do_rename(fset, old_parent, old_dentry,
1940 new_parent, new_dentry, info);
1941 double_up(&old_dir->i_zombie, &new_dir->i_zombie);
1944 /* The following d_move() should become unconditional */
1945 if (!(old_dir->i_sb->s_type->fs_flags & FS_ODD_RENAME)) {
1946 d_move(old_dentry, new_dentry);
1951 int presto_do_rename(struct presto_file_set *fset,
1952 struct dentry *old_parent, struct dentry *old_dentry,
1953 struct dentry *new_parent, struct dentry *new_dentry,
1954 struct lento_vfs_context *info)
1956 if (S_ISDIR(old_dentry->d_inode->i_mode))
1957 return presto_rename_dir(fset, old_parent,old_dentry,new_parent,
1960 return presto_rename_other(fset, old_parent, old_dentry,
1961 new_parent,new_dentry, info);
1965 int lento_do_rename(const char *oldname, const char *newname,
1966 struct lento_vfs_context *info)
1969 struct dentry * old_dir, * new_dir;
1970 struct dentry * old_dentry, *new_dentry;
1971 struct nameidata oldnd, newnd;
1972 struct presto_file_set *fset;
1976 if (path_init(oldname, LOOKUP_PARENT, &oldnd))
1977 error = path_walk(oldname, &oldnd);
1982 if (path_init(newname, LOOKUP_PARENT, &newnd))
1983 error = path_walk(newname, &newnd);
1988 if (oldnd.mnt != newnd.mnt)
1991 old_dir = oldnd.dentry;
1993 if (oldnd.last_type != LAST_NORM)
1996 new_dir = newnd.dentry;
1997 if (newnd.last_type != LAST_NORM)
2000 double_lock(new_dir, old_dir);
2002 old_dentry = lookup_hash(&oldnd.last, old_dir);
2003 error = PTR_ERR(old_dentry);
2004 if (IS_ERR(old_dentry))
2006 /* source must exist */
2008 if (!old_dentry->d_inode)
2010 fset = presto_fset(old_dentry);
2013 CERROR("No fileset!\n");
2017 /* unless the source is a directory trailing slashes give -ENOTDIR */
2018 if (!S_ISDIR(old_dentry->d_inode->i_mode)) {
2020 if (oldnd.last.name[oldnd.last.len])
2022 if (newnd.last.name[newnd.last.len])
2025 new_dentry = lookup_hash(&newnd.last, new_dir);
2026 error = PTR_ERR(new_dentry);
2027 if (IS_ERR(new_dentry))
2031 error = presto_do_rename(fset, old_dir, old_dentry,
2032 new_dir, new_dentry, info);
2039 double_up(&new_dir->d_inode->i_sem, &old_dir->d_inode->i_sem);
2041 path_release(&newnd);
2043 path_release(&oldnd);
2048 int lento_rename(const char * oldname, const char * newname,
2049 struct lento_vfs_context *info)
2055 from = getname(oldname);
2057 return PTR_ERR(from);
2058 to = getname(newname);
2059 error = PTR_ERR(to);
2061 error = lento_do_rename(from,to, info);
2068 struct dentry *presto_iopen(struct dentry *dentry,
2069 ino_t ino, unsigned int generation)
2071 struct presto_file_set *fset;
2076 /* see if we already have the dentry we want */
2077 if (dentry->d_inode && dentry->d_inode->i_ino == ino &&
2078 dentry->d_inode->i_generation == generation) {
2083 /* Make sure we have a cache beneath us. We should always find at
2084 * least one dentry inside the cache (if it exists), otherwise not
2085 * even the cache root exists, or we passed in a bad name.
2087 fset = presto_fset(dentry);
2090 CERROR("No fileset for %*s!\n",
2091 dentry->d_name.len, dentry->d_name.name);
2094 return ERR_PTR(error);
2098 sprintf(name, "%s%#lx%c%#x",
2099 PRESTO_ILOOKUP_MAGIC, ino, PRESTO_ILOOKUP_SEP, generation);
2100 CDEBUG(D_PIOCTL, "opening %ld by number (as %s)\n", ino, name);
2101 return lookup_one_len(name, fset->fset_dentry, strlen(name));
2104 static struct file *presto_filp_dopen(struct dentry *dentry, int flags)
2107 struct inode *inode;
2112 f = get_empty_filp();
2114 CDEBUG(D_PIOCTL, "error getting file pointer\n");
2118 f->f_flags = flag = flags;
2119 f->f_mode = (flag+1) & O_ACCMODE;
2120 inode = dentry->d_inode;
2121 if (f->f_mode & FMODE_WRITE) {
2122 error = get_write_access(inode);
2124 CDEBUG(D_PIOCTL, "error getting write access\n");
2125 EXIT; goto cleanup_file;
2129 f->f_dentry = dentry;
2134 /* XXX should we set to presto ops, or leave at cache ops? */
2135 f->f_op = inode->i_fop;
2136 if (f->f_op && f->f_op->open) {
2137 error = f->f_op->open(inode, f);
2139 CDEBUG(D_PIOCTL, "error calling cache 'open'\n");
2144 f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
2149 if (f->f_mode & FMODE_WRITE)
2150 put_write_access(inode);
2154 return ERR_PTR(error);
2158 /* Open an inode by number. We pass in the cache root name (or a subdirectory
2159 * from the cache that is guaranteed to exist) to be able to access the cache.
2161 int lento_iopen(const char *name, ino_t ino, unsigned int generation,
2165 struct dentry *dentry;
2166 struct nameidata nd;
2172 "open %s:inode %#lx (%ld), generation %x (%d), flags %d \n",
2173 name, ino, ino, generation, generation, flags);
2174 /* We don't allow creation of files by number only, as it would
2175 * lead to a dangling files not in any directory. We could also
2176 * just turn off the flag and ignore it.
2178 if (flags & O_CREAT) {
2179 CERROR("%s: create file by inode number (%ld) not allowed\n",
2185 tmp = getname(name);
2188 return PTR_ERR(tmp);
2192 again: /* look the named file or a parent directory so we can get the cache */
2193 error = presto_walk(tmp, &nd);
2194 if ( error && error != -ENOENT ) {
2200 if (error == -ENOENT)
2205 /* we didn't find the named file, so see if a parent exists */
2209 slash = strrchr(tmp, '/');
2210 if (slash && slash != tmp) {
2215 /* we should never get here... */
2216 CDEBUG(D_PIOCTL, "no more path components to try!\n");
2220 CDEBUG(D_PIOCTL, "returned dentry %p\n", dentry);
2222 dentry = presto_iopen(dentry, ino, generation);
2223 fd = PTR_ERR(dentry);
2224 if (IS_ERR(dentry)) {
2229 /* XXX start of code that might be replaced by something like:
2230 * if (flags & (O_WRONLY | O_RDWR)) {
2231 * error = get_write_access(dentry->d_inode);
2234 * goto cleanup_dput;
2237 * fd = open_dentry(dentry, flags);
2239 * including the presto_filp_dopen() function (check dget counts!)
2241 fd = get_unused_fd();
2249 struct file * f = presto_filp_dopen(dentry, flags);
2258 /* end of code that might be replaced by open_dentry */
2268 #ifdef CONFIG_FS_EXT_ATTR
2270 #ifdef CONFIG_FS_POSIX_ACL
2271 /* Posix ACL code changes i_mode without using a notify_change (or
2272 * a mark_inode_dirty!). We need to duplicate this at the reintegrator
2273 * which is done by this function. This function also takes care of
2274 * resetting the cached posix acls in this inode. If we don't reset these
2275 * VFS continues using the old acl information, which by now may be out of
2278 int presto_setmode(struct presto_file_set *fset, struct dentry *dentry,
2281 struct inode *inode = dentry->d_inode;
2284 /* The extended attributes for this inode were modified.
2285 * At this point we can not be sure if any of the ACL
2286 * information for this inode was updated. So we will
2287 * force VFS to reread the acls. Note that we do this
2288 * only when called from the SETEXTATTR ioctl, which is why we
2289 * do this while setting the mode of the file. Also note
2290 * that mark_inode_dirty is not be needed for i_*acl only
2291 * to force i_mode info to disk, and should be removed once
2292 * we use notify_change to update the mode.
2293 * XXX: is mode setting really needed? Just setting acl's should
2294 * be enough! VFS should change the i_mode as needed? SHP
2297 inode->i_acl != POSIX_ACL_NOT_CACHED)
2298 posix_acl_release(inode->i_acl);
2299 if (inode->i_default_acl &&
2300 inode->i_default_acl != POSIX_ACL_NOT_CACHED)
2301 posix_acl_release(inode->i_default_acl);
2302 inode->i_acl = POSIX_ACL_NOT_CACHED;
2303 inode->i_default_acl = POSIX_ACL_NOT_CACHED;
2304 inode->i_mode = mode;
2305 /* inode should already be dirty...but just in case */
2306 mark_inode_dirty(inode);
2310 /* XXX: The following code is the preferred way to set mode,
2311 * however, I need to carefully go through possible recursion
2312 * paths back into presto. See comments in presto_do_setattr.
2316 struct super_operations *sops;
2319 iattr.ia_mode = mode;
2320 iattr.ia_valid = ATTR_MODE|ATTR_FORCE;
2323 sops = filter_c2csops(fset->fset_cache->cache_filter);
2325 !sops->notify_change) {
2330 error = sops->notify_change(dentry, &iattr);
2339 /* setextattr Interface to cache filesystem */
2340 int presto_do_set_ext_attr(struct presto_file_set *fset,
2341 struct dentry *dentry,
2342 const char *name, void *buffer,
2343 size_t buffer_len, int flags, mode_t *mode,
2344 struct lento_vfs_context *info)
2346 struct rec_info rec;
2347 struct inode *inode = dentry->d_inode;
2348 struct inode_operations *iops;
2350 struct presto_version ver;
2352 char temp[PRESTO_EXT_ATTR_NAME_MAX+1];
2356 if (IS_RDONLY(inode)) {
2361 if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
2366 presto_getversion(&ver, inode);
2368 /* We need to invoke different filters based on whether
2369 * this dentry is a regular file, directory or symlink.
2371 switch (inode->i_mode & S_IFMT) {
2372 case S_IFLNK: /* symlink */
2373 iops = filter_c2csiops(fset->fset_cache->cache_filter);
2375 case S_IFDIR: /* directory */
2376 iops = filter_c2cdiops(fset->fset_cache->cache_filter);
2379 default: /* everything else including regular files */
2380 iops = filter_c2cfiops(fset->fset_cache->cache_filter);
2383 if (!iops && !iops->set_ext_attr) {
2388 error = presto_reserve_space(fset->fset_cache, PRESTO_REQHIGH);
2395 handle = presto_trans_start(fset,dentry->d_inode,KML_OPCODE_SETEXTATTR);
2396 if ( IS_ERR(handle) ) {
2397 CERROR("presto_do_set_ext_attr: no space for transaction\n");
2398 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
2402 /* We first "truncate" name to the maximum allowable in presto */
2403 /* This simulates the strncpy_from_use code in fs/ext_attr.c */
2404 strncpy(temp,name,sizeof(temp));
2406 /* Pass down to cache*/
2407 error = iops->set_ext_attr(inode,temp,buffer,buffer_len,flags);
2413 #ifdef CONFIG_FS_POSIX_ACL
2414 /* Reset mode if specified*/
2415 /* XXX: when we do native acl support, move this code out! */
2417 error = presto_setmode(fset, dentry, *mode);
2425 /* Reset ctime. Only inode change time (ctime) is affected */
2426 error = presto_settime(fset, NULL, NULL, dentry, info, ATTR_CTIME);
2432 if (flags & EXT_ATTR_FLAG_USER) {
2433 CERROR(" USER flag passed to presto_do_set_ext_attr!\n");
2437 /* We are here, so set_ext_attr succeeded. We no longer need to keep
2438 * track of EXT_ATTR_FLAG_{EXISTS,CREATE}, instead, we will force
2439 * the attribute value during log replay. -SHP
2441 flags &= ~(EXT_ATTR_FLAG_EXISTS | EXT_ATTR_FLAG_CREATE);
2443 presto_debug_fail_blkdev(fset, KML_OPCODE_SETEXTATTR | 0x10);
2444 if ( presto_do_kml(info, dentry) )
2445 error = presto_journal_set_ext_attr
2446 (&rec, fset, dentry, &ver, name, buffer,
2449 presto_debug_fail_blkdev(fset, KML_OPCODE_SETEXTATTR | 0x20);
2450 if ( presto_do_rcvd(info, dentry) )
2451 error = presto_write_last_rcvd(&rec, fset, info);
2453 presto_debug_fail_blkdev(fset, KML_OPCODE_SETEXTATTR | 0x30);
2456 presto_release_space(fset->fset_cache, PRESTO_REQHIGH);
2457 presto_trans_commit(fset, handle);