kernel: Fix compilation on patched 2.6.18 (fc6) and 2.6.9
authorMiklos Szeredi <miklos@szeredi.hu>
Fri, 13 Oct 2006 09:54:24 +0000 (09:54 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Fri, 13 Oct 2006 09:54:24 +0000 (09:54 +0000)
ChangeLog
kernel/configure.ac
kernel/control.c
kernel/dev.c
kernel/dir.c
kernel/file.c
kernel/fuse_i.h
kernel/inode.c

index fd82cfd5051a3980816a8a55fa683314dab2ee20..822cff9b7ddb7ca2f056b9a71cf4f10f9522fb72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-10-13  Miklos Szeredi <miklos@szeredi.hu>
+
+       * kernel: Fix compilation on patched 2.6.18 (fc6) and 2.6.9.
+       Report from David Shaw
+
 2006-10-10  Miklos Szeredi <miklos@szeredi.hu>
 
        * kernel: Check for signature of super_operations->umount_begin().
index 29e6ee30fb9c950e04ef379f30f2417ad523f69c..bf4c8cdb9d8da3fe79eb78efe88df5ca0c1cd6ef 100644 (file)
@@ -149,6 +149,14 @@ if test "$ENABLE_FUSE_MODULE" = y; then
                AC_MSG_RESULT([no])
        fi
 
+       AC_MSG_CHECKING([whether lookup_instantiate_filp is defined])
+       if test -f $kernelsrc/include/linux/namei.h && egrep -q "lookup_instantiate_filp" $kernelsrc/include/linux/namei.h; then
+               AC_DEFINE(HAVE_LOOKUP_INSTANTIATE_FILP, 1, [lookup_instantiate_filp() is defined])
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+       fi
+
        AC_MSG_CHECKING([if umount_begin is passed a vfsmount])
        if egrep -q "\(\*umount_begin\) *\(struct vfsmount \*" $kernelsrc/include/linux/fs.h; then
                AC_DEFINE(UMOUNT_BEGIN_VFSMOUNT, 1, [umount_begin is passed a vfsmount])
@@ -157,9 +165,16 @@ if test "$ENABLE_FUSE_MODULE" = y; then
                AC_MSG_RESULT([no])
        fi
 
-       AC_MSG_CHECKING([whether lookup_instantiate_filp is defined])
-       if test -f $kernelsrc/include/linux/namei.h && egrep -q "lookup_instantiate_filp" $kernelsrc/include/linux/namei.h; then
-               AC_DEFINE(HAVE_LOOKUP_INSTANTIATE_FILP, 1, [lookup_instantiate_filp() is defined])
+       AC_MSG_CHECKING([if inode has i_blksize field])
+       if egrep -qw "i_blksize" $kernelsrc/include/linux/fs.h; then
+               AC_DEFINE(HAVE_I_BLKSIZE, 1, [inode has i_blksize field])
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+       fi
+       AC_MSG_CHECKING([if inode has i_private field])
+       if egrep -qw "i_private" $kernelsrc/include/linux/fs.h; then
+               AC_DEFINE(HAVE_I_PRIVATE, 1, [inode has i_private field])
                AC_MSG_RESULT([yes])
        else
                AC_MSG_RESULT([no])
index 380630d84b1c4955ac38fc1762509513469a12bf..24e8fa459132638f121a0a5f02b3cfe5ef17431f 100644 (file)
@@ -12,6 +12,9 @@
 #include <linux/module.h>
 
 #define FUSE_CTL_SUPER_MAGIC 0x65735543
+#ifndef HAVE_I_PRIVATE
+#define i_private u.generic_ip
+#endif
 
 /*
  * This is non-NULL when the single instance of the control filesystem
@@ -23,7 +26,7 @@ static struct fuse_conn *fuse_ctl_file_conn_get(struct file *file)
 {
        struct fuse_conn *fc;
        mutex_lock(&fuse_mutex);
-       fc = file->f_dentry->d_inode->u.generic_ip;
+       fc = file->f_dentry->d_inode->i_private;
        if (fc)
                fc = fuse_conn_get(fc);
        mutex_unlock(&fuse_mutex);
@@ -114,7 +117,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
                inode->i_op = iop;
        inode->i_fop = fop;
        inode->i_nlink = nlink;
-       inode->u.generic_ip = fc;
+       inode->i_private = fc;
        d_add(dentry, inode);
        return dentry;
 }
@@ -132,7 +135,7 @@ int fuse_ctl_add_conn(struct fuse_conn *fc)
                return 0;
 
        parent = fuse_control_sb->s_root;
-       parent->d_inode->i_nlink++;
+       inc_nlink(parent->d_inode);
        sprintf(name, "%llu", (unsigned long long) fc->id);
        parent = fuse_ctl_add_dentry(parent, fc, name, S_IFDIR | 0500, 2,
                                     &simple_dir_inode_operations,
@@ -166,7 +169,7 @@ void fuse_ctl_remove_conn(struct fuse_conn *fc)
 
        for (i = fc->ctl_ndents - 1; i >= 0; i--) {
                struct dentry *dentry = fc->ctl_dentry[i];
-               dentry->d_inode->u.generic_ip = NULL;
+               dentry->d_inode->i_private = NULL;
                d_drop(dentry);
                dput(dentry);
        }
index d7e5e553f69ef6a2949542da76f164f1a6d146bc..c96d0cc8e6b34f4d40fb8d8a225856170d0ae1b3 100644 (file)
@@ -772,6 +772,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov,
        return err;
 }
 
+#ifndef KERNEL_2_6_19_PLUS
 static ssize_t fuse_dev_read(struct file *file, char __user *buf,
                             size_t nbytes, loff_t *off)
 {
@@ -780,6 +781,13 @@ static ssize_t fuse_dev_read(struct file *file, char __user *buf,
        iov.iov_base = buf;
        return fuse_dev_readv(file, &iov, 1, off);
 }
+#else
+static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
+                            unsigned long nr_segs, loff_t pos)
+{
+       return fuse_dev_readv(iocb->ki_filp, iov, nr_segs, &pos);
+}
+#endif
 
 /* Look up request on processing list by unique ID */
 static struct fuse_req *request_find(struct fuse_conn *fc, u64 unique)
@@ -909,6 +917,7 @@ static ssize_t fuse_dev_writev(struct file *file, const struct iovec *iov,
        return err;
 }
 
+#ifndef KERNEL_2_6_19_PLUS
 static ssize_t fuse_dev_write(struct file *file, const char __user *buf,
                              size_t nbytes, loff_t *off)
 {
@@ -917,6 +926,13 @@ static ssize_t fuse_dev_write(struct file *file, const char __user *buf,
        iov.iov_base = (char __user *) buf;
        return fuse_dev_writev(file, &iov, 1, off);
 }
+#else
+static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov,
+                             unsigned long nr_segs, loff_t pos)
+{
+       return fuse_dev_writev(iocb->ki_filp, iov, nr_segs, &pos);
+}
+#endif
 
 static unsigned fuse_dev_poll(struct file *file, poll_table *wait)
 {
@@ -1052,10 +1068,17 @@ static int fuse_dev_fasync(int fd, struct file *file, int on)
 struct file_operations fuse_dev_operations = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
+#ifndef KERNEL_2_6_19_PLUS
        .read           = fuse_dev_read,
        .readv          = fuse_dev_readv,
        .write          = fuse_dev_write,
        .writev         = fuse_dev_writev,
+#else
+       .read           = do_sync_read,
+       .aio_read       = fuse_dev_read,
+       .write          = do_sync_write,
+       .aio_write      = fuse_dev_write,
+#endif
        .poll           = fuse_dev_poll,
        .release        = fuse_dev_release,
        .fasync         = fuse_dev_fasync,
index c2f7d4e62d1d1995041d9f673e04e05feae867a5..3f12e19c4f5b47d1d6eb453396396f2f671c3092 100644 (file)
@@ -529,7 +529,7 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry)
                /* Set nlink to zero so the inode can be cleared, if
                    the inode does have more links this will be
                    discovered at the next lookup/getattr */
-               inode->i_nlink = 0;
+               clear_nlink(inode);
                fuse_invalidate_attr(inode);
                fuse_invalidate_attr(dir);
                fuse_invalidate_entry_cache(entry);
@@ -555,7 +555,7 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry)
        err = req->out.h.error;
        fuse_put_request(fc, req);
        if (!err) {
-               entry->d_inode->i_nlink = 0;
+               clear_nlink(entry->d_inode);
                fuse_invalidate_attr(dir);
                fuse_invalidate_entry_cache(entry);
        } else if (err == -EINTR)
