s390/hypfs: Eliminate hypfs interval
authorMichael Holzheu <holzheu@linux.vnet.ibm.com>
Mon, 9 Feb 2015 13:49:32 +0000 (14:49 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 10 Feb 2015 15:39:02 +0000 (16:39 +0100)
Currently the binary hypfs interfaces provides new data only once within
an interval time of one second. This patch removes this restriction and
now new data is returned immediately on every read on a hypfs binary file.

This is done in order to allow more consistent snapshots for programs
that read multiple hypfs binary files.

Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/hypfs/hypfs.h
arch/s390/hypfs/hypfs_dbfs.c

index 36d093fa9fb30b4fd3615130028b16af6e5920af..eecde500ed49e2726cc2ed8d0b20e37459075217 100644 (file)
@@ -53,7 +53,6 @@ struct hypfs_dbfs_data {
        void                    *buf_free_ptr;
        size_t                  size;
        struct hypfs_dbfs_file  *dbfs_file;
-       struct kref             kref;
 };
 
 struct hypfs_dbfs_file {
@@ -65,8 +64,6 @@ struct hypfs_dbfs_file {
                                           unsigned long);
 
        /* Private data for hypfs_dbfs.c */
-       struct hypfs_dbfs_data  *data;
-       struct delayed_work     data_free_work;
        struct mutex            lock;
        struct dentry           *dentry;
 };
index 47fe1055c714a34c1348b3a734705a408aff081b..752f6df3e6974a823e9bcbdb044d3e5381d9bb4e 100644 (file)
@@ -17,33 +17,16 @@ static struct hypfs_dbfs_data *hypfs_dbfs_data_alloc(struct hypfs_dbfs_file *f)
        data = kmalloc(sizeof(*data), GFP_KERNEL);
        if (!data)
                return NULL;
-       kref_init(&data->kref);
        data->dbfs_file = f;
        return data;
 }
 
-static void hypfs_dbfs_data_free(struct kref *kref)
+static void hypfs_dbfs_data_free(struct hypfs_dbfs_data *data)
 {
-       struct hypfs_dbfs_data *data;
-
-       data = container_of(kref, struct hypfs_dbfs_data, kref);
        data->dbfs_file->data_free(data->buf_free_ptr);
        kfree(data);
 }
 
-static void data_free_delayed(struct work_struct *work)
-{
-       struct hypfs_dbfs_data *data;
-       struct hypfs_dbfs_file *df;
-
-       df = container_of(work, struct hypfs_dbfs_file, data_free_work.work);
-       mutex_lock(&df->lock);
-       data = df->data;
-       df->data = NULL;
-       mutex_unlock(&df->lock);
-       kref_put(&data->kref, hypfs_dbfs_data_free);
-}
-
 static ssize_t dbfs_read(struct file *file, char __user *buf,
                         size_t size, loff_t *ppos)
 {
@@ -56,28 +39,21 @@ static ssize_t dbfs_read(struct file *file, char __user *buf,
 
        df = file_inode(file)->i_private;
        mutex_lock(&df->lock);
-       if (!df->data) {
-               data = hypfs_dbfs_data_alloc(df);
-               if (!data) {
-                       mutex_unlock(&df->lock);
-                       return -ENOMEM;
-               }
-               rc = df->data_create(&data->buf, &data->buf_free_ptr,
-                                    &data->size);
-               if (rc) {
-                       mutex_unlock(&df->lock);
-                       kfree(data);
-                       return rc;
-               }
-               df->data = data;
-               schedule_delayed_work(&df->data_free_work, HZ);
+       data = hypfs_dbfs_data_alloc(df);
+       if (!data) {
+               mutex_unlock(&df->lock);
+               return -ENOMEM;
+       }
+       rc = df->data_create(&data->buf, &data->buf_free_ptr, &data->size);
+       if (rc) {
+               mutex_unlock(&df->lock);
+               kfree(data);
+               return rc;
        }
-       data = df->data;
-       kref_get(&data->kref);
        mutex_unlock(&df->lock);
 
        rc = simple_read_from_buffer(buf, size, ppos, data->buf, data->size);
-       kref_put(&data->kref, hypfs_dbfs_data_free);
+       hypfs_dbfs_data_free(data);
        return rc;
 }
 
@@ -108,7 +84,6 @@ int hypfs_dbfs_create_file(struct hypfs_dbfs_file *df)
        if (IS_ERR(df->dentry))
                return PTR_ERR(df->dentry);
        mutex_init(&df->lock);
-       INIT_DELAYED_WORK(&df->data_free_work, data_free_delayed);
        return 0;
 }