Module Name:    src
Committed By:   christos
Date:           Sun Mar 18 02:40:56 UTC 2012

Modified Files:
        src/sys/fs/sysvbfs: bfs.c bfs.h sysvbfs_vnops.c

Log Message:
handle file resizing.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/fs/sysvbfs/bfs.c
cvs rdiff -u -r1.5 -r1.6 src/sys/fs/sysvbfs/bfs.h
cvs rdiff -u -r1.41 -r1.42 src/sys/fs/sysvbfs/sysvbfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/sysvbfs/bfs.c
diff -u src/sys/fs/sysvbfs/bfs.c:1.13 src/sys/fs/sysvbfs/bfs.c:1.14
--- src/sys/fs/sysvbfs/bfs.c:1.13	Mon Jul 26 09:43:26 2010
+++ src/sys/fs/sysvbfs/bfs.c	Sat Mar 17 22:40:55 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bfs.c,v 1.13 2010/07/26 13:43:26 njoly Exp $	*/
+/*	$NetBSD: bfs.c,v 1.14 2012/03/18 02:40:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: bfs.c,v 1.13 2010/07/26 13:43:26 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bfs.c,v 1.14 2012/03/18 02:40:55 christos Exp $");
 #define	BFS_DEBUG
 
 #include <sys/param.h>
@@ -57,6 +57,7 @@ MALLOC_JUSTDEFINE(M_BFS, "sysvbfs core",
 #define	__FREE(a, s, t)		free(a)
 #endif
 #include <fs/sysvbfs/bfs.h>
+#include <fs/sysvbfs/sysvbfs.h>
 
 #ifdef BFS_DEBUG
 #define	DPRINTF(on, fmt, args...)	if (on) printf(fmt, ##args)
@@ -506,6 +507,21 @@ bfs_file_lookup(const struct bfs *bfs, c
 	return true;
 }
 
+void
+bfs_file_setsize(struct vnode *v, size_t size)
+{
+	struct sysvbfs_node *bnode = v->v_data;
+	struct bfs_inode *inode = bnode->inode;
+
+	bnode->size = size;
+	uvm_vnp_setsize(v, bnode->size);
+	inode->end_sector = bnode->data_block +
+	    (ROUND_SECTOR(bnode->size) >> DEV_BSHIFT) - 1;
+	inode->eof_offset_byte = bnode->data_block * DEV_BSIZE +
+	    bnode->size - 1;
+	bnode->update_mtime = true;
+}
+
 bool
 bfs_dirent_lookup_by_inode(const struct bfs *bfs, int inode,
     struct bfs_dirent **dirent)

Index: src/sys/fs/sysvbfs/bfs.h
diff -u src/sys/fs/sysvbfs/bfs.h:1.5 src/sys/fs/sysvbfs/bfs.h:1.6
--- src/sys/fs/sysvbfs/bfs.h:1.5	Mon Apr 28 16:24:02 2008
+++ src/sys/fs/sysvbfs/bfs.h	Sat Mar 17 22:40:55 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bfs.h,v 1.5 2008/04/28 20:24:02 martin Exp $	*/
+/*	$NetBSD: bfs.h,v 1.6 2012/03/18 02:40:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -142,6 +142,8 @@ struct sector_io_ops {
 	bool (*write_n)(void *, uint8_t *, daddr_t, int);
 };
 
+struct vnode;
+
 int bfs_init2(struct bfs **, int, struct sector_io_ops *, bool);
 void bfs_fini(struct bfs *);
 int bfs_file_read(const struct bfs *, const char *, void *, size_t, size_t *);
@@ -153,10 +155,11 @@ int bfs_file_rename(struct bfs *, const 
 bool bfs_file_lookup(const struct bfs *, const char *, int *, int *,
     size_t *);
 size_t bfs_file_size(const struct bfs_inode *);
+void bfs_file_setsize(struct vnode *, size_t);
+
 bool bfs_dump(const struct bfs *);
 
 /* filesystem ops */