@@ -815,7 +815,10 @@ static int fuse_permission(struct inode *inode, int mask, struct nameidata *nd)
                if ((mask & MAY_EXEC) && !S_ISDIR(mode) && !(mode & S_IXUGO))
                        return -EACCES;
 
-               if (nd && (nd->flags & LOOKUP_ACCESS))
+#ifndef LOOKUP_CHDIR
+#define LOOKUP_CHDIR 0
+#endif
+               if (nd && (nd->flags & (LOOKUP_ACCESS | LOOKUP_CHDIR)))
                        return fuse_access(inode, mask);
                return 0;
        }
@@ -1078,6 +1081,8 @@ static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
        struct inode *inode = entry->d_inode;
        int err = fuse_revalidate(entry);
        if (!err)
+               /* FIXME: may want specialized function because of
+                  st_blksize on block devices on 2.6.19+ */
                generic_fillattr(inode, stat);
 
        return err;
index fb381da9b72841ee9e8b7b3aa4097db349cde4e1..b9d86edec1fcdb106a762d73d7cce2c5bd667111 100644 (file)
@@ -843,8 +843,15 @@ static sector_t fuse_bmap(struct address_space *mapping, sector_t block)
 
 static struct file_operations fuse_file_operations = {
        .llseek         = generic_file_llseek,
+#ifndef KERNEL_2_6_19_PLUS
        .read           = generic_file_read,
        .write          = generic_file_write,
+#else
+       .read           = do_sync_read,
+       .aio_read       = generic_file_aio_read,
+       .write          = do_sync_write,
+       .aio_write      = generic_file_aio_write,
+#endif
        .mmap           = fuse_file_mmap,
        .open           = fuse_open,
        .flush          = fuse_flush,
index 9be2de164e6d4074008507bcd060275f3dbf8a52..22f75149c598fadffb0ec8b066b70b61e4ff10b4 100644 (file)
@@ -38,6 +38,9 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
 #  define KERNEL_2_6_18_PLUS
 #endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+#  define KERNEL_2_6_19_PLUS
+#endif
 
 #ifdef __arm__
 #define DCACHE_BUG
 #define mutex_unlock(m) up(m)
 #define mutex semaphore
 #endif
+#ifndef KERNEL_2_6_19_PLUS
+#define clear_nlink(inode) (inode)->i_nlink = 0
+#define inc_nlink(inode) (inode)->i_nlink++
+#endif
 
 #ifndef BUG_ON
 #define BUG_ON(x)
index aada038cac3794ecbf2bd541cd4e36e5753be70b..e3f98dbb6e47fd4304b64b926e52f7351d980c04 100644 (file)
@@ -134,7 +134,9 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
        inode->i_uid     = attr->uid;
        inode->i_gid     = attr->gid;
        i_size_write(inode, attr->size);
+#ifdef HAVE_I_BLKSIZE
        inode->i_blksize = PAGE_CACHE_SIZE;
+#endif
        inode->i_blocks  = attr->blocks;
        inode->i_atime.tv_sec   = attr->atime;
        inode->i_atime.tv_nsec  = attr->atimensec;