Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/fs/msdosfs/msdosfs_denode.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/fs/msdosfs/msdosfs_denode.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.7 retrieving revision 1.7.10.2 diff -u -p -r1.7 -r1.7.10.2 --- src/sys/fs/msdosfs/msdosfs_denode.c 2004/05/20 05:39:34 1.7 +++ src/sys/fs/msdosfs/msdosfs_denode.c 2007/10/04 18:43:58 1.7.10.2 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_denode.c,v 1.7 2004/05/20 05:39:34 atatat Exp $ */ +/* $NetBSD: msdosfs_denode.c,v 1.7.10.2 2007/10/04 18:43:58 bouyer Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.7 2004/05/20 05:39:34 atatat Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.7.10.2 2007/10/04 18:43:58 bouyer Exp $"); #include #include @@ -82,10 +82,11 @@ POOL_INIT(msdosfs_denode_pool, sizeof(st extern int prtactive; -struct genfs_ops msdosfs_genfsops = { - genfs_size, - msdosfs_gop_alloc, - genfs_gop_write, +static const struct genfs_ops msdosfs_genfsops = { + .gop_size = genfs_size, + .gop_alloc = msdosfs_gop_alloc, + .gop_write = genfs_gop_write, + .gop_markupdate = msdosfs_gop_markupdate, }; static struct denode *msdosfs_hashget __P((dev_t, u_long, u_long)); @@ -289,6 +290,7 @@ deget(pmp, dirclust, diroffset, depp) * need to it. */ vn_lock(nvp, LK_EXCLUSIVE | LK_RETRY); + genfs_node_init(nvp, &msdosfs_genfsops); msdosfs_hashins(ldep); ldep->de_pmp = pmp; @@ -333,8 +335,12 @@ deget(pmp, dirclust, diroffset, depp) /* leave the other fields as garbage */ } else { error = readep(pmp, dirclust, diroffset, &bp, &direntptr); - if (error) + if (error) { + ldep->de_devvp = NULL; + ldep->de_Name[0] = SLOT_DELETED; + vput(nvp); return (error); + } DE_INTERNALIZE(ldep, direntptr); brelse(bp); } @@ -363,7 +369,6 @@ deget(pmp, dirclust, diroffset, depp) } } else nvp->v_type = VREG; - genfs_node_init(nvp, &msdosfs_genfsops); VREF(ldep->de_devvp); *depp = ldep; nvp->v_size = ldep->de_FileSize; @@ -693,3 +698,21 @@ msdosfs_gop_alloc(struct vnode *vp, off_ { return 0; } + +void +msdosfs_gop_markupdate(struct vnode *vp, int flags) +{ + u_long mask = 0; + + if ((flags & GOP_UPDATE_ACCESSED) != 0) { + mask = DE_ACCESS; + } + if ((flags & GOP_UPDATE_MODIFIED) != 0) { + mask |= DE_UPDATE; + } + if (mask) { + struct denode *dep = VTODE(vp); + + dep->de_flag |= mask; + } +}