~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to fs/fuse/dir.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
158
158
{
159
159
        struct inode *inode;
160
160
 
161
 
        if (nd && nd->flags & LOOKUP_RCU)
162
 
                return -ECHILD;
163
 
 
164
 
        inode = entry->d_inode;
 
161
        inode = ACCESS_ONCE(entry->d_inode);
165
162
        if (inode && is_bad_inode(inode))
166
163
                return 0;
167
164
        else if (fuse_dentry_time(entry) < get_jiffies_64()) {
177
174
                if (!inode)
178
175
                        return 0;
179
176
 
 
177
                if (nd && (nd->flags & LOOKUP_RCU))
 
178
                        return -ECHILD;
 
179
 
180
180
                fc = get_fuse_conn(inode);
181
181
                req = fuse_get_req(fc);
182
182
                if (IS_ERR(req))
691
691
        struct fuse_rename_in inarg;
692
692
        struct fuse_conn *fc = get_fuse_conn(olddir);
693
693
        struct fuse_req *req = fuse_get_req(fc);
 
694
 
694
695
        if (IS_ERR(req))
695
696
                return PTR_ERR(req);
696
697
 
970
971
        return err;
971
972
}
972
973
 
 
974
static int fuse_perm_getattr(struct inode *inode, int flags)
 
975
{
 
976
        if (flags & IPERM_FLAG_RCU)
 
977
                return -ECHILD;
 
978
 
 
979
        return fuse_do_getattr(inode, NULL, NULL);
 
980
}
 
981
 
973
982
/*
974
983
 * Check permission.  The two basic access models of FUSE are:
975
984
 *
989
998
        bool refreshed = false;
990
999
        int err = 0;
991
1000
 
992
 
        if (flags & IPERM_FLAG_RCU)
993
 
                return -ECHILD;
994
 
 
995
1001
        if (!fuse_allow_task(fc, current))
996
1002
                return -EACCES;
997
1003
 
1000
1006
         */
1001
1007
        if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
1002
1008
            ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
1003
 
                err = fuse_update_attributes(inode, NULL, NULL, &refreshed);
1004
 
                if (err)
1005
 
                        return err;
 
1009
                struct fuse_inode *fi = get_fuse_inode(inode);
 
1010
 
 
1011
                if (fi->i_time < get_jiffies_64()) {
 
1012
                        refreshed = true;
 
1013
 
 
1014
                        err = fuse_perm_getattr(inode, flags);
 
1015
                        if (err)
 
1016
                                return err;
 
1017
                }
1006
1018
        }
1007
1019
 
1008
1020
        if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1012
1024
                   attributes.  This is also needed, because the root
1013
1025
                   node will at first have no permissions */
1014
1026
                if (err == -EACCES && !refreshed) {
1015
 
                        err = fuse_do_getattr(inode, NULL, NULL);
 
1027
                        err = fuse_perm_getattr(inode, flags);
1016
1028
                        if (!err)
1017
1029
                                err = generic_permission(inode, mask,
1018
1030
                                                        flags, NULL);
1023
1035
                   noticed immediately, only after the attribute
1024
1036
                   timeout has expired */
1025
1037
        } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
 
1038
                if (flags & IPERM_FLAG_RCU)
 
1039
                        return -ECHILD;
 
1040
 
1026
1041
                err = fuse_access(inode, mask);
1027
1042
        } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1028
1043
                if (!(inode->i_mode & S_IXUGO)) {
1029
1044
                        if (refreshed)
1030
1045
                                return -EACCES;
1031
1046
 
1032
 
                        err = fuse_do_getattr(inode, NULL, NULL);
 
1047
                        err = fuse_perm_getattr(inode, flags);
1033
1048
                        if (!err && !(inode->i_mode & S_IXUGO))
1034
1049
                                return -EACCES;
1035
1050
                }