* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/kern/vfs_jops.c,v 1.21 2005/09/06 23:55:04 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_jops.c,v 1.22 2005/09/07 19:04:18 dillon Exp $
*/
/*
* Each mount point may have zero or more independantly configured journals
#define JRUNDO_GEN 0x00000200
#define JRUNDO_FLAGS 0x00000400
#define JRUNDO_UDEV 0x00000800
+#define JRUNDO_NLINK 0x00001000
#define JRUNDO_FILEDATA 0x00010000
#define JRUNDO_GETVP 0x00020000
#define JRUNDO_CONDLINK 0x00040000 /* write file data if link count 1 */
#define JRUNDO_VATTR (JRUNDO_SIZE|JRUNDO_UID|JRUNDO_GID|JRUNDO_FSID|\
JRUNDO_MODES|JRUNDO_INUM|JRUNDO_ATIME|JRUNDO_MTIME|\
- JRUNDO_CTIME|JRUNDO_GEN|JRUNDO_FLAGS|JRUNDO_UDEV)
+ JRUNDO_CTIME|JRUNDO_GEN|JRUNDO_FLAGS|JRUNDO_UDEV|\
+ JRUNDO_NLINK)
#define JRUNDO_ALL (JRUNDO_VATTR|JRUNDO_FILEDATA)
static struct vnodeopv_entry_desc journal_vnodeop_entries[] = {
if (jrflags & JRUNDO_VATTR) {
save2 = jrecord_push(jrec, JTYPE_VATTR);
jrecord_leaf(jrec, JLEAF_VTYPE, &attr.va_type, sizeof(attr.va_type));
+ if ((jrflags & JRUNDO_NLINK) && attr.va_nlink != VNOVAL)
+ jrecord_leaf(jrec, JLEAF_NLINK, &attr.va_nlink, sizeof(attr.va_nlink));
if ((jrflags & JRUNDO_SIZE) && attr.va_size != VNOVAL)
jrecord_leaf(jrec, JLEAF_SIZE, &attr.va_size, sizeof(attr.va_size));
if ((jrflags & JRUNDO_UID) && attr.va_uid != VNOVAL)
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct mount *mp;
struct uio uio_copy;
struct iovec uio_one_iovec;
+ void *save;
int error;
/*
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_uio(jrec, JLEAF_FILEDATA, &uio_copy);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
if (error == 0 && ap->a_count > 0) {
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_pagelist(jrec, JLEAF_FILEDATA, ap->a_m, ap->a_rtvals,
btoc(ap->a_count), ap->a_offset);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
#endif
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+#if 0
+ save = jrecord_push(jrec, JTYPE_REDO);
/* XXX type, aclp */
+ jrecord_pop(jrec, save);
+#endif
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
jrecord_leaf(jrec, JLEAF_ATTRNAME, ap->a_name, strlen(ap->a_name));
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_uio(jrec, JLEAF_FILEDATA, ap->a_uio);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
}
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
/* XXX PATH to VP and inode number */
/* XXX this call may not record the correct path when
* multiple paths are available */
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vnode_link(jrec, ap->a_vp, ap->a_ncp);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_leaf(jrec, JLEAF_SYMLINKDATA,
ap->a_target, strlen(ap->a_target));
+ jrecord_pop(jrec, save);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
}
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/kern/vfs_journal.c,v 1.21 2005/09/06 23:55:04 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_journal.c,v 1.22 2005/09/07 19:04:18 dillon Exp $
*/
/*
* Each mount point may have zero or more independantly configured journals
#define JRUNDO_GEN 0x00000200
#define JRUNDO_FLAGS 0x00000400
#define JRUNDO_UDEV 0x00000800
+#define JRUNDO_NLINK 0x00001000
#define JRUNDO_FILEDATA 0x00010000
#define JRUNDO_GETVP 0x00020000
#define JRUNDO_CONDLINK 0x00040000 /* write file data if link count 1 */
#define JRUNDO_VATTR (JRUNDO_SIZE|JRUNDO_UID|JRUNDO_GID|JRUNDO_FSID|\
JRUNDO_MODES|JRUNDO_INUM|JRUNDO_ATIME|JRUNDO_MTIME|\
- JRUNDO_CTIME|JRUNDO_GEN|JRUNDO_FLAGS|JRUNDO_UDEV)
+ JRUNDO_CTIME|JRUNDO_GEN|JRUNDO_FLAGS|JRUNDO_UDEV|\
+ JRUNDO_NLINK)
#define JRUNDO_ALL (JRUNDO_VATTR|JRUNDO_FILEDATA)
static struct vnodeopv_entry_desc journal_vnodeop_entries[] = {
if (jrflags & JRUNDO_VATTR) {
save2 = jrecord_push(jrec, JTYPE_VATTR);
jrecord_leaf(jrec, JLEAF_VTYPE, &attr.va_type, sizeof(attr.va_type));
+ if ((jrflags & JRUNDO_NLINK) && attr.va_nlink != VNOVAL)
+ jrecord_leaf(jrec, JLEAF_NLINK, &attr.va_nlink, sizeof(attr.va_nlink));
if ((jrflags & JRUNDO_SIZE) && attr.va_size != VNOVAL)
jrecord_leaf(jrec, JLEAF_SIZE, &attr.va_size, sizeof(attr.va_size));
if ((jrflags & JRUNDO_UID) && attr.va_uid != VNOVAL)
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct mount *mp;
struct uio uio_copy;
struct iovec uio_one_iovec;
+ void *save;
int error;
/*
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_uio(jrec, JLEAF_FILEDATA, &uio_copy);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
if (error == 0 && ap->a_count > 0) {
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_vnode_ref(jrec, ap->a_vp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_pagelist(jrec, JLEAF_FILEDATA, ap->a_m, ap->a_rtvals,
btoc(ap->a_count), ap->a_offset);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
#endif
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
+#if 0
+ save = jrecord_push(jrec, JTYPE_REDO);
/* XXX type, aclp */
+ jrecord_pop(jrec, save);
+#endif
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
jrecord_write_cred(jrec, ap->a_td, ap->a_cred);
jrecord_write_vnode_ref(jrec, ap->a_vp);
jrecord_leaf(jrec, JLEAF_ATTRNAME, ap->a_name, strlen(ap->a_name));
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_uio(jrec, JLEAF_FILEDATA, ap->a_uio);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vattr(jrec, ap->a_vap);
+ jrecord_pop(jrec, save);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
}
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
/* XXX PATH to VP and inode number */
/* XXX this call may not record the correct path when
* multiple paths are available */
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_write_vnode_link(jrec, ap->a_vp, ap->a_ncp);
+ jrecord_pop(jrec, save);
}
}
jreclist_done(&jreclist, error);
struct jrecord jreccache;
struct jrecord *jrec;
struct mount *mp;
+ void *save;
int error;
mp = ap->a_head.a_ops->vv_mount;
TAILQ_FOREACH(jrec, &jreclist, user_entry) {
jrecord_write_cred(jrec, NULL, ap->a_cred);
jrecord_write_path(jrec, JLEAF_PATH1, ap->a_ncp);
+ save = jrecord_push(jrec, JTYPE_REDO);
jrecord_leaf(jrec, JLEAF_SYMLINKDATA,
ap->a_target, strlen(ap->a_target));
+ jrecord_pop(jrec, save);
if (*ap->a_vpp)
jrecord_write_vnode_ref(jrec, *ap->a_vpp);
}
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/sys/journal.h,v 1.9 2005/09/06 23:55:02 dillon Exp $
+ * $DragonFly: src/sys/sys/journal.h,v 1.10 2005/09/07 19:04:16 dillon Exp $
*/
#ifndef _SYS_JOURNAL_H_
#define JTYPE_DISASSOCIATE 0x0003
#define JTYPE_UNDO (JMASK_NESTED|0x0004)
#define JTYPE_AUDIT (JMASK_NESTED|0x0005)
+#define JTYPE_REDO (JMASK_NESTED|0x0006)
#define JTYPE_SETATTR (JMASK_NESTED|0x0010)
#define JTYPE_WRITE (JMASK_NESTED|0x0011)