]> Pileus Git - ~andy/linux/blobdiff - fs/ceph/ioctl.c
Merge branch 'linus' into core/urgent
[~andy/linux] / fs / ceph / ioctl.c
index ef0b5f48e13ac77a75233a40634d000068c9a21c..3b256b50f7d8e5c75be483877f881a57b7bbfc88 100644 (file)
@@ -38,7 +38,7 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
 static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
 {
        struct inode *inode = file->f_dentry->d_inode;
-       struct inode *parent_inode = file->f_dentry->d_parent->d_inode;
+       struct inode *parent_inode;
        struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
        struct ceph_mds_request *req;
        struct ceph_ioctl_layout l;
@@ -87,7 +87,9 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
        req->r_args.setlayout.layout.fl_pg_preferred =
                cpu_to_le32(l.preferred_osd);
 
+       parent_inode = ceph_get_dentry_parent_inode(file->f_dentry);
        err = ceph_mdsc_do_request(mdsc, parent_inode, req);
+       iput(parent_inode);
        ceph_mdsc_put_request(req);
        return err;
 }
@@ -231,6 +233,14 @@ static long ceph_ioctl_lazyio(struct file *file)
        return 0;
 }
 
+static long ceph_ioctl_syncio(struct file *file)
+{
+       struct ceph_file_info *fi = file->private_data;
+
+       fi->flags |= CEPH_F_SYNC;
+       return 0;
+}
+
 long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        dout("ioctl file %p cmd %u arg %lu\n", file, cmd, arg);
@@ -249,6 +259,9 @@ long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
        case CEPH_IOC_LAZYIO:
                return ceph_ioctl_lazyio(file);
+
+       case CEPH_IOC_SYNCIO:
+               return ceph_ioctl_syncio(file);
        }
 
        return -ENOTTY;