inode.c (334f485df85ac7736ebe14940bf0a059c5f26d7d) | inode.c (e5e5558e923f35839108a12718494ecb73fb782f) |
---|---|
1/* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu> 4 5 This program can be distributed under the terms of the GNU GPL. 6 See the file COPYING. 7*/ 8 --- 37 unchanged lines hidden (view full) --- 46 47 inode = kmem_cache_alloc(fuse_inode_cachep, SLAB_KERNEL); 48 if (!inode) 49 return NULL; 50 51 fi = get_fuse_inode(inode); 52 fi->i_time = jiffies - 1; 53 fi->nodeid = 0; | 1/* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu> 4 5 This program can be distributed under the terms of the GNU GPL. 6 See the file COPYING. 7*/ 8 --- 37 unchanged lines hidden (view full) --- 46 47 inode = kmem_cache_alloc(fuse_inode_cachep, SLAB_KERNEL); 48 if (!inode) 49 return NULL; 50 51 fi = get_fuse_inode(inode); 52 fi->i_time = jiffies - 1; 53 fi->nodeid = 0; |
54 fi->forget_req = fuse_request_alloc(); 55 if (!fi->forget_req) { 56 kmem_cache_free(fuse_inode_cachep, inode); 57 return NULL; 58 } |
|
54 55 return inode; 56} 57 58static void fuse_destroy_inode(struct inode *inode) 59{ | 59 60 return inode; 61} 62 63static void fuse_destroy_inode(struct inode *inode) 64{ |
65 struct fuse_inode *fi = get_fuse_inode(inode); 66 if (fi->forget_req) 67 fuse_request_free(fi->forget_req); |
|
60 kmem_cache_free(fuse_inode_cachep, inode); 61} 62 63static void fuse_read_inode(struct inode *inode) 64{ 65 /* No op */ 66} 67 | 68 kmem_cache_free(fuse_inode_cachep, inode); 69} 70 71static void fuse_read_inode(struct inode *inode) 72{ 73 /* No op */ 74} 75 |
76void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req, 77 unsigned long nodeid, int version) 78{ 79 struct fuse_forget_in *inarg = &req->misc.forget_in; 80 inarg->version = version; 81 req->in.h.opcode = FUSE_FORGET; 82 req->in.h.nodeid = nodeid; 83 req->in.numargs = 1; 84 req->in.args[0].size = sizeof(struct fuse_forget_in); 85 req->in.args[0].value = inarg; 86 request_send_noreply(fc, req); 87} 88 |
|
68static void fuse_clear_inode(struct inode *inode) 69{ | 89static void fuse_clear_inode(struct inode *inode) 90{ |
91 struct fuse_conn *fc = get_fuse_conn(inode); 92 if (fc) { 93 struct fuse_inode *fi = get_fuse_inode(inode); 94 fuse_send_forget(fc, fi->forget_req, fi->nodeid, inode->i_version); 95 fi->forget_req = NULL; 96 } |
|
70} 71 72void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) 73{ 74 if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size) 75 invalidate_inode_pages(inode->i_mapping); 76 77 inode->i_ino = attr->ino; --- 11 unchanged lines hidden (view full) --- 89 inode->i_ctime.tv_sec = attr->ctime; 90 inode->i_ctime.tv_nsec = attr->ctimensec; 91} 92 93static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr) 94{ 95 inode->i_mode = attr->mode & S_IFMT; 96 i_size_write(inode, attr->size); | 97} 98 99void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) 100{ 101 if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size) 102 invalidate_inode_pages(inode->i_mapping); 103 104 inode->i_ino = attr->ino; --- 11 unchanged lines hidden (view full) --- 116 inode->i_ctime.tv_sec = attr->ctime; 117 inode->i_ctime.tv_nsec = attr->ctimensec; 118} 119 120static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr) 121{ 122 inode->i_mode = attr->mode & S_IFMT; 123 i_size_write(inode, attr->size); |
124 if (S_ISREG(inode->i_mode)) { 125 fuse_init_common(inode); 126 } else if (S_ISDIR(inode->i_mode)) 127 fuse_init_dir(inode); 128 else if (S_ISLNK(inode->i_mode)) 129 fuse_init_symlink(inode); 130 else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || 131 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { 132 fuse_init_common(inode); 133 init_special_inode(inode, inode->i_mode, 134 new_decode_dev(attr->rdev)); 135 } else { 136 /* Don't let user create weird files */ 137 inode->i_mode = S_IFREG; 138 fuse_init_common(inode); 139 } |
|
97} 98 99static int fuse_inode_eq(struct inode *inode, void *_nodeidp) 100{ 101 unsigned long nodeid = *(unsigned long *) _nodeidp; 102 if (get_node_id(inode) == nodeid) 103 return 1; 104 else --- 48 unchanged lines hidden (view full) --- 153 fc->user_id = 0; 154 /* Flush all readers on this fs */ 155 wake_up_all(&fc->waitq); 156 fuse_release_conn(fc); 157 *get_fuse_conn_super_p(sb) = NULL; 158 spin_unlock(&fuse_lock); 159} 160 | 140} 141 142static int fuse_inode_eq(struct inode *inode, void *_nodeidp) 143{ 144 unsigned long nodeid = *(unsigned long *) _nodeidp; 145 if (get_node_id(inode) == nodeid) 146 return 1; 147 else --- 48 unchanged lines hidden (view full) --- 196 fc->user_id = 0; 197 /* Flush all readers on this fs */ 198 wake_up_all(&fc->waitq); 199 fuse_release_conn(fc); 200 *get_fuse_conn_super_p(sb) = NULL; 201 spin_unlock(&fuse_lock); 202} 203 |
204static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr) 205{ 206 stbuf->f_type = FUSE_SUPER_MAGIC; 207 stbuf->f_bsize = attr->bsize; 208 stbuf->f_blocks = attr->blocks; 209 stbuf->f_bfree = attr->bfree; 210 stbuf->f_bavail = attr->bavail; 211 stbuf->f_files = attr->files; 212 stbuf->f_ffree = attr->ffree; 213 stbuf->f_namelen = attr->namelen; 214 /* fsid is left zero */ 215} 216 217static int fuse_statfs(struct super_block *sb, struct kstatfs *buf) 218{ 219 struct fuse_conn *fc = get_fuse_conn_super(sb); 220 struct fuse_req *req; 221 struct fuse_statfs_out outarg; 222 int err; 223 224 req = fuse_get_request(fc); 225 if (!req) 226 return -ERESTARTSYS; 227 228 req->in.numargs = 0; 229 req->in.h.opcode = FUSE_STATFS; 230 req->out.numargs = 1; 231 req->out.args[0].size = sizeof(outarg); 232 req->out.args[0].value = &outarg; 233 request_send(fc, req); 234 err = req->out.h.error; 235 if (!err) 236 convert_fuse_statfs(buf, &outarg.st); 237 fuse_put_request(fc, req); 238 return err; 239} 240 |
|
161enum { 162 OPT_FD, 163 OPT_ROOTMODE, 164 OPT_USER_ID, 165 OPT_DEFAULT_PERMISSIONS, 166 OPT_ALLOW_OTHER, 167 OPT_ALLOW_ROOT, 168 OPT_KERNEL_CACHE, --- 144 unchanged lines hidden (view full) --- 313} 314 315static struct super_operations fuse_super_operations = { 316 .alloc_inode = fuse_alloc_inode, 317 .destroy_inode = fuse_destroy_inode, 318 .read_inode = fuse_read_inode, 319 .clear_inode = fuse_clear_inode, 320 .put_super = fuse_put_super, | 241enum { 242 OPT_FD, 243 OPT_ROOTMODE, 244 OPT_USER_ID, 245 OPT_DEFAULT_PERMISSIONS, 246 OPT_ALLOW_OTHER, 247 OPT_ALLOW_ROOT, 248 OPT_KERNEL_CACHE, --- 144 unchanged lines hidden (view full) --- 393} 394 395static struct super_operations fuse_super_operations = { 396 .alloc_inode = fuse_alloc_inode, 397 .destroy_inode = fuse_destroy_inode, 398 .read_inode = fuse_read_inode, 399 .clear_inode = fuse_clear_inode, 400 .put_super = fuse_put_super, |
401 .statfs = fuse_statfs, |
|
321 .show_options = fuse_show_options, 322}; 323 324static int inc_mount_count(void) 325{ 326 int success = 0; 327 spin_lock(&fuse_lock); 328 mount_count ++; --- 148 unchanged lines hidden --- | 402 .show_options = fuse_show_options, 403}; 404 405static int inc_mount_count(void) 406{ 407 int success = 0; 408 spin_lock(&fuse_lock); 409 mount_count ++; --- 148 unchanged lines hidden --- |