Module Name: src Committed By: manu Date: Fri Jun 24 16:59:29 UTC 2011
Modified Files: src/lib/libpuffs: null.c Log Message: Commit fix for misc/45029. Approved by pooka@ To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/lib/libpuffs/null.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libpuffs/null.c diff -u src/lib/libpuffs/null.c:1.28 src/lib/libpuffs/null.c:1.29 --- src/lib/libpuffs/null.c:1.28 Sun Oct 18 20:14:06 2009 +++ src/lib/libpuffs/null.c Fri Jun 24 16:59:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: null.c,v 1.28 2009/10/18 20:14:06 pooka Exp $ */ +/* $NetBSD: null.c,v 1.29 2011/06/24 16:59:29 manu Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -27,7 +27,7 @@ #include <sys/cdefs.h> #if !defined(lint) -__RCSID("$NetBSD: null.c,v 1.28 2009/10/18 20:14:06 pooka Exp $"); +__RCSID("$NetBSD: null.c,v 1.29 2011/06/24 16:59:29 manu Exp $"); #endif /* !lint */ /* @@ -410,21 +410,36 @@ struct puffs_node *pn = opc; int fd, rv; int fflags; + struct stat sb; rv = 0; - fd = writeableopen(PNPATH(pn)); - if (fd == -1) + if (stat(PNPATH(pn), &sb) == -1) return errno; + if (S_ISDIR(sb.st_mode)) { + DIR *dirp; + if ((dirp = opendir(PNPATH(pn))) == 0) + return errno; + fd = dirfd(dirp); + if (fd == -1) + return errno; - if (how & PUFFS_FSYNC_DATAONLY) - fflags = FDATASYNC; - else - fflags = FFILESYNC; - if (how & PUFFS_FSYNC_CACHE) - fflags |= FDISKSYNC; + if (fsync(fd) == -1) + rv = errno; + } else { + fd = writeableopen(PNPATH(pn)); + if (fd == -1) + return errno; - if (fsync_range(fd, fflags, offlo, offhi - offlo) == -1) - rv = errno; + if (how & PUFFS_FSYNC_DATAONLY) + fflags = FDATASYNC; + else + fflags = FFILESYNC; + if (how & PUFFS_FSYNC_CACHE) + fflags |= FDISKSYNC; + + if (fsync_range(fd, fflags, offlo, offhi - offlo) == -1) + rv = errno; + } close(fd);