-EISDIR cleanup

Pavel Machek (pavel@Elf.mj.gts.cz)
Thu, 6 Nov 1997 10:35:59 +0100


Hi!

Nearly every linux filesystem defines its own version of xxx_dir_read,
which does only return -EISDIR. And those who do not, return wrong
error code on reading directory (-EINVAL).

I decided to clean this up, and to kill unnecessary code replication.

Here is patch against 2.1.62, its status is LOOKS NICE - my system is
too dirty to create tested patches, sorry. Please someone test this,
correct this, apply this. (In this order ;-)

Pavel

Index: fs/bad_inode.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/bad_inode.c,v
retrieving revision 1.1
diff -u -r1.1 bad_inode.c
--- bad_inode.c 1997/10/27 22:59:21 1.1
+++ bad_inode.c 1997/11/06 09:21:57
@@ -24,6 +24,11 @@
return -EIO;
}

+ssize_t return_EISDIR(void)
+{
+ return -EISDIR;
+}
+
#define EIO_ERROR ((void *) (return_EIO))

static struct file_operations bad_file_ops =
Index: fs/read_write.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/read_write.c,v
retrieving revision 1.6
diff -u -r1.6 read_write.c
--- read_write.c 1997/10/27 22:59:24 1.6
+++ read_write.c 1997/11/06 09:21:58
@@ -124,7 +124,6 @@
file = fget(fd);
if (!file)
goto bad_file;
- ret = -EBADF;
if (!(file->f_mode & FMODE_READ))
goto out;
ret = locks_verify_area(FLOCK_VERIFY_READ, file->f_dentry->d_inode,
Index: fs/affs/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/affs/dir.c,v
retrieving revision 1.5
diff -u -r1.5 dir.c
--- dir.c 1997/10/27 22:59:27 1.5
+++ dir.c 1997/11/06 09:21:58
@@ -24,12 +24,10 @@
#include <linux/amigaffs.h>

static int affs_readdir(struct file *, void *, filldir_t);
-static ssize_t affs_dir_read(struct file * filp, char * buf,
- size_t count, loff_t *ppos);

static struct file_operations affs_dir_operations = {
NULL, /* lseek - default */
- affs_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
affs_readdir, /* readdir */
NULL, /* poll - default */
@@ -61,12 +59,6 @@
NULL, /* truncate */
NULL /* permissions */
};
-
-static ssize_t
-affs_dir_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}

static int
affs_readdir(struct file *filp, void *dirent, filldir_t filldir)
Index: fs/ext2/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/ext2/dir.c,v
retrieving revision 1.6
diff -u -r1.6 dir.c
--- dir.c 1997/10/27 22:59:29 1.6
+++ dir.c 1997/11/06 09:21:59
@@ -26,17 +26,11 @@
#include <linux/sched.h>
#include <linux/stat.h>

