diff options
author | Milosz Tanski <milosz@adfin.com> | 2013-08-21 17:29:54 -0400 |
---|---|---|
committer | Milosz Tanski <milosz@adfin.com> | 2013-09-06 16:50:11 +0000 |
commit | 99ccbd229cf7453206bc858e795ec1f0345ff258 (patch) | |
tree | 343ab082d154d7c970d90bf44c9887fdb0251cdb /fs/ceph/file.c | |
parent | cd0a2df681ec2af45f50c555c2a39dc92a4dff71 (diff) | |
download | op-kernel-dev-99ccbd229cf7453206bc858e795ec1f0345ff258.zip op-kernel-dev-99ccbd229cf7453206bc858e795ec1f0345ff258.tar.gz |
ceph: use fscache as a local presisent cache
Adding support for fscache to the Ceph filesystem. This would bring it to on
par with some of the other network filesystems in Linux (like NFS, AFS, etc...)
In order to mount the filesystem with fscache the 'fsc' mount option must be
passed.
Signed-off-by: Milosz Tanski <milosz@adfin.com>
Signed-off-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'fs/ceph/file.c')
-rw-r--r-- | fs/ceph/file.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 20d0222..3de8982 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -12,6 +12,7 @@ #include "super.h" #include "mds_client.h" +#include "cache.h" /* * Ceph file operations @@ -69,9 +70,23 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode) { struct ceph_file_info *cf; int ret = 0; + struct ceph_inode_info *ci = ceph_inode(inode); + struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb); + struct ceph_mds_client *mdsc = fsc->mdsc; switch (inode->i_mode & S_IFMT) { case S_IFREG: + /* First file open request creates the cookie, we want to keep + * this cookie around for the filetime of the inode as not to + * have to worry about fscache register / revoke / operation + * races. + * + * Also, if we know the operation is going to invalidate data + * (non readonly) just nuke the cache right away. + */ + ceph_fscache_register_inode_cookie(mdsc->fsc, ci); + if ((fmode & CEPH_FILE_MODE_WR)) + ceph_fscache_invalidate(inode); case S_IFDIR: dout("init_file %p %p 0%o (regular)\n", inode, file, inode->i_mode); @@ -182,6 +197,7 @@ int ceph_open(struct inode *inode, struct file *file) spin_unlock(&ci->i_ceph_lock); return ceph_init_file(inode, file, fmode); } + spin_unlock(&ci->i_ceph_lock); dout("open fmode %d wants %s\n", fmode, ceph_cap_string(wanted)); @@ -192,6 +208,7 @@ int ceph_open(struct inode *inode, struct file *file) } req->r_inode = inode; ihold(inode); + req->r_num_caps = 1; if (flags & (O_CREAT|O_TRUNC)) parent_inode = ceph_get_dentry_parent_inode(file->f_dentry); |