-struct vnode;
 int sysvbfs_bfs_init(struct bfs **, struct vnode *);
 void sysvbfs_bfs_fini(struct bfs *);
 bool bfs_inode_lookup(const struct bfs *, ino_t, struct bfs_inode **);

Index: src/sys/fs/sysvbfs/sysvbfs_vnops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.41 src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.42
--- src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.41	Tue Mar 13 14:40:50 2012
+++ src/sys/fs/sysvbfs/sysvbfs_vnops.c	Sat Mar 17 22:40:55 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vnops.c,v 1.41 2012/03/13 18:40:50 elad Exp $	*/
+/*	$NetBSD: sysvbfs_vnops.c,v 1.42 2012/03/18 02:40:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.41 2012/03/13 18:40:50 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.42 2012/03/18 02:40:55 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -359,11 +359,28 @@ sysvbfs_setattr(void *arg)
 		attr->gid = gid;
 	}
 
+	if (vap->va_size != VNOVAL)
+		switch (vp->v_type) {
+		case VDIR:
+			return EISDIR;
+		case VCHR:
+		case VBLK:
+		case VFIFO:
+			break;
+		case VREG:
+			if (vp->v_mount->mnt_flag & MNT_RDONLY)
+				return EROFS;
+			bfs_file_setsize(vp, vap->va_size);
+			break;
+		default:
+			return EOPNOTSUPP;
+		}
+
 	if (vap->va_mode != (mode_t)VNOVAL) {
 		mode_t mode = vap->va_mode;
 		error = kauth_authorize_vnode(cred, KAUTH_VNODE_WRITE_SECURITY,
-		    vp, NULL, genfs_can_chmod(vp->v_type, cred, attr->uid, attr->gid,
-		    mode));
+		    vp, NULL, genfs_can_chmod(vp->v_type, cred, attr->uid,
+		    attr->gid, mode));
 		if (error)
 			return error;
 		attr->mode = mode;
@@ -373,7 +390,8 @@ sysvbfs_setattr(void *arg)
 	    (vap->va_mtime.tv_sec != VNOVAL) ||
 	    (vap->va_ctime.tv_sec != VNOVAL)) {
 		error = kauth_authorize_vnode(cred, KAUTH_VNODE_WRITE_TIMES, vp,
-		    NULL, genfs_can_chtimes(vp, vap->va_vaflags, attr->uid, cred));
+		    NULL, genfs_can_chtimes(vp, vap->va_vaflags, attr->uid,
+		    cred));
 		if (error)
 			return error;
 
@@ -444,7 +462,6 @@ sysvbfs_write(void *arg)
 	struct uio *uio = a->a_uio;
 	int advice = IO_ADV_DECODE(a->a_ioflag);
 	struct sysvbfs_node *bnode = v->v_data;
-	struct bfs_inode *inode = bnode->inode;
 	bool extended = false;
 	vsize_t sz;
 	int err = 0;
@@ -459,8 +476,7 @@ sysvbfs_write(void *arg)
 		return 0;
 
 	if (bnode->size < uio->uio_offset + uio->uio_resid) {
-		bnode->size = uio->uio_offset + uio->uio_resid;
-		uvm_vnp_setsize(v, bnode->size);
+		bfs_file_setsize(v, uio->uio_offset + uio->uio_resid);
 		extended = true;
 	}
 
@@ -472,11 +488,8 @@ sysvbfs_write(void *arg)
 			break;
 		DPRINTF("%s: write %ldbyte\n", __func__, sz);
 	}
-	inode->end_sector = bnode->data_block +
-	    (ROUND_SECTOR(bnode->size) >> DEV_BSHIFT) - 1;
-	inode->eof_offset_byte = bnode->data_block * DEV_BSIZE +
-	    bnode->size - 1;
-	bnode->update_mtime = true;
+	if (err)
+		bfs_file_setsize(v, bnode->size - uio->uio_resid);
 
 	VN_KNOTE(v, NOTE_WRITE | (extended ? NOTE_EXTEND : 0));
 

Reply via email to