File: /usr/src/linux/fs/ufs/file.c

1     /*
2      *  linux/fs/ufs/file.c
3      *
4      * Copyright (C) 1998
5      * Daniel Pirkl <daniel.pirkl@email.cz>
6      * Charles University, Faculty of Mathematics and Physics
7      *
8      *  from
9      *
10      *  linux/fs/ext2/file.c
11      *
12      * Copyright (C) 1992, 1993, 1994, 1995
13      * Remy Card (card@masi.ibp.fr)
14      * Laboratoire MASI - Institut Blaise Pascal
15      * Universite Pierre et Marie Curie (Paris VI)
16      *
17      *  from
18      *
19      *  linux/fs/minix/file.c
20      *
21      *  Copyright (C) 1991, 1992  Linus Torvalds
22      *
23      *  ext2 fs regular file handling primitives
24      */
25     
26     #include <asm/uaccess.h>
27     #include <asm/system.h>
28     
29     #include <linux/errno.h>
30     #include <linux/fs.h>
31     #include <linux/ufs_fs.h>
32     #include <linux/fcntl.h>
33     #include <linux/sched.h>
34     #include <linux/stat.h>
35     #include <linux/locks.h>
36     #include <linux/mm.h>
37     #include <linux/pagemap.h>
38     
39     /*
40      * Make sure the offset never goes beyond the 32-bit mark..
41      */
42     static long long ufs_file_lseek(
43     	struct file *file,
44     	long long offset,
45     	int origin )
46     {
47     	long long retval;
48     	struct inode *inode = file->f_dentry->d_inode;
49     
50     	switch (origin) {
51     		case 2:
52     			offset += inode->i_size;
53     			break;
54     		case 1:
55     			offset += file->f_pos;
56     	}
57     	retval = -EINVAL;
58     	/* make sure the offset fits in 32 bits */
59     	if (((unsigned long long) offset >> 32) == 0) {
60     		if (offset != file->f_pos) {
61     			file->f_pos = offset;
62     			file->f_reada = 0;
63     			file->f_version = ++event;
64     		}
65     		retval = offset;
66     	}
67     	return retval;
68     }
69     
70     /*
71      * We have mostly NULL's here: the current defaults are ok for
72      * the ufs filesystem.
73      */
74      
75     struct file_operations ufs_file_operations = {
76     	llseek:		ufs_file_lseek,
77     	read:		generic_file_read,
78     	write:		generic_file_write,
79     	mmap:		generic_file_mmap,
80     	open:           generic_file_open,
81     };
82     
83     struct inode_operations ufs_file_inode_operations = {
84     	truncate:	ufs_truncate,
85     };
86