2e5209f8c094645ea431f3d9e115a35dff4a2495
[zfs.git] / module / zfs / zpl_ctldir.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (C) 2011 Lawrence Livermore National Security, LLC.
23  * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
24  * LLNL-CODE-403049.
25  * Rewritten for Linux by:
26  *   Rohan Puri <rohan.puri15@gmail.com>
27  *   Brian Behlendorf <behlendorf1@llnl.gov>
28  */
29
30 #include <sys/zfs_vfsops.h>
31 #include <sys/zfs_vnops.h>
32 #include <sys/zfs_znode.h>
33 #include <sys/zfs_ctldir.h>
34 #include <sys/zpl.h>
35
36 /*
37  * Common open routine.  Disallow any write access.
38  */
39 /* ARGSUSED */
40 static int
41 zpl_common_open(struct inode *ip, struct file *filp)
42 {
43         if (filp->f_mode & FMODE_WRITE)
44                 return (-EACCES);
45
46         return generic_file_open(ip, filp);
47 }
48
49 static int
50 zpl_common_readdir(struct file *filp, void *dirent, filldir_t filldir)
51 {
52         struct dentry *dentry = filp->f_path.dentry;
53         struct inode *ip = dentry->d_inode;
54         int error = 0;
55
56         switch (filp->f_pos) {
57         case 0:
58                 error = filldir(dirent, ".", 1, 0, ip->i_ino, DT_DIR);
59                 if (error)
60                         break;
61
62                 filp->f_pos++;
63                 /* fall-thru */
64         case 1:
65                 error = filldir(dirent, "..", 2, 1, parent_ino(dentry), DT_DIR);
66                 if (error)
67                         break;
68
69                 filp->f_pos++;
70                 /* fall-thru */
71         default:
72                 break;
73         }
74
75         return (error);
76 }
77
78 /*
79  * Get root directory contents.
80  */
81 static int
82 zpl_root_readdir(struct file *filp, void *dirent, filldir_t filldir)
83 {
84         struct dentry *dentry = filp->f_path.dentry;
85         struct inode *ip = dentry->d_inode;
86         zfs_sb_t *zsb = ITOZSB(ip);
87         int error = 0;
88
89         ZFS_ENTER(zsb);
90
91         switch (filp->f_pos) {
92         case 0:
93                 error = filldir(dirent, ".", 1, 0, ip->i_ino, DT_DIR);
94                 if (error)
95                         goto out;
96
97                 filp->f_pos++;
98                 /* fall-thru */
99         case 1:
100                 error = filldir(dirent, "..", 2, 1, parent_ino(dentry), DT_DIR);
101                 if (error)
102                         goto out;
103
104                 filp->f_pos++;
105                 /* fall-thru */
106         case 2:
107                 error = filldir(dirent, ZFS_SNAPDIR_NAME,
108                     strlen(ZFS_SNAPDIR_NAME), 2, ZFSCTL_INO_SNAPDIR, DT_DIR);
109                 if (error)
110                         goto out;
111
112                 filp->f_pos++;
113                 /* fall-thru */
114         case 3:
115                 error = filldir(dirent, ZFS_SHAREDIR_NAME,
116                     strlen(ZFS_SHAREDIR_NAME), 3, ZFSCTL_INO_SHARES, DT_DIR);
117                 if (error)
118                         goto out;
119
120                 filp->f_pos++;
121                 /* fall-thru */
122         }
123 out:
124         ZFS_EXIT(zsb);
125
126         return (error);
127 }
128
129 /*
130  * Get root directory attributes.
131  */
132 /* ARGSUSED */
133 static int
134 zpl_root_getattr(struct vfsmount *mnt, struct dentry *dentry,
135     struct kstat *stat)
136 {
137         int error;
138
139         error = simple_getattr(mnt, dentry, stat);
140         stat->atime = CURRENT_TIME;
141
142         return (error);
143 }
144
145 static struct dentry *
146 #ifdef HAVE_LOOKUP_NAMEIDATA
147 zpl_root_lookup(struct inode *dip, struct dentry *dentry, struct nameidata *nd)
148 #else
149 zpl_root_lookup(struct inode *dip, struct dentry *dentry, unsigned int flags)
150 #endif
151 {
152         cred_t *cr = CRED();
153         struct inode *ip;
154         int error;
155
156         crhold(cr);
157         error = -zfsctl_root_lookup(dip, dname(dentry), &ip, 0, cr, NULL, NULL);
158         ASSERT3S(error, <=, 0);
159         crfree(cr);
160
161         if (error) {
162                 if (error == -ENOENT)
163                         return d_splice_alias(NULL, dentry);
164                 else
165                         return ERR_PTR(error);
166         }
167
168         return d_splice_alias(ip, dentry);
169 }
170
171 /*
172  * The '.zfs' control directory file and inode operations.
173  */
174 const struct file_operations zpl_fops_root = {
175         .open           = zpl_common_open,
176         .llseek         = generic_file_llseek,
177         .read           = generic_read_dir,
178         .readdir        = zpl_root_readdir,
179 };
180
181 const struct inode_operations zpl_ops_root = {
182         .lookup         = zpl_root_lookup,
183         .getattr        = zpl_root_getattr,
184 };
185
186 #ifdef HAVE_AUTOMOUNT
187 static struct vfsmount *
188 zpl_snapdir_automount(struct path *path)
189 {
190         struct dentry *dentry = path->dentry;
191         int error;
192
193         /*
194          * We must briefly disable automounts for this dentry because the
195          * user space mount utility will trigger another lookup on this
196          * directory.  That will result in zpl_snapdir_automount() being
197          * called repeatedly.  The DCACHE_NEED_AUTOMOUNT flag can be
198          * safely reset once the mount completes.
199          */
200         dentry->d_flags &= ~DCACHE_NEED_AUTOMOUNT;
201         error = -zfsctl_mount_snapshot(path, 0);
202         dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
203         if (error)
204                 return ERR_PTR(error);
205
206         /*
207          * Rather than returning the new vfsmount for the snapshot we must
208          * return NULL to indicate a mount collision.  This is done because
209          * the user space mount calls do_add_mount() which adds the vfsmount
210          * to the name space.  If we returned the new mount here it would be
211          * added again to the vfsmount list resulting in list corruption.
212          */
213         return (NULL);
214 }
215 #endif /* HAVE_AUTOMOUNT */
216
217 /*
218  * Revalidate any dentry in the snapshot directory on lookup, since a snapshot
219  * having the same name have been created or destroyed since it was cached.
220  */
221 static int
222 #ifdef HAVE_D_REVALIDATE_NAMEIDATA
223 zpl_snapdir_revalidate(struct dentry *dentry, struct nameidata *i)
224 #else
225 zpl_snapdir_revalidate(struct dentry *dentry, unsigned int flags)
226 #endif
227 {
228         return 0;
229 }
230
231 dentry_operations_t zpl_dops_snapdirs = {
232 /*
233  * Auto mounting of snapshots is only supported for 2.6.37 and
234  * newer kernels.  Prior to this kernel the ops->follow_link()
235  * callback was used as a hack to trigger the mount.  The
236  * resulting vfsmount was then explicitly grafted in to the
237  * name space.  While it might be possible to add compatibility
238  * code to accomplish this it would require considerable care.
239  */
240 #ifdef HAVE_AUTOMOUNT
241         .d_automount    = zpl_snapdir_automount,
242 #endif /* HAVE_AUTOMOUNT */
243         .d_revalidate   = zpl_snapdir_revalidate,
244 };
245
246 static struct dentry *
247 #ifdef HAVE_LOOKUP_NAMEIDATA
248 zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
249     struct nameidata *nd)
250 #else
251 zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
252     unsigned int flags)
253 #endif
254
255 {
256         cred_t *cr = CRED();
257         struct inode *ip = NULL;
258         int error;
259
260         crhold(cr);
261         error = -zfsctl_snapdir_lookup(dip, dname(dentry), &ip,
262             0, cr, NULL, NULL);
263         ASSERT3S(error, <=, 0);
264         crfree(cr);
265
266         if (error && error != -ENOENT)
267                 return ERR_PTR(error);
268
269         ASSERT(error == 0 || ip == NULL);
270         d_set_d_op(dentry, &zpl_dops_snapdirs);
271
272         return d_splice_alias(ip, dentry);
273 }
274
275 /* ARGSUSED */
276 static int
277 zpl_snapdir_readdir(struct file *filp, void *dirent, filldir_t filldir)
278 {
279         struct dentry *dentry = filp->f_path.dentry;
280         struct inode *dip = dentry->d_inode;
281         zfs_sb_t *zsb = ITOZSB(dip);
282         char snapname[MAXNAMELEN];
283         uint64_t id, cookie;
284         boolean_t case_conflict;
285         int error = 0;
286
287         ZFS_ENTER(zsb);
288
289         cookie = filp->f_pos;
290         switch (filp->f_pos) {
291         case 0:
292                 error = filldir(dirent, ".", 1, 0, dip->i_ino, DT_DIR);
293                 if (error)
294                         goto out;
295
296                 filp->f_pos++;
297                 /* fall-thru */
298         case 1:
299                 error = filldir(dirent, "..", 2, 1, parent_ino(dentry), DT_DIR);
300                 if (error)
301                         goto out;
302
303                 filp->f_pos++;
304                 /* fall-thru */
305         default:
306                 while (error == 0) {
307                         error = -dmu_snapshot_list_next(zsb->z_os, MAXNAMELEN,
308                             snapname, &id, &cookie, &case_conflict);
309                         if (error)
310                                 goto out;
311
312                         error = filldir(dirent, snapname, strlen(snapname),
313                             filp->f_pos, ZFSCTL_INO_SHARES - id, DT_DIR);
314                         if (error)
315                                 goto out;
316
317                         filp->f_pos = cookie;
318                 }
319         }
320 out:
321         ZFS_EXIT(zsb);
322
323         if (error == -ENOENT)
324                 return (0);
325
326         return (error);
327 }
328
329 int
330 zpl_snapdir_rename(struct inode *sdip, struct dentry *sdentry,
331     struct inode *tdip, struct dentry *tdentry)
332 {
333         cred_t *cr = CRED();
334         int error;
335
336         crhold(cr);
337         error = -zfsctl_snapdir_rename(sdip, dname(sdentry),
338             tdip, dname(tdentry), cr, 0);
339         ASSERT3S(error, <=, 0);
340         crfree(cr);
341
342         return (error);
343 }
344
345 static int
346 zpl_snapdir_rmdir(struct inode *dip, struct dentry *dentry)
347 {
348         cred_t *cr = CRED();
349         int error;
350
351         crhold(cr);
352         error = -zfsctl_snapdir_remove(dip, dname(dentry), cr, 0);
353         ASSERT3S(error, <=, 0);
354         crfree(cr);
355
356         return (error);
357 }
358
359 static int
360 zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, zpl_umode_t mode)
361 {
362         cred_t *cr = CRED();
363         vattr_t *vap;
364         struct inode *ip;
365         int error;
366
367         crhold(cr);
368         vap = kmem_zalloc(sizeof(vattr_t), KM_SLEEP);
369         zpl_vap_init(vap, dip, dentry, mode | S_IFDIR, cr);
370
371         error = -zfsctl_snapdir_mkdir(dip, dname(dentry), vap, &ip, cr, 0);
372         if (error == 0) {
373                 d_set_d_op(dentry, &zpl_dops_snapdirs);
374                 d_instantiate(dentry, ip);
375         }
376
377         kmem_free(vap, sizeof(vattr_t));
378         ASSERT3S(error, <=, 0);
379         crfree(cr);
380
381         return (error);
382 }
383
384 /*
385  * Get snapshot directory attributes.
386  */
387 /* ARGSUSED */
388 static int
389 zpl_snapdir_getattr(struct vfsmount *mnt, struct dentry *dentry,
390     struct kstat *stat)
391 {
392         zfs_sb_t *zsb = ITOZSB(dentry->d_inode);
393         int error;
394
395         ZFS_ENTER(zsb);
396         error = simple_getattr(mnt, dentry, stat);
397         stat->nlink = stat->size = avl_numnodes(&zsb->z_ctldir_snaps) + 2;
398         stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zsb->z_os);
399         stat->atime = CURRENT_TIME;
400         ZFS_EXIT(zsb);
401
402         return (error);
403 }
404
405 /*
406  * The '.zfs/snapshot' directory file operations.  These mainly control
407  * generating the list of available snapshots when doing an 'ls' in the
408  * directory.  See zpl_snapdir_readdir().
409  */
410 const struct file_operations zpl_fops_snapdir = {
411         .open           = zpl_common_open,
412         .llseek         = generic_file_llseek,
413         .read           = generic_read_dir,
414         .readdir        = zpl_snapdir_readdir,
415 };
416
417 /*
418  * The '.zfs/snapshot' directory inode operations.  These mainly control
419  * creating an inode for a snapshot directory and initializing the needed
420  * infrastructure to automount the snapshot.  See zpl_snapdir_lookup().
421  */
422 const struct inode_operations zpl_ops_snapdir = {
423         .lookup         = zpl_snapdir_lookup,
424         .getattr        = zpl_snapdir_getattr,
425         .rename         = zpl_snapdir_rename,
426         .rmdir          = zpl_snapdir_rmdir,
427         .mkdir          = zpl_snapdir_mkdir,
428 };
429
430 static struct dentry *
431 #ifdef HAVE_LOOKUP_NAMEIDATA
432 zpl_shares_lookup(struct inode *dip, struct dentry *dentry,
433     struct nameidata *nd)
434 #else
435 zpl_shares_lookup(struct inode *dip, struct dentry *dentry,
436     unsigned int flags)
437 #endif
438 {
439         cred_t *cr = CRED();
440         struct inode *ip = NULL;
441         int error;
442
443         crhold(cr);
444         error = -zfsctl_shares_lookup(dip, dname(dentry), &ip,
445             0, cr, NULL, NULL);
446         ASSERT3S(error, <=, 0);
447         crfree(cr);
448
449         if (error) {
450                 if (error == -ENOENT)
451                         return d_splice_alias(NULL, dentry);
452                 else
453                         return ERR_PTR(error);
454         }
455
456         return d_splice_alias(ip, dentry);
457 }
458
459 /* ARGSUSED */
460 static int
461 zpl_shares_readdir(struct file *filp, void *dirent, filldir_t filldir)
462 {
463         cred_t *cr = CRED();
464         struct dentry *dentry = filp->f_path.dentry;
465         struct inode *ip = dentry->d_inode;
466         zfs_sb_t *zsb = ITOZSB(ip);
467         znode_t *dzp;
468         int error;
469
470         ZFS_ENTER(zsb);
471
472         if (zsb->z_shares_dir == 0) {
473                 error = zpl_common_readdir(filp, dirent, filldir);
474                 ZFS_EXIT(zsb);
475                 return (error);
476         }
477
478         error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp);
479         if (error) {
480                 ZFS_EXIT(zsb);
481                 return (error);
482         }
483
484         crhold(cr);
485         error = -zfs_readdir(ZTOI(dzp), dirent, filldir, &filp->f_pos, cr);
486         crfree(cr);
487
488         iput(ZTOI(dzp));
489         ZFS_EXIT(zsb);
490         ASSERT3S(error, <=, 0);
491
492         return (error);
493 }
494
495 /* ARGSUSED */
496 static int
497 zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
498     struct kstat *stat)
499 {
500         struct inode *ip = dentry->d_inode;
501         zfs_sb_t *zsb = ITOZSB(ip);
502         znode_t *dzp;
503         int error;
504
505         ZFS_ENTER(zsb);
506
507         if (zsb->z_shares_dir == 0) {
508                 error = simple_getattr(mnt, dentry, stat);
509                 stat->nlink = stat->size = 2;
510                 stat->atime = CURRENT_TIME;
511                 ZFS_EXIT(zsb);
512                 return (error);
513         }
514
515         error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp);
516         if (error == 0)
517                 error = -zfs_getattr_fast(dentry->d_inode, stat);
518
519         iput(ZTOI(dzp));
520         ZFS_EXIT(zsb);
521         ASSERT3S(error, <=, 0);
522
523         return (error);
524 }
525
526 /*
527  * The '.zfs/shares' directory file operations.
528  */
529 const struct file_operations zpl_fops_shares = {
530         .open           = zpl_common_open,
531         .llseek         = generic_file_llseek,
532         .read           = generic_read_dir,
533         .readdir        = zpl_shares_readdir,
534 };
535
536 /*
537  * The '.zfs/shares' directory inode operations.
538  */
539 const struct inode_operations zpl_ops_shares = {
540         .lookup         = zpl_shares_lookup,
541         .getattr        = zpl_shares_getattr,
542 };