[Linux-cachefs] [PATCH] ceph: Add FScache support
Milosz Tanski
milosz at adfin.com
Wed Jul 3 19:02:05 UTC 2013
David,
I took your suggestions and updated my wip branch (on bitbucket) with
a handful of fixes except for the locking around registering the
cookie. I'm not sure what's the correct thing to do there.
On Tue, Jul 2, 2013 at 7:40 PM, David Howells <dhowells at redhat.com> wrote:
>
> Okay, my analysis of the patch:
>
> Looking at your index structure, ceph has per-fsid indices under the top
> "ceph" index and then per-inode indices under those? Are fsids universally
> unique - or just for a given server/cell/whatever?
It's my understanding that's a guuid assigned to the cluster.
>
>> +#ifdef CONFIG_CEPH_FSCACHE
>> + if (PageFsCache(page))
>> + ceph_invalidate_fscache_page(inode, page);
>> +#endif
>
> The PageFsCache() test here should be folded into the header file. You
> actually have a redundant test:
>
> +static inline void ceph_invalidate_fscache_page(struct inode *inode,
> + struct page *page)
> +{
> + if (ceph_inode(inode)->fscache == NULL)
> + return;
> +
> + if (PageFsCache(page))
> + return __ceph_invalidate_fscache_page(inode, page);
> +}
>
>> +#ifdef CONFIG_CEPH_FSCACHE
>> + /* Can we release the page from the cache? */
>> + if (PageFsCache(page) && ceph_release_fscache_page(page, g) == 0)
>> + return 0;
>> +#endif
>
> The PageFsCache() test here is also redundant as fscache_maybe_release_page()
> also does it - though I acknowledge it does it after doing the "is this cookie
> valid" test. The reason I put that test first is that if CONFIG_FSCACHE=n
> then the "is this cookie valid" test just evaluates immediately to false at
> compile time.
>
>> +void ceph_fscache_inode_get_cookie(struct inode *inode);
>
> No such function?
Fixed.
>
>> +static inline void ceph_fsxache_async_uncache_inode(struct inode* inode)
>
> Misspelling?
Fixed.
>
>> +static inline int ceph_readpage_from_fscache(struct inode *inode,
>> + struct page *page)
>> +{
>> + if (ceph_inode(inode)->fscache == NULL)
>> + return -ENOBUFS;
>> +
>> + return __ceph_readpage_from_fscache(inode, page);
>> +}
>
> Looking at functions like this, if you wrap:
>
> ceph_inode(inode)->fscache
>
> as, say:
>
> struct fscache_cookie *ceph_inode_cookie(struct inode *inode)
> {
> #ifdef CONFIG_CEPH_FSCACHE
> return ceph_inode(inode)->fscache;
> #else
> return NULL;
> #endif
> }
>
> then you can get rid of a lot of cpp conditionals and just rely on gcc's
> optimiser (see what I did in include/linux/fscache.h). Note that anything in
> fs/ceph/cache.c wouldn't need to use this.
Per your suggestion I implemented this. This helped me to get rid of
some of the CONFIG_CEPH_FSCACHE checks (but not all).
>
>> static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
>> ...
>> +#ifdef CONFIG_CEPH_FSCACHE
>> + spin_lock(&ci->i_ceph_lock);
>> + ceph_fscache_register_inode_cookie(fsc, ci);
>> + spin_unlock(&ci->i_ceph_lock);
>> +#endif
>
> Ummm... ceph_fscache_register_inode_cookie() calls fscache_acquire_cookie()
> which allocates GFP_KERNEL and grabs fscache_addremove_sem. You can't wrap
> this call in a spinlock. Do you use lockdep?
I took a look at the nfs code it seams like there isn't any kind of
locking in nfs_open around acquiring of the cookie. Then looking back
at Ceph code it seams like extensively locks in the open code. I'm not
sure if I have open worry about open races.
>
> David
More information about the Linux-cachefs
mailing list