]> Pileus Git - ~andy/linux/blobdiff - drivers/char/ps3flash.c
fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers
[~andy/linux] / drivers / char / ps3flash.c
index 85c004a518ee1d9196aebb28a75e5464fce6354b..d0c57c2e29094eb6caba946789295893d4befdbc 100644 (file)
@@ -101,12 +101,16 @@ static loff_t ps3flash_llseek(struct file *file, loff_t offset, int origin)
 
        mutex_lock(&file->f_mapping->host->i_mutex);
        switch (origin) {
+       case 0:
+               break;
        case 1:
                offset += file->f_pos;
                break;
        case 2:
                offset += dev->regions[dev->region_idx].size*dev->blk_size;
                break;
+       default:
+               offset = -1;
        }
        if (offset < 0) {
                res = -EINVAL;
@@ -305,9 +309,14 @@ static int ps3flash_flush(struct file *file, fl_owner_t id)
        return ps3flash_writeback(ps3flash_dev);
 }
 
-static int ps3flash_fsync(struct file *file, int datasync)
+static int ps3flash_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 {
-       return ps3flash_writeback(ps3flash_dev);
+       struct inode *inode = file->f_path.dentry->d_inode;
+       int err;
+       mutex_lock(&inode->i_mutex);
+       err = ps3flash_writeback(ps3flash_dev);
+       mutex_unlock(&inode->i_mutex);
+       return err;
 }
 
 static irqreturn_t ps3flash_interrupt(int irq, void *data)