* Fix a missing vattr record in CREATE.
* Fix a misgenerated mode attribute.
* Fix a misgenerated file offset for the O_APPEND case.
* The 16 bit record type is unsigned, not signed (fixes comparisons in jscan)
* Add JTYPE_MASK against the record type for JTYPE and JLEAF comparisons.
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/kern/vfs_jops.c,v 1.13 2005/06/03 23:57:32 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_jops.c,v 1.14 2005/07/04 21:05:53 dillon Exp $
*/
/*
* Each mount point may have zero or more independantly configured journals
save = jrecord_push(jrec, JTYPE_VATTR);
if (vat->va_type != VNON)
jrecord_leaf(jrec, JLEAF_VTYPE, &vat->va_type, sizeof(vat->va_type));
- if (vat->va_uid != VNOVAL)
+ if (vat->va_mode != (mode_t)VNOVAL)
jrecord_leaf(jrec, JLEAF_MODES, &vat->va_mode, sizeof(vat->va_mode));
if (vat->va_nlink != VNOVAL)
jrecord_leaf(jrec, JLEAF_NLINK, &vat->va_nlink, sizeof(vat->va_nlink));
*
* XXX fix the UIO code to not destroy iov's during a scan so we can
* reuse the uio over and over again.
+ *
+ * XXX UNDO code needs to journal the old data prior to the write.
*/
uio_copy = *ap->a_uio;
if (uio_copy.uio_iovcnt == 1) {
}
error = vop_journal_operate_ap(&ap->a_head);
+
+ /*
+ * XXX bad hack to figure out the offset for O_APPEND writes (note:
+ * uio field state after the VFS operation).
+ */
+ uio_copy.uio_offset = ap->a_uio->uio_offset -
+ (uio_copy.uio_resid - ap->a_uio->uio_resid);
+
mp = ap->a_head.a_ops->vv_mount;
if (error == 0) {
TAILQ_FOREACH(jo, &mp->mnt_jlist, jentry) {
jrecord_write_path(&jrec, JLEAF_PATH1, ap->a_ncp);
if (*ap->a_vpp)
jrecord_write_vnode_ref(&jrec, *ap->a_vpp);
+ jrecord_write_vattr(&jrec, ap->a_vap);
jrecord_pop(&jrec, save);
jrecord_done(&jrec, 0);
}
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/kern/vfs_journal.c,v 1.13 2005/06/03 23:57:32 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_journal.c,v 1.14 2005/07/04 21:05:53 dillon Exp $
*/
/*
* Each mount point may have zero or more independantly configured journals
save = jrecord_push(jrec, JTYPE_VATTR);
if (vat->va_type != VNON)
jrecord_leaf(jrec, JLEAF_VTYPE, &vat->va_type, sizeof(vat->va_type));
- if (vat->va_uid != VNOVAL)
+ if (vat->va_mode != (mode_t)VNOVAL)
jrecord_leaf(jrec, JLEAF_MODES, &vat->va_mode, sizeof(vat->va_mode));
if (vat->va_nlink != VNOVAL)
jrecord_leaf(jrec, JLEAF_NLINK, &vat->va_nlink, sizeof(vat->va_nlink));
*
* XXX fix the UIO code to not destroy iov's during a scan so we can
* reuse the uio over and over again.
+ *
+ * XXX UNDO code needs to journal the old data prior to the write.
*/
uio_copy = *ap->a_uio;
if (uio_copy.uio_iovcnt == 1) {
}
error = vop_journal_operate_ap(&ap->a_head);
+
+ /*
+ * XXX bad hack to figure out the offset for O_APPEND writes (note:
+ * uio field state after the VFS operation).
+ */
+ uio_copy.uio_offset = ap->a_uio->uio_offset -
+ (uio_copy.uio_resid - ap->a_uio->uio_resid);
+
mp = ap->a_head.a_ops->vv_mount;
if (error == 0) {
TAILQ_FOREACH(jo, &mp->mnt_jlist, jentry) {
jrecord_write_path(&jrec, JLEAF_PATH1, ap->a_ncp);
if (*ap->a_vpp)
jrecord_write_vnode_ref(&jrec, *ap->a_vpp);
+ jrecord_write_vattr(&jrec, ap->a_vap);
jrecord_pop(&jrec, save);
jrecord_done(&jrec, 0);
}
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/sys/journal.h,v 1.3 2005/03/22 22:13:32 dillon Exp $
+ * $DragonFly: src/sys/sys/journal.h,v 1.4 2005/07/04 21:05:54 dillon Exp $
*/
#ifndef _SYS_JOURNAL_H_
*/
struct journal_subrecord {
- int16_t rectype; /* 2 control bits, 14 record type bits */
+ u_int16_t rectype; /* 2 control bits, 14 record type bits */
int16_t reserved; /* future use */
int32_t recsize; /* record size (mandatory if not NESTED) */
/* ADDITIONAL DATA */
#define JMASK_NESTED 0x8000 /* data is a nested recursion */
#define JMASK_LAST 0x4000
#define JMASK_SUBRECORD 0x0400
+#define JTYPE_MASK (~JMASK_LAST)
#define JLEAF_PAD 0x0000
#define JLEAF_ABORT 0x0001