Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 70756
b: refs/heads/master
c: 244f638
h: refs/heads/master
v: v3
  • Loading branch information
Miklos Szeredi authored and Linus Torvalds committed Oct 17, 2007
1 parent 3351dfe commit 8a70dfe
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 44 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 074406fa6309ab8b0aca15496b16b3653e58c03d
refs/heads/master: 244f6385c2891e366a7de5f6746ccc257efd8952
61 changes: 31 additions & 30 deletions trunk/fs/fuse/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ static int fuse_link(struct dentry *entry, struct inode *newdir,
return err;
}

int fuse_do_getattr(struct inode *inode)
static int fuse_do_getattr(struct inode *inode)
{
int err;
struct fuse_attr_out arg;
Expand Down Expand Up @@ -723,30 +723,6 @@ static int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
return 0;
}

/*
* Check whether the inode attributes are still valid
*
* If the attribute validity timeout has expired, then fetch the fresh
* attributes with a 'getattr' request
*
* I'm not sure why cached attributes are never returned for the root
* inode, this is probably being too cautious.
*/
static int fuse_revalidate(struct dentry *entry)
{
struct inode *inode = entry->d_inode;
struct fuse_inode *fi = get_fuse_inode(inode);
struct fuse_conn *fc = get_fuse_conn(inode);

if (!fuse_allow_task(fc, current))
return -EACCES;
if (get_node_id(inode) != FUSE_ROOT_ID &&
fi->i_time >= get_jiffies_64())
return 0;

return fuse_do_getattr(inode);
}

static int fuse_access(struct inode *inode, int mask)
{
struct fuse_conn *fc = get_fuse_conn(inode);
Expand Down Expand Up @@ -794,16 +770,33 @@ static int fuse_access(struct inode *inode, int mask)
static int fuse_permission(struct inode *inode, int mask, struct nameidata *nd)
{
struct fuse_conn *fc = get_fuse_conn(inode);
struct fuse_inode *fi = get_fuse_inode(inode);
bool refreshed = false;
int err = 0;

if (!fuse_allow_task(fc, current))
return -EACCES;
else if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {

/*
* If attributes are needed, but are stale, refresh them
* before proceeding
*/
if (((fc->flags & FUSE_DEFAULT_PERMISSIONS) || (mask & MAY_EXEC)) &&
fi->i_time < get_jiffies_64()) {
err = fuse_do_getattr(inode);
if (err)
return err;

refreshed = true;
}

if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
int err = generic_permission(inode, mask, NULL);

/* If permission is denied, try to refresh file
attributes. This is also needed, because the root
node will at first have no permissions */
if (err == -EACCES) {
if (err == -EACCES && !refreshed) {
err = fuse_do_getattr(inode);
if (!err)
err = generic_permission(inode, mask, NULL);
Expand All @@ -814,16 +807,15 @@ static int fuse_permission(struct inode *inode, int mask, struct nameidata *nd)
noticed immediately, only after the attribute
timeout has expired */

return err;
} else {
int mode = inode->i_mode;
if ((mask & MAY_EXEC) && !S_ISDIR(mode) && !(mode & S_IXUGO))
return -EACCES;

if (nd && (nd->flags & (LOOKUP_ACCESS | LOOKUP_CHDIR)))
return fuse_access(inode, mask);
return 0;
}
return err;
}

static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
Expand Down Expand Up @@ -1052,7 +1044,16 @@ static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
struct kstat *stat)
{
struct inode *inode = entry->d_inode;
int err = fuse_revalidate(entry);
struct fuse_inode *fi = get_fuse_inode(inode);
struct fuse_conn *fc = get_fuse_conn(inode);
int err = 0;

if (!fuse_allow_task(fc, current))
return -EACCES;

if (fi->i_time < get_jiffies_64())
err = fuse_do_getattr(inode);

if (!err)
generic_fillattr(inode, stat);

Expand Down
8 changes: 0 additions & 8 deletions trunk/fs/fuse/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,6 @@ int fuse_open_common(struct inode *inode, struct file *file, int isdir)
if (err)
return err;

/* If opening the root node, no lookup has been performed on
it, so the attributes must be refreshed */
if (get_node_id(inode) == FUSE_ROOT_ID) {
err = fuse_do_getattr(inode);
if (err)
return err;
}

ff = fuse_file_alloc();
if (!ff)
return -ENOMEM;
Expand Down
5 changes: 0 additions & 5 deletions trunk/fs/fuse/fuse_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -532,11 +532,6 @@ void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
/* Abort all requests */
void fuse_abort_conn(struct fuse_conn *fc);

/**
* Get the attributes of a file
*/
int fuse_do_getattr(struct inode *inode);

/**
* Invalidate inode attributes
*/
Expand Down

0 comments on commit 8a70dfe

Please sign in to comment.