ceph: add LAZYIO ioctl to mark a file description for lazy consistency
authorSage Weil <sage@newdream.net>
Fri, 16 Apr 2010 16:53:43 +0000 (09:53 -0700)
committerSage Weil <sage@newdream.net>
Mon, 2 Aug 2010 03:11:39 +0000 (20:11 -0700)
Allow an application to mark a file descriptor for lazy file consistency
semantics, allowing buffered reads and writes when multiple clients are
accessing the same file.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/ioctl.c
fs/ceph/ioctl.h

index d085f07756b42159c7c3b916b123bdeabbfc35b8..76e307d2aba16868c9b1e8136496d929e0cd971f 100644 (file)
@@ -143,6 +143,27 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
        return 0;
 }
 
+static long ceph_ioctl_lazyio(struct file *file)
+{
+       struct ceph_file_info *fi = file->private_data;
+       struct inode *inode = file->f_dentry->d_inode;
+       struct ceph_inode_info *ci = ceph_inode(inode);
+
+       if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) {
+               spin_lock(&inode->i_lock);
+               ci->i_nr_by_mode[fi->fmode]--;
+               fi->fmode |= CEPH_FILE_MODE_LAZY;
+               ci->i_nr_by_mode[fi->fmode]++;
+               spin_unlock(&inode->i_lock);
+               dout("ioctl_layzio: file %p marked lazy\n", file);
+
+               ceph_check_caps(ci, 0, NULL);
+       } else {
+               dout("ioctl_layzio: file %p already lazy\n", file);
+       }
+       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);
@@ -155,6 +176,9 @@ long ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
        case CEPH_IOC_GET_DATALOC:
                return ceph_ioctl_get_dataloc(file, (void __user *)arg);
+
+       case CEPH_IOC_LAZYIO:
+               return ceph_ioctl_lazyio(file);
        }
        return -ENOTTY;
 }
index 25e4f1a9d059dbf74e1dc10489ff93d74bc34924..88451a3b6857d14bc7b21f418bcd82e56e9fdc64 100644 (file)
@@ -37,4 +37,6 @@ struct ceph_ioctl_dataloc {
 #define CEPH_IOC_GET_DATALOC _IOWR(CEPH_IOCTL_MAGIC, 3,        \
                                   struct ceph_ioctl_dataloc)
 
+#define CEPH_IOC_LAZYIO _IO(CEPH_IOCTL_MAGIC, 4)
+
 #endif