-static ssize_t ext2_dir_read (struct file * filp, char * buf,
- size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
static int ext2_readdir(struct file *, void *, filldir_t);

static struct file_operations ext2_dir_operations = {
NULL, /* lseek - default */
- ext2_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
ext2_readdir, /* readdir */
NULL, /* poll - default */
Index: fs/fat/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/fat/dir.c,v
retrieving revision 1.4
diff -u -r1.4 dir.c
--- dir.c 1997/10/27 22:59:34 1.4
+++ dir.c 1997/11/06 09:21:59
@@ -31,15 +31,9 @@

#define PRINTK(X)

-static ssize_t fat_dir_read(struct file * filp, char * buf,
- size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
struct file_operations fat_dir_operations = {
NULL, /* lseek - default */
- fat_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
fat_readdir, /* readdir */
NULL, /* select v2.0.x/poll v2.1.x - default */
Index: fs/hpfs/hpfs_fs.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/hpfs/hpfs_fs.c,v
retrieving revision 1.6
diff -u -r1.6 hpfs_fs.c
--- hpfs_fs.c 1997/10/27 22:59:37 1.6
+++ hpfs_fs.c 1997/11/06 09:21:59
@@ -187,8 +187,6 @@

/* directory ops */

-static ssize_t hpfs_dir_read(struct file *filp, char *buf,
- size_t count, loff_t *ppos);
static int hpfs_readdir(struct file *filp,
void *dirent, filldir_t filldir);
static int hpfs_lookup(struct inode *, struct dentry *);
@@ -196,7 +194,7 @@
static const struct file_operations hpfs_dir_ops =
{
NULL, /* lseek - default */
- hpfs_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
hpfs_readdir, /* readdir */
NULL, /* poll - default */
@@ -1579,12 +1577,6 @@
return 0;
}

-static ssize_t hpfs_dir_read(struct file *filp, char *buf,
- size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
/* Return the dnode pointer in a directory fnode */

static dnode_secno fnode_dno(kdev_t dev, ino_t ino)
Index: fs/isofs/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/isofs/dir.c,v
retrieving revision 1.5
diff -u -r1.5 dir.c
--- dir.c 1997/10/27 22:59:39 1.5
+++ dir.c 1997/11/06 09:22:00
@@ -20,6 +20,7 @@
#include <linux/malloc.h>
#include <linux/sched.h>
#include <linux/locks.h>
+#include <linux/config.h>

#include <asm/uaccess.h>

@@ -28,7 +29,7 @@
static struct file_operations isofs_dir_operations =
{
NULL, /* lseek - default */
- NULL, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
isofs_readdir, /* readdir */
NULL, /* poll - default */
Index: fs/minix/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/minix/dir.c,v
retrieving revision 1.6
diff -u -r1.6 dir.c
--- dir.c 1997/10/27 22:59:40 1.6
+++ dir.c 1997/11/06 09:22:00
@@ -14,17 +14,11 @@

#include <asm/uaccess.h>

-static ssize_t minix_dir_read(struct file * filp, char * buf,
- size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
static int minix_readdir(struct file *, void *, filldir_t);

static struct file_operations minix_dir_operations = {
NULL, /* lseek - default */
- minix_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
minix_readdir, /* readdir */
NULL, /* poll - default */
Index: fs/ncpfs/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/ncpfs/dir.c,v
retrieving revision 1.4
diff -u -r1.4 dir.c
--- dir.c 1997/10/26 18:43:19 1.4
+++ dir.c 1997/11/06 09:22:01
@@ -104,7 +104,7 @@
static struct file_operations ncp_dir_operations =
{
NULL, /* lseek - default */
- ncp_dir_read, /* read - bad */
+ EISDIR_ERROR, /* read - bad */
NULL, /* write - bad */
ncp_readdir, /* readdir */
NULL, /* poll - default */
@@ -181,11 +181,6 @@
while (this != root);

return NULL;
-}
-
-static long ncp_dir_read(struct inode *inode, struct file *filp, char *buf, unsigned long count)
-{
- return -EISDIR;
}

static kdev_t c_dev = 0;
Index: fs/smbfs/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/smbfs/dir.c,v
retrieving revision 1.7
diff -u -r1.7 dir.c
--- dir.c 1997/10/27 22:59:55 1.7
+++ dir.c 1997/11/06 09:22:03
@@ -38,7 +31,7 @@
static struct file_operations smb_dir_operations =
{
NULL, /* lseek - default */
- smb_dir_read, /* read - bad */
+ EISDIR_ERROR, /* read - bad */
NULL, /* write - bad */
smb_readdir, /* readdir */
NULL, /* poll - default */
@@ -71,12 +64,6 @@
NULL /* smap */
};

-static ssize_t
-smb_dir_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
/*
* Compute the hash for a qstr.
* N.B. Move to include/linux/dcache.h?
Index: fs/sysv/dir.c
===================================================================
RCS file: /home/pavel/cvsroot/linux/fs/sysv/dir.c,v
retrieving revision 1.5
diff -u -r1.5 dir.c
--- dir.c 1997/10/27 22:59:56 1.5
+++ dir.c 1997/11/06 09:22:05
@@ -21,17 +21,11 @@

#include <asm/uaccess.h>

-static ssize_t sysv_dir_read(struct file * filp, char * buf,
- size_t count, loff_t *ppos)
-{
- return -EISDIR;
-}
-
static int sysv_readdir(struct file *, void *, filldir_t);

static struct file_operations sysv_dir_operations = {
NULL, /* lseek - default */
- sysv_dir_read, /* read */
+ EISDIR_ERROR, /* read */
NULL, /* write - bad */
sysv_readdir, /* readdir */
NULL, /* poll - default */
Index: fs.h
===================================================================
RCS file: /home/pavel/cvsroot/linux/include/linux/fs.h,v
retrieving revision 1.16
diff -u -r1.16 fs.h
--- fs.h 1997/10/27 23:00:01 1.16
+++ fs.h 1997/11/06 09:28:34
@@ -807,6 +807,11 @@
extern void inode_setattr(struct inode *, struct iattr *);
extern int notify_change(struct inode * inode, struct iattr * attr);

+/* This was common to many filesystems, thus moved here (pavel@atrey) */
+
+extern ssize_t return_EISDIR(void);
+#define EISDIR_ERROR ((void *) return_EISDIR)
+
/* kludge to get SCSI modules working */
#include <linux/minix_fs.h>
#include <linux/minix_fs_sb.h>

-- 
I'm really pavel@atrey.karlin.mff.cuni.cz. 	   Pavel
Look at http://atrey.karlin.mff.cuni.cz/~pavel/ ;-).