yaffs Sort out some Linux multi-version compilation issues
[yaffs2.git] / yaffs_fs.c
index dfb5461d49f135825676e306edf36ffdb5799a73..dc00bd5abc8ef12ffd6e76b705c858b6a41afeaa 100644 (file)
@@ -35,6 +35,9 @@
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10))
 #define YAFFS_COMPILE_BACKGROUND
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6, 23))
+#define YAFFS_COMPILE_FREEZER
+#endif
 #endif
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
@@ -43,6 +46,7 @@
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
 #define YAFFS_USE_SETATTR_COPY
+#define YAFFS_USE_TRUNCATE_SETSIZE
 #endif
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
 #define YAFFS_HAS_EVICT_INODE
@@ -82,6 +86,8 @@
 #ifdef YAFFS_COMPILE_BACKGROUND
 #include <linux/kthread.h>
 #include <linux/delay.h>
+#endif
+#ifdef YAFFS_COMPILE_FREEZER
 #include <linux/freezer.h>
 #endif
 
 #define YPROC_ROOT  NULL
 #endif
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
+#define Y_INIT_TIMER(a)        init_timer(a)
+#else
+#define Y_INIT_TIMER(a)        init_timer_on_stack(a)
+#endif
+
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 #define WRITE_SIZE_STR "writesize"
 #define WRITE_SIZE(mtd) ((mtd)->writesize)
@@ -479,6 +491,18 @@ static  int yaffs_vfs_setattr(struct inode *inode, struct iattr *attr)
 
 }
 
+static  int yaffs_vfs_setsize(struct inode *inode, loff_t newsize)
+{
+#ifdef  YAFFS_USE_TRUNCATE_SETSIZE
+       truncate_setsize(inode,newsize);
+       return 0;
+#else
+       truncate_inode_pages(&inode->i_data,newsize);
+       return 0;
+#endif
+
+}
+
 static unsigned yaffs_gc_control_callback(yaffs_Device *dev)
 {
        return yaffs_gc_control;
@@ -858,6 +882,7 @@ static void yaffs_evict_inode( struct inode *inode)
        if (!inode->i_nlink && !is_bad_inode(inode))
                deleteme = 1;
        truncate_inode_pages(&inode->i_data,0);
+       end_writeback(inode);
 
        if(deleteme && obj){
                dev = obj->myDev;
@@ -865,7 +890,6 @@ static void yaffs_evict_inode( struct inode *inode)
                yaffs_DeleteObject(obj);
                yaffs_GrossUnlock(dev);
        }
-       end_writeback(inode);
        if (obj) {
                dev = obj->myDev;
                yaffs_GrossLock(dev);
@@ -1967,8 +1991,10 @@ static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
                if (!error){
                        error = yaffs_vfs_setattr(inode, attr);
                        T(YAFFS_TRACE_OS,(TSTR("inode_setattr called\n")));
-                       if (attr->ia_valid & ATTR_SIZE)
-                               truncate_inode_pages(&inode->i_data,attr->ia_size);
+                       if (attr->ia_valid & ATTR_SIZE){
+                               yaffs_vfs_setsize(inode,attr->ia_size);
+                               inode->i_blocks = (inode->i_size + 511) >> 9;
+                       }
                }
                dev = yaffs_InodeToObject(inode)->myDev;
                if (attr->ia_valid & ATTR_SIZE){
@@ -2034,9 +2060,8 @@ ssize_t yaffs_getxattr(struct dentry *dentry, const char *name, void *buff,
        yaffs_Object *obj = yaffs_InodeToObject(inode);
 
        T(YAFFS_TRACE_OS,
-               (TSTR("yaffs_getxattr of object %d\n"),
-               obj->objectId));
-
+               (TSTR("yaffs_getxattr \"%s\" from object %d\n"),
+               name, obj->objectId));
 
        if (error == 0) {
                dev = obj->myDev;
@@ -2300,8 +2325,9 @@ static int yaffs_BackgroundThread(void *data)
                (TSTR("yaffs_background starting for dev %p\n"),
                (void *)dev));
 
+#ifdef YAFFS_COMPILE_FREEZER
        set_freezable();
-
+#endif
        while(context->bgRunning){
                T(YAFFS_TRACE_BACKGROUND,
                        (TSTR("yaffs_background\n")));
@@ -2309,9 +2335,10 @@ static int yaffs_BackgroundThread(void *data)
                if(kthread_should_stop())
                        break;
 
+#ifdef YAFFS_COMPILE_FREEZER
                if(try_to_freeze())
                        continue;
-
+#endif
                yaffs_GrossLock(dev);
 
                now = jiffies;
@@ -2345,7 +2372,7 @@ static int yaffs_BackgroundThread(void *data)
                if(time_before(expires,now))
                        expires = now + HZ;
 
-               init_timer_on_stack(&timer);
+               Y_INIT_TIMER(&timer);
                timer.expires = expires+1;
                timer.data = (unsigned long) current;
                timer.function = yaffs_background_waker;