* [Ocfs2-devel] Tiny patch for cached ACLs support @ 2011-03-31 8:28 jeff.liu 2011-03-31 8:36 ` Tao Ma 2011-03-31 8:40 ` Tristan Ye 0 siblings, 2 replies; 9+ messages in thread From: jeff.liu @ 2011-03-31 8:28 UTC (permalink / raw) To: ocfs2-devel Hello, Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like getacl/setacl/chacl on my single node OCFS2, it works for me. Any comments and testing are appreciated. Thanks, -Jeff Signed-off-by: Jeff Liu <jeff.liu@oracle.com> --- fs/ocfs2/acl.c | 12 +++++++++++- fs/ocfs2/inode.c | 4 ++++ 2 files changed, 15 insertions(+), 1 deletions(-) diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 704f6b1..13c58b0 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) return NULL; + acl = get_cached_acl(inode, type); + if (acl != ACL_NOT_CACHED) + return acl; + ret = ocfs2_inode_lock(inode, &di_bh, 0); if (ret < 0) { mlog_errno(ret); @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, else ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); + if (!ret) + set_cached_acl(inode, type, acl); + kfree(value); return ret; @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) if (!clone) return -ENOMEM; ret = posix_acl_chmod_masq(clone, inode->i_mode); - if (!ret) + if (!ret) { ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, clone, NULL, NULL); + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); + } + posix_acl_release(clone); return ret; } diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 4068c6c..80deac8 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -28,6 +28,7 @@ #include <linux/highmem.h> #include <linux/pagemap.h> #include <linux/quotaops.h> +#include <linux/posix_acl.h> #include <asm/byteorder.h> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, goto bail_unlock_dir; } + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) + forget_all_cached_acls(inode); + status = ocfs2_remove_refcount_tree(inode, di_bh); if (status < 0) { mlog_errno(status); -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:28 [Ocfs2-devel] Tiny patch for cached ACLs support jeff.liu @ 2011-03-31 8:36 ` Tao Ma 2011-03-31 8:51 ` jeff.liu 2011-03-31 8:40 ` Tristan Ye 1 sibling, 1 reply; 9+ messages in thread From: Tao Ma @ 2011-03-31 8:36 UTC (permalink / raw) To: ocfs2-devel Hi Jeff, On 03/31/2011 04:28 PM, jeff.liu wrote: > Hello, > > Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like > getacl/setacl/chacl on my single node OCFS2, it works for me. Your codes seem to not handle the case of cross node update? See node A updates ACL, node B should abandon the old one. Regards, Tao > > Any comments and testing are appreciated. > > Thanks, > -Jeff > > > Signed-off-by: Jeff Liu <jeff.liu@oracle.com> > --- > fs/ocfs2/acl.c | 12 +++++++++++- > fs/ocfs2/inode.c | 4 ++++ > 2 files changed, 15 insertions(+), 1 deletions(-) > > diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c > index 704f6b1..13c58b0 100644 > --- a/fs/ocfs2/acl.c > +++ b/fs/ocfs2/acl.c > @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) > if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) > return NULL; > > + acl = get_cached_acl(inode, type); > + if (acl != ACL_NOT_CACHED) > + return acl; > + > ret = ocfs2_inode_lock(inode, &di_bh, 0); > if (ret < 0) { > mlog_errno(ret); > @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, > else > ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); > > + if (!ret) > + set_cached_acl(inode, type, acl); > + > kfree(value); > > return ret; > @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) > if (!clone) > return -ENOMEM; > ret = posix_acl_chmod_masq(clone, inode->i_mode); > - if (!ret) > + if (!ret) { > ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, > clone, NULL, NULL); > + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); > + } > + > posix_acl_release(clone); > return ret; > } > diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c > index 4068c6c..80deac8 100644 > --- a/fs/ocfs2/inode.c > +++ b/fs/ocfs2/inode.c > @@ -28,6 +28,7 @@ > #include <linux/highmem.h> > #include <linux/pagemap.h> > #include <linux/quotaops.h> > +#include <linux/posix_acl.h> > > #include <asm/byteorder.h> > > @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, > goto bail_unlock_dir; > } > > + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) > + forget_all_cached_acls(inode); > + > status = ocfs2_remove_refcount_tree(inode, di_bh); > if (status < 0) { > mlog_errno(status); ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:36 ` Tao Ma @ 2011-03-31 8:51 ` jeff.liu 2011-03-31 8:55 ` Tao Ma 0 siblings, 1 reply; 9+ messages in thread From: jeff.liu @ 2011-03-31 8:51 UTC (permalink / raw) To: ocfs2-devel Hi Tao, Tao Ma wrote: > Hi Jeff, > On 03/31/2011 04:28 PM, jeff.liu wrote: >> Hello, >> >> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >> getacl/setacl/chacl on my single node OCFS2, it works for me. > Your codes seem to not handle the case of cross node update? See node A > updates ACL, node B should abandon the old one. IMHO, cached ACLs are stored at VFS for each node instead of being synchronized among multiple nodes, hence it doesn't need to take care of that. Thanks, -Jeff > > Regards, > Tao >> Any comments and testing are appreciated. >> >> Thanks, >> -Jeff >> >> >> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >> --- >> fs/ocfs2/acl.c | 12 +++++++++++- >> fs/ocfs2/inode.c | 4 ++++ >> 2 files changed, 15 insertions(+), 1 deletions(-) >> >> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >> index 704f6b1..13c58b0 100644 >> --- a/fs/ocfs2/acl.c >> +++ b/fs/ocfs2/acl.c >> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >> return NULL; >> >> + acl = get_cached_acl(inode, type); >> + if (acl != ACL_NOT_CACHED) >> + return acl; >> + >> ret = ocfs2_inode_lock(inode, &di_bh, 0); >> if (ret < 0) { >> mlog_errno(ret); >> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >> else >> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >> >> + if (!ret) >> + set_cached_acl(inode, type, acl); >> + >> kfree(value); >> >> return ret; >> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >> if (!clone) >> return -ENOMEM; >> ret = posix_acl_chmod_masq(clone, inode->i_mode); >> - if (!ret) >> + if (!ret) { >> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >> clone, NULL, NULL); >> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >> + } >> + >> posix_acl_release(clone); >> return ret; >> } >> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >> index 4068c6c..80deac8 100644 >> --- a/fs/ocfs2/inode.c >> +++ b/fs/ocfs2/inode.c >> @@ -28,6 +28,7 @@ >> #include <linux/highmem.h> >> #include <linux/pagemap.h> >> #include <linux/quotaops.h> >> +#include <linux/posix_acl.h> >> >> #include <asm/byteorder.h> >> >> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >> goto bail_unlock_dir; >> } >> >> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >> + forget_all_cached_acls(inode); >> + >> status = ocfs2_remove_refcount_tree(inode, di_bh); >> if (status < 0) { >> mlog_errno(status); > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:51 ` jeff.liu @ 2011-03-31 8:55 ` Tao Ma 2011-03-31 9:16 ` jeff.liu 0 siblings, 1 reply; 9+ messages in thread From: Tao Ma @ 2011-03-31 8:55 UTC (permalink / raw) To: ocfs2-devel On 03/31/2011 04:51 PM, jeff.liu wrote: > Hi Tao, > > Tao Ma wrote: >> Hi Jeff, >> On 03/31/2011 04:28 PM, jeff.liu wrote: >>> Hello, >>> >>> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >>> getacl/setacl/chacl on my single node OCFS2, it works for me. >> Your codes seem to not handle the case of cross node update? See node A >> updates ACL, node B should abandon the old one. > IMHO, cached ACLs are stored at VFS for each node instead of being synchronized among multiple > nodes, hence it doesn't need to take care of that. yes, it is stored in VFS, so we have to synchronize it like i_size and other inode stuff and that's why the user need a cluster file system.;) cached ACLs is used to speed up acl read, but not to have different acls from different nodes. Regards, Tao > > Thanks, > -Jeff >> >> Regards, >> Tao >>> Any comments and testing are appreciated. >>> >>> Thanks, >>> -Jeff >>> >>> >>> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >>> --- >>> fs/ocfs2/acl.c | 12 +++++++++++- >>> fs/ocfs2/inode.c | 4 ++++ >>> 2 files changed, 15 insertions(+), 1 deletions(-) >>> >>> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >>> index 704f6b1..13c58b0 100644 >>> --- a/fs/ocfs2/acl.c >>> +++ b/fs/ocfs2/acl.c >>> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >>> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >>> return NULL; >>> >>> + acl = get_cached_acl(inode, type); >>> + if (acl != ACL_NOT_CACHED) >>> + return acl; >>> + >>> ret = ocfs2_inode_lock(inode, &di_bh, 0); >>> if (ret < 0) { >>> mlog_errno(ret); >>> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >>> else >>> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >>> >>> + if (!ret) >>> + set_cached_acl(inode, type, acl); >>> + >>> kfree(value); >>> >>> return ret; >>> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >>> if (!clone) >>> return -ENOMEM; >>> ret = posix_acl_chmod_masq(clone, inode->i_mode); >>> - if (!ret) >>> + if (!ret) { >>> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >>> clone, NULL, NULL); >>> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >>> + } >>> + >>> posix_acl_release(clone); >>> return ret; >>> } >>> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >>> index 4068c6c..80deac8 100644 >>> --- a/fs/ocfs2/inode.c >>> +++ b/fs/ocfs2/inode.c >>> @@ -28,6 +28,7 @@ >>> #include <linux/highmem.h> >>> #include <linux/pagemap.h> >>> #include <linux/quotaops.h> >>> +#include <linux/posix_acl.h> >>> >>> #include <asm/byteorder.h> >>> >>> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >>> goto bail_unlock_dir; >>> } >>> >>> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >>> + forget_all_cached_acls(inode); >>> + >>> status = ocfs2_remove_refcount_tree(inode, di_bh); >>> if (status < 0) { >>> mlog_errno(status); >> > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:55 ` Tao Ma @ 2011-03-31 9:16 ` jeff.liu 2011-03-31 9:31 ` Tristan Ye 0 siblings, 1 reply; 9+ messages in thread From: jeff.liu @ 2011-03-31 9:16 UTC (permalink / raw) To: ocfs2-devel Tao Ma wrote: > On 03/31/2011 04:51 PM, jeff.liu wrote: >> Hi Tao, >> >> Tao Ma wrote: >>> Hi Jeff, >>> On 03/31/2011 04:28 PM, jeff.liu wrote: >>>> Hello, >>>> >>>> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >>>> getacl/setacl/chacl on my single node OCFS2, it works for me. >>> Your codes seem to not handle the case of cross node update? See node A >>> updates ACL, node B should abandon the old one. >> IMHO, cached ACLs are stored at VFS for each node instead of being synchronized among multiple >> nodes, hence it doesn't need to take care of that. > yes, it is stored in VFS, so we have to synchronize it like i_size and > other inode stuff and that's why the user need a cluster file system.;) > cached ACLs is used to speed up acl read, but not to have different acls > from different nodes. You are right, I'll figure out a way for the synchronization. Thanks, -Jeff > > Regards, > Tao >> Thanks, >> -Jeff >>> Regards, >>> Tao >>>> Any comments and testing are appreciated. >>>> >>>> Thanks, >>>> -Jeff >>>> >>>> >>>> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >>>> --- >>>> fs/ocfs2/acl.c | 12 +++++++++++- >>>> fs/ocfs2/inode.c | 4 ++++ >>>> 2 files changed, 15 insertions(+), 1 deletions(-) >>>> >>>> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >>>> index 704f6b1..13c58b0 100644 >>>> --- a/fs/ocfs2/acl.c >>>> +++ b/fs/ocfs2/acl.c >>>> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >>>> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >>>> return NULL; >>>> >>>> + acl = get_cached_acl(inode, type); >>>> + if (acl != ACL_NOT_CACHED) >>>> + return acl; >>>> + >>>> ret = ocfs2_inode_lock(inode, &di_bh, 0); >>>> if (ret < 0) { >>>> mlog_errno(ret); >>>> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >>>> else >>>> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >>>> >>>> + if (!ret) >>>> + set_cached_acl(inode, type, acl); >>>> + >>>> kfree(value); >>>> >>>> return ret; >>>> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >>>> if (!clone) >>>> return -ENOMEM; >>>> ret = posix_acl_chmod_masq(clone, inode->i_mode); >>>> - if (!ret) >>>> + if (!ret) { >>>> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >>>> clone, NULL, NULL); >>>> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >>>> + } >>>> + >>>> posix_acl_release(clone); >>>> return ret; >>>> } >>>> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >>>> index 4068c6c..80deac8 100644 >>>> --- a/fs/ocfs2/inode.c >>>> +++ b/fs/ocfs2/inode.c >>>> @@ -28,6 +28,7 @@ >>>> #include <linux/highmem.h> >>>> #include <linux/pagemap.h> >>>> #include <linux/quotaops.h> >>>> +#include <linux/posix_acl.h> >>>> >>>> #include <asm/byteorder.h> >>>> >>>> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >>>> goto bail_unlock_dir; >>>> } >>>> >>>> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >>>> + forget_all_cached_acls(inode); >>>> + >>>> status = ocfs2_remove_refcount_tree(inode, di_bh); >>>> if (status < 0) { >>>> mlog_errno(status); > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 9:16 ` jeff.liu @ 2011-03-31 9:31 ` Tristan Ye 2011-03-31 11:31 ` jeff.liu 0 siblings, 1 reply; 9+ messages in thread From: Tristan Ye @ 2011-03-31 9:31 UTC (permalink / raw) To: ocfs2-devel jeff.liu wrote: > Tao Ma wrote: >> On 03/31/2011 04:51 PM, jeff.liu wrote: >>> Hi Tao, >>> >>> Tao Ma wrote: >>>> Hi Jeff, >>>> On 03/31/2011 04:28 PM, jeff.liu wrote: >>>>> Hello, >>>>> >>>>> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >>>>> getacl/setacl/chacl on my single node OCFS2, it works for me. >>>> Your codes seem to not handle the case of cross node update? See node A >>>> updates ACL, node B should abandon the old one. >>> IMHO, cached ACLs are stored at VFS for each node instead of being synchronized among multiple >>> nodes, hence it doesn't need to take care of that. >> yes, it is stored in VFS, so we have to synchronize it like i_size and >> other inode stuff and that's why the user need a cluster file system.;) >> cached ACLs is used to speed up acl read, but not to have different acls >> from different nodes. > You are right, I'll figure out a way for the synchronization. Hi Jeff, Maybe we can do this in downconverting thread like other caches(dentry, file-data etc), take the 'ocfs2_refcount_convert_worker' as a reference. Tristan > > Thanks, > -Jeff >> Regards, >> Tao >>> Thanks, >>> -Jeff >>>> Regards, >>>> Tao >>>>> Any comments and testing are appreciated. >>>>> >>>>> Thanks, >>>>> -Jeff >>>>> >>>>> >>>>> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >>>>> --- >>>>> fs/ocfs2/acl.c | 12 +++++++++++- >>>>> fs/ocfs2/inode.c | 4 ++++ >>>>> 2 files changed, 15 insertions(+), 1 deletions(-) >>>>> >>>>> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >>>>> index 704f6b1..13c58b0 100644 >>>>> --- a/fs/ocfs2/acl.c >>>>> +++ b/fs/ocfs2/acl.c >>>>> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >>>>> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >>>>> return NULL; >>>>> >>>>> + acl = get_cached_acl(inode, type); >>>>> + if (acl != ACL_NOT_CACHED) >>>>> + return acl; >>>>> + >>>>> ret = ocfs2_inode_lock(inode, &di_bh, 0); >>>>> if (ret < 0) { >>>>> mlog_errno(ret); >>>>> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >>>>> else >>>>> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >>>>> >>>>> + if (!ret) >>>>> + set_cached_acl(inode, type, acl); >>>>> + >>>>> kfree(value); >>>>> >>>>> return ret; >>>>> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >>>>> if (!clone) >>>>> return -ENOMEM; >>>>> ret = posix_acl_chmod_masq(clone, inode->i_mode); >>>>> - if (!ret) >>>>> + if (!ret) { >>>>> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >>>>> clone, NULL, NULL); >>>>> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >>>>> + } >>>>> + >>>>> posix_acl_release(clone); >>>>> return ret; >>>>> } >>>>> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >>>>> index 4068c6c..80deac8 100644 >>>>> --- a/fs/ocfs2/inode.c >>>>> +++ b/fs/ocfs2/inode.c >>>>> @@ -28,6 +28,7 @@ >>>>> #include <linux/highmem.h> >>>>> #include <linux/pagemap.h> >>>>> #include <linux/quotaops.h> >>>>> +#include <linux/posix_acl.h> >>>>> >>>>> #include <asm/byteorder.h> >>>>> >>>>> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >>>>> goto bail_unlock_dir; >>>>> } >>>>> >>>>> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >>>>> + forget_all_cached_acls(inode); >>>>> + >>>>> status = ocfs2_remove_refcount_tree(inode, di_bh); >>>>> if (status < 0) { >>>>> mlog_errno(status); > > > _______________________________________________ > Ocfs2-devel mailing list > Ocfs2-devel at oss.oracle.com > http://oss.oracle.com/mailman/listinfo/ocfs2-devel ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 9:31 ` Tristan Ye @ 2011-03-31 11:31 ` jeff.liu 0 siblings, 0 replies; 9+ messages in thread From: jeff.liu @ 2011-03-31 11:31 UTC (permalink / raw) To: ocfs2-devel Tristan Ye wrote: > jeff.liu wrote: >> Tao Ma wrote: >>> On 03/31/2011 04:51 PM, jeff.liu wrote: >>>> Hi Tao, >>>> >>>> Tao Ma wrote: >>>>> Hi Jeff, >>>>> On 03/31/2011 04:28 PM, jeff.liu wrote: >>>>>> Hello, >>>>>> >>>>>> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >>>>>> getacl/setacl/chacl on my single node OCFS2, it works for me. >>>>> Your codes seem to not handle the case of cross node update? See node A >>>>> updates ACL, node B should abandon the old one. >>>> IMHO, cached ACLs are stored at VFS for each node instead of being synchronized among multiple >>>> nodes, hence it doesn't need to take care of that. >>> yes, it is stored in VFS, so we have to synchronize it like i_size and >>> other inode stuff and that's why the user need a cluster file system.;) >>> cached ACLs is used to speed up acl read, but not to have different acls >>> from different nodes. >> You are right, I'll figure out a way for the synchronization. > > Hi Jeff, > > Maybe we can do this in downconverting thread like other caches(dentry, > file-data etc), take the 'ocfs2_refcount_convert_worker' as a reference. Yes, I have spoke to Tao about that, downcoverting thread is a good candidate to call forget_cached_acl(). Thanks, -Jeff > > Tristan > > >> Thanks, >> -Jeff >>> Regards, >>> Tao >>>> Thanks, >>>> -Jeff >>>>> Regards, >>>>> Tao >>>>>> Any comments and testing are appreciated. >>>>>> >>>>>> Thanks, >>>>>> -Jeff >>>>>> >>>>>> >>>>>> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >>>>>> --- >>>>>> fs/ocfs2/acl.c | 12 +++++++++++- >>>>>> fs/ocfs2/inode.c | 4 ++++ >>>>>> 2 files changed, 15 insertions(+), 1 deletions(-) >>>>>> >>>>>> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >>>>>> index 704f6b1..13c58b0 100644 >>>>>> --- a/fs/ocfs2/acl.c >>>>>> +++ b/fs/ocfs2/acl.c >>>>>> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >>>>>> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >>>>>> return NULL; >>>>>> >>>>>> + acl = get_cached_acl(inode, type); >>>>>> + if (acl != ACL_NOT_CACHED) >>>>>> + return acl; >>>>>> + >>>>>> ret = ocfs2_inode_lock(inode, &di_bh, 0); >>>>>> if (ret < 0) { >>>>>> mlog_errno(ret); >>>>>> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >>>>>> else >>>>>> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >>>>>> >>>>>> + if (!ret) >>>>>> + set_cached_acl(inode, type, acl); >>>>>> + >>>>>> kfree(value); >>>>>> >>>>>> return ret; >>>>>> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >>>>>> if (!clone) >>>>>> return -ENOMEM; >>>>>> ret = posix_acl_chmod_masq(clone, inode->i_mode); >>>>>> - if (!ret) >>>>>> + if (!ret) { >>>>>> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >>>>>> clone, NULL, NULL); >>>>>> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >>>>>> + } >>>>>> + >>>>>> posix_acl_release(clone); >>>>>> return ret; >>>>>> } >>>>>> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >>>>>> index 4068c6c..80deac8 100644 >>>>>> --- a/fs/ocfs2/inode.c >>>>>> +++ b/fs/ocfs2/inode.c >>>>>> @@ -28,6 +28,7 @@ >>>>>> #include <linux/highmem.h> >>>>>> #include <linux/pagemap.h> >>>>>> #include <linux/quotaops.h> >>>>>> +#include <linux/posix_acl.h> >>>>>> >>>>>> #include <asm/byteorder.h> >>>>>> >>>>>> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >>>>>> goto bail_unlock_dir; >>>>>> } >>>>>> >>>>>> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >>>>>> + forget_all_cached_acls(inode); >>>>>> + >>>>>> status = ocfs2_remove_refcount_tree(inode, di_bh); >>>>>> if (status < 0) { >>>>>> mlog_errno(status); >> >> _______________________________________________ >> Ocfs2-devel mailing list >> Ocfs2-devel at oss.oracle.com >> http://oss.oracle.com/mailman/listinfo/ocfs2-devel > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:28 [Ocfs2-devel] Tiny patch for cached ACLs support jeff.liu 2011-03-31 8:36 ` Tao Ma @ 2011-03-31 8:40 ` Tristan Ye 2011-03-31 8:54 ` jeff.liu 1 sibling, 1 reply; 9+ messages in thread From: Tristan Ye @ 2011-03-31 8:40 UTC (permalink / raw) To: ocfs2-devel jeff.liu wrote: > Hello, > > Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like > getacl/setacl/chacl on my single node OCFS2, it works for me. Hi Jeff, Take a look at http://oss.oracle.com/git/ocfs2-test.git/programs/acl_tests, there is a somewhat comprehensive testing script in existence for posix_acl, maybe it can be a bit overkilling for your patch, but please just take it as a double-checker if you wish;-) > > Any comments and testing are appreciated. > > Thanks, > -Jeff > > > Signed-off-by: Jeff Liu <jeff.liu@oracle.com> > --- > fs/ocfs2/acl.c | 12 +++++++++++- > fs/ocfs2/inode.c | 4 ++++ > 2 files changed, 15 insertions(+), 1 deletions(-) > > diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c > index 704f6b1..13c58b0 100644 > --- a/fs/ocfs2/acl.c > +++ b/fs/ocfs2/acl.c > @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) > if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) > return NULL; > > + acl = get_cached_acl(inode, type); > + if (acl != ACL_NOT_CACHED) > + return acl; > + > ret = ocfs2_inode_lock(inode, &di_bh, 0); > if (ret < 0) { > mlog_errno(ret); > @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, > else > ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); > > + if (!ret) > + set_cached_acl(inode, type, acl); > + > kfree(value); > > return ret; > @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) > if (!clone) > return -ENOMEM; > ret = posix_acl_chmod_masq(clone, inode->i_mode); > - if (!ret) > + if (!ret) { > ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, > clone, NULL, NULL); > + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); > + } > + > posix_acl_release(clone); > return ret; > } > diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c > index 4068c6c..80deac8 100644 > --- a/fs/ocfs2/inode.c > +++ b/fs/ocfs2/inode.c > @@ -28,6 +28,7 @@ > #include <linux/highmem.h> > #include <linux/pagemap.h> > #include <linux/quotaops.h> > +#include <linux/posix_acl.h> > > #include <asm/byteorder.h> > > @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, > goto bail_unlock_dir; > } > > + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) > + forget_all_cached_acls(inode); > + > status = ocfs2_remove_refcount_tree(inode, di_bh); > if (status < 0) { > mlog_errno(status); ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Ocfs2-devel] Tiny patch for cached ACLs support 2011-03-31 8:40 ` Tristan Ye @ 2011-03-31 8:54 ` jeff.liu 0 siblings, 0 replies; 9+ messages in thread From: jeff.liu @ 2011-03-31 8:54 UTC (permalink / raw) To: ocfs2-devel Hi Tristan, Thanks for you info, I'll definitely try it tonight. Regards, -Jeff Tristan Ye wrote: > jeff.liu wrote: >> Hello, >> >> Below is a tiny patch for adding cached ACLs support to OCFS2, I have run a few simple tests like >> getacl/setacl/chacl on my single node OCFS2, it works for me. > > Hi Jeff, > Take a look at http://oss.oracle.com/git/ocfs2-test.git/programs/acl_tests, > there is a somewhat comprehensive testing script in existence for posix_acl, > maybe it can be a bit overkilling for your patch, but please just take it as a > double-checker if you wish;-) > > > >> Any comments and testing are appreciated. >> >> Thanks, >> -Jeff >> >> >> Signed-off-by: Jeff Liu <jeff.liu@oracle.com> >> --- >> fs/ocfs2/acl.c | 12 +++++++++++- >> fs/ocfs2/inode.c | 4 ++++ >> 2 files changed, 15 insertions(+), 1 deletions(-) >> >> diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c >> index 704f6b1..13c58b0 100644 >> --- a/fs/ocfs2/acl.c >> +++ b/fs/ocfs2/acl.c >> @@ -152,6 +152,10 @@ static struct posix_acl *ocfs2_get_acl(struct inode *inode, int type) >> if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) >> return NULL; >> >> + acl = get_cached_acl(inode, type); >> + if (acl != ACL_NOT_CACHED) >> + return acl; >> + >> ret = ocfs2_inode_lock(inode, &di_bh, 0); >> if (ret < 0) { >> mlog_errno(ret); >> @@ -286,6 +290,9 @@ static int ocfs2_set_acl(handle_t *handle, >> else >> ret = ocfs2_xattr_set(inode, name_index, "", value, size, 0); >> >> + if (!ret) >> + set_cached_acl(inode, type, acl); >> + >> kfree(value); >> >> return ret; >> @@ -348,9 +355,12 @@ int ocfs2_acl_chmod(struct inode *inode) >> if (!clone) >> return -ENOMEM; >> ret = posix_acl_chmod_masq(clone, inode->i_mode); >> - if (!ret) >> + if (!ret) { >> ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, >> clone, NULL, NULL); >> + set_cached_acl(inode, ACL_TYPE_ACCESS, clone); >> + } >> + >> posix_acl_release(clone); >> return ret; >> } >> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c >> index 4068c6c..80deac8 100644 >> --- a/fs/ocfs2/inode.c >> +++ b/fs/ocfs2/inode.c >> @@ -28,6 +28,7 @@ >> #include <linux/highmem.h> >> #include <linux/pagemap.h> >> #include <linux/quotaops.h> >> +#include <linux/posix_acl.h> >> >> #include <asm/byteorder.h> >> >> @@ -783,6 +784,9 @@ static int ocfs2_wipe_inode(struct inode *inode, >> goto bail_unlock_dir; >> } >> >> + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) >> + forget_all_cached_acls(inode); >> + >> status = ocfs2_remove_refcount_tree(inode, di_bh); >> if (status < 0) { >> mlog_errno(status); > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-03-31 11:31 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-03-31 8:28 [Ocfs2-devel] Tiny patch for cached ACLs support jeff.liu 2011-03-31 8:36 ` Tao Ma 2011-03-31 8:51 ` jeff.liu 2011-03-31 8:55 ` Tao Ma 2011-03-31 9:16 ` jeff.liu 2011-03-31 9:31 ` Tristan Ye 2011-03-31 11:31 ` jeff.liu 2011-03-31 8:40 ` Tristan Ye 2011-03-31 8:54 ` jeff.liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).