]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] 2.5.4-pre1: further llseek cleanup (1/3)
authorRobert Love <rml@tech9.net>
Wed, 6 Feb 2002 02:46:40 +0000 (18:46 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Wed, 6 Feb 2002 02:46:40 +0000 (18:46 -0800)
This is the first of three patches implementing further llseek cleanup,
against 2.5.4-pre1.

The 'push locking into llseek methods' patch was integrated into 2.5.3.
The networking filesystems, however, do not protect i_size and can not
rely on the inode semaphore used in generic_file_llseek.

This patch implements a remote_llseek method, which is basically the
pre-2.5.3 version of generic_file_llseek.  Locking is done via the BKL.
When we have a saner locking system in place, we can push it into this
function in lieu.

Ncpfs, nfs, and smbfs have been converted to use this new llseek.

Note this is updated over the previous posted patch.

Robert Love

fs/ncpfs/file.c
fs/nfs/file.c
fs/read_write.c
fs/smbfs/file.c
include/linux/fs.h
kernel/ksyms.c

index 1f70ec451ce709b91eebf3aa5550e9dbdb06684e..fbd2c3137dd407464359a704fdcea93ab4c6603e 100644 (file)
@@ -281,7 +281,7 @@ static int ncp_release(struct inode *inode, struct file *file) {
 
 struct file_operations ncp_file_operations =
 {
-       llseek:         generic_file_llseek,
+       llseek:         remote_llseek,
        read:           ncp_file_read,
        write:          ncp_file_write,
        ioctl:          ncp_ioctl,
index 1d5e7dbde28af3e137dc661590ca7c61aca52fa4..d25cb49689319bdfaeb735d68c309cda99e21ddb 100644 (file)
@@ -41,7 +41,7 @@ static int  nfs_file_flush(struct file *);
 static int  nfs_fsync(struct file *, struct dentry *dentry, int datasync);
 
 struct file_operations nfs_file_operations = {
-       llseek:         generic_file_llseek,
+       llseek:         remote_llseek,
        read:           nfs_file_read,
        write:          nfs_file_write,
        mmap:           nfs_file_mmap,
index 31cee2a6aa4ec6a312f958c61b8bb806e7d4a493..ce52306695799043243e268950cbf7a46d84c024 100644 (file)
@@ -51,6 +51,31 @@ loff_t generic_file_llseek(struct file *file, loff_t offset, int origin)
        return retval;
 }
 
+loff_t remote_llseek(struct file *file, loff_t offset, int origin)
+{
+       long long retval;
+
+       lock_kernel();
+       switch (origin) {
+               case 2:
+                       offset += file->f_dentry->d_inode->i_size;
+                       break;
+               case 1:
+                       offset += file->f_pos;
+       }
+       retval = -EINVAL;
+       if (offset>=0 && offset<=file->f_dentry->d_inode->i_sb->s_maxbytes) {
+               if (offset != file->f_pos) {
+                       file->f_pos = offset;
+                       file->f_reada = 0;
+                       file->f_version = ++event;
+               }
+               retval = offset;
+       }
+       unlock_kernel();
+       return retval;
+}
+
 loff_t no_llseek(struct file *file, loff_t offset, int origin)
 {
        return -ESPIPE;
index b3feaa56924aa15bd96c3a23305e8ee840fdcefa..39badd71692f9a903cf66030040d9b3c1fc1e3ba 100644 (file)
@@ -381,7 +381,7 @@ smb_file_permission(struct inode *inode, int mask)
 
 struct file_operations smb_file_operations =
 {
-       llseek:         generic_file_llseek,
+       llseek:         remote_llseek,
        read:           smb_file_read,
        write:          smb_file_write,
        ioctl:          smb_ioctl,
index 461566f52c165ea5931e84550c7c634475bae2bd..f4699a15157d42b9c4f36a9ed263ead0445853c5 100644 (file)
@@ -1461,6 +1461,7 @@ extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *)
 extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t);
 extern loff_t no_llseek(struct file *file, loff_t offset, int origin);
 extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin);
+extern loff_t remote_llseek(struct file *file, loff_t offset, int origin);
 extern ssize_t generic_read_dir(struct file *, char *, size_t, loff_t *);
 extern int generic_file_open(struct inode * inode, struct file * filp);
 
index c271a8e6f6fc6ab4ade83631716e1044c5565a3a..73db2a0b267899a1c9ae2c8ff188e305aaf1bf9b 100644 (file)
@@ -251,6 +251,7 @@ EXPORT_SYMBOL(vfs_rename);
 EXPORT_SYMBOL(vfs_statfs);
 EXPORT_SYMBOL(generic_read_dir);
 EXPORT_SYMBOL(generic_file_llseek);
+EXPORT_SYMBOL(remote_llseek);
 EXPORT_SYMBOL(no_llseek);
 EXPORT_SYMBOL(__pollwait);
 EXPORT_SYMBOL(poll_freewait);