yaffs: Change yaffs_sync_object prototype for new 2.6.35 VFS interface
[yaffs2.git] / yaffs_fs.c
index 07ff66e13e9c965b842b47459df59d2d27dca369..662562fda537cdfe58a0fd72a99097446d154272 100644 (file)
@@ -202,8 +202,12 @@ static int yaffs_file_flush(struct file *file, fl_owner_t id);
 static int yaffs_file_flush(struct file *file);
 #endif
 
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
+static int yaffs_sync_object(struct file *file, int datasync);
+#else
 static int yaffs_sync_object(struct file *file, struct dentry *dentry,
                                int datasync);
+#endif
 
 static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
 
@@ -264,6 +268,15 @@ static int yaffs_writepage(struct page *page, struct writeback_control *wbc);
 static int yaffs_writepage(struct page *page);
 #endif
 
+#ifdef CONFIG_YAFFS_XATTR
+int yaffs_setxattr(struct dentry *dentry, const char *name,
+                       const void *value, size_t size, int flags);
+ssize_t yaffs_getxattr(struct dentry *dentry, const char *name, void *buff,
+                       size_t size);
+int yaffs_removexattr(struct dentry *dentry, const char *name);
+ssize_t yaffs_listxattr(struct dentry *dentry, char *buff, size_t size);
+#endif
+
 
 #if (YAFFS_USE_WRITE_BEGIN_END != 0)
 static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
@@ -355,12 +368,24 @@ static void zero_user_segment(struct page *page, unsigned start, unsigned end)
 
 static const struct inode_operations yaffs_file_inode_operations = {
        .setattr = yaffs_setattr,
+#ifdef CONFIG_YAFFS_XATTR
+       .setxattr = yaffs_setxattr,
+       .getxattr = yaffs_getxattr,
+       .listxattr = yaffs_listxattr,
+       .removexattr = yaffs_removexattr,
+#endif
 };
 
 static const struct inode_operations yaffs_symlink_inode_operations = {
        .readlink = yaffs_readlink,
        .follow_link = yaffs_follow_link,
        .setattr = yaffs_setattr,
+#ifdef CONFIG_YAFFS_XATTR
+       .setxattr = yaffs_setxattr,
+       .getxattr = yaffs_getxattr,
+       .listxattr = yaffs_listxattr,
+       .removexattr = yaffs_removexattr,
+#endif
 };
 
 static const struct inode_operations yaffs_dir_inode_operations = {
@@ -374,6 +399,12 @@ static const struct inode_operations yaffs_dir_inode_operations = {
        .mknod = yaffs_mknod,
        .rename = yaffs_rename,
        .setattr = yaffs_setattr,
+#ifdef CONFIG_YAFFS_XATTR
+       .setxattr = yaffs_setxattr,
+       .getxattr = yaffs_getxattr,
+       .listxattr = yaffs_listxattr,
+       .removexattr = yaffs_removexattr,
+#endif
 };
 
 static const struct file_operations yaffs_dir_operations = {
@@ -1715,12 +1746,19 @@ static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
        return -ENOMEM;
 }
 
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
+static int yaffs_sync_object(struct file *file, int datasync)
+#else
 static int yaffs_sync_object(struct file *file, struct dentry *dentry,
                                int datasync)
+#endif
 {
 
        yaffs_Object *obj;
        yaffs_Device *dev;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
+       struct dentry *dentry = file->f_path.dentry;
+#endif
 
        obj = yaffs_DentryToObject(dentry);
 
@@ -1836,6 +1874,124 @@ static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
        return error;
 }
 
+#ifdef CONFIG_YAFFS_XATTR
+int yaffs_setxattr(struct dentry *dentry, const char *name,
+                       const void *value, size_t size, int flags)
+{
+       struct inode *inode = dentry->d_inode;
+       int error = 0;
+       yaffs_Device *dev;
+       yaffs_Object *obj = yaffs_InodeToObject(inode);
+
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_setxattr of object %d\n"),
+               obj->objectId));
+
+
+       if (error == 0) {
+               int result;
+               dev = obj->myDev;
+               yaffs_GrossLock(dev);
+               result = yaffs_SetXAttribute(obj, name, value, size, flags);
+               if(result == YAFFS_OK)
+                       error = 0;
+               else if(result < 0)
+                       error = result;
+               yaffs_GrossUnlock(dev);
+
+       }
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_setxattr done returning %d\n"),error));
+
+       return error;
+}
+
+
+ssize_t yaffs_getxattr(struct dentry *dentry, const char *name, void *buff,
+                       size_t size)
+{
+       struct inode *inode = dentry->d_inode;
+       int error = 0;
+       yaffs_Device *dev;
+       yaffs_Object *obj = yaffs_InodeToObject(inode);
+
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_getxattr of object %d\n"),
+               obj->objectId));
+
+
+       if (error == 0) {
+               dev = obj->myDev;
+               yaffs_GrossLock(dev);
+               error = yaffs_GetXAttribute(obj, name, buff, size);
+               yaffs_GrossUnlock(dev);
+
+       }
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_getxattr done returning %d\n"),error));
+
+       return error;
+}
+
+int yaffs_removexattr(struct dentry *dentry, const char *name)
+{
+       struct inode *inode = dentry->d_inode;
+       int error = 0;
+       yaffs_Device *dev;
+       yaffs_Object *obj = yaffs_InodeToObject(inode);
+
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_removexattr of object %d\n"),
+               obj->objectId));
+
+
+       if (error == 0) {
+               int result;
+               dev = obj->myDev;
+               yaffs_GrossLock(dev);
+               result = yaffs_RemoveXAttribute(obj, name);
+               if(result == YAFFS_OK)
+                       error = 0;
+               else if(result < 0)
+                       error = result;
+               yaffs_GrossUnlock(dev);
+
+       }
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_removexattr done returning %d\n"),error));
+
+       return error;
+}
+
+ssize_t yaffs_listxattr(struct dentry *dentry, char *buff, size_t size)
+{
+       struct inode *inode = dentry->d_inode;
+       int error = 0;
+       yaffs_Device *dev;
+       yaffs_Object *obj = yaffs_InodeToObject(inode);
+
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_listxattr of object %d\n"),
+               obj->objectId));
+
+
+       if (error == 0) {
+               int result;
+               dev = obj->myDev;
+               yaffs_GrossLock(dev);
+               error = yaffs_ListXAttributes(obj, buff, size);
+               yaffs_GrossUnlock(dev);
+
+       }
+       T(YAFFS_TRACE_OS,
+               (TSTR("yaffs_listxattr done returning %d\n"),error));
+
+       return error;
+}
+
+#endif
+
+
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf)
 {
@@ -2625,6 +2781,9 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion,
 
 #ifdef CONFIG_YAFFS_DISABLE_LAZY_LOAD
        param->disableLazyLoad = 1;
+#endif
+#ifdef CONFIG_YAFFS_XATTR
+       param->enableXattr = 1;
 #endif
        if(options.lazy_loading_overridden)
                param->disableLazyLoad = !options.lazy_loading_enabled;
@@ -2648,7 +2807,7 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion,
 #ifdef CONFIG_YAFFS_DISABLE_BLOCK_REFRESHING
        param->refreshPeriod = 0;
 #else
-       param->refreshPeriod = 100;
+       param->refreshPeriod = 500;
 #endif
 
        if(options.empty_lost_and_found_overridden)
@@ -3178,6 +3337,14 @@ static int __init init_yaffs_fs(void)
        T(YAFFS_TRACE_ALWAYS,
          (TSTR("yaffs built " __DATE__ " " __TIME__ " Installing. \n")));
 
+#ifdef CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED
+       T(YAFFS_TRACE_ALWAYS,
+         (TSTR(" \n\n\n\nYAFFS-WARNING CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED selected.\n\n\n\n")));
+#endif
+
+
+
+
        init_MUTEX(&yaffs_context_lock);
 
        /* Install the proc_fs entries */