4 * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke
5 * Copyright (C) 1997 by Volker Lendecke
7 * Please add a note about your changes to smbfs in the ChangeLog file.
10 #include <linux/time.h>
11 #include <linux/errno.h>
12 #include <linux/kernel.h>
13 #include <linux/smp_lock.h>
14 #include <linux/ctype.h>
15 #include <linux/net.h>
16 #include <linux/sched.h>
18 #include <linux/smb_fs.h>
19 #include <linux/smb_mount.h>
20 #include <linux/smbno.h>
22 #include "smb_debug.h"
25 static int smb_readdir(struct file
*, void *, filldir_t
);
26 static int smb_dir_open(struct inode
*, struct file
*);
28 static struct dentry
*smb_lookup(struct inode
*, struct dentry
*, struct nameidata
*);
29 static int smb_create(struct inode
*, struct dentry
*, int, struct nameidata
*);
30 static int smb_mkdir(struct inode
*, struct dentry
*, int);
31 static int smb_rmdir(struct inode
*, struct dentry
*);
32 static int smb_unlink(struct inode
*, struct dentry
*);
33 static int smb_rename(struct inode
*, struct dentry
*,
34 struct inode
*, struct dentry
*);
35 static int smb_make_node(struct inode
*,struct dentry
*,int,dev_t
);
36 static int smb_link(struct dentry
*, struct inode
*, struct dentry
*);
38 const struct file_operations smb_dir_operations
=
40 .read
= generic_read_dir
,
41 .readdir
= smb_readdir
,
46 const struct inode_operations smb_dir_inode_operations
=
54 .getattr
= smb_getattr
,
55 .setattr
= smb_notify_change
,
58 const struct inode_operations smb_dir_inode_operations_unix
=
66 .getattr
= smb_getattr
,
67 .setattr
= smb_notify_change
,
68 .symlink
= smb_symlink
,
69 .mknod
= smb_make_node
,
74 * Read a directory, using filldir to fill the dirent memory.
75 * smb_proc_readdir does the actual reading from the smb server.
77 * The cache code is almost directly taken from ncpfs
80 smb_readdir(struct file
*filp
, void *dirent
, filldir_t filldir
)
82 struct dentry
*dentry
= filp
->f_path
.dentry
;
83 struct inode
*dir
= dentry
->d_inode
;
84 struct smb_sb_info
*server
= server_from_dentry(dentry
);
85 union smb_dir_cache
*cache
= NULL
;
86 struct smb_cache_control ctl
;
87 struct page
*page
= NULL
;
93 VERBOSE("reading %s/%s, f_pos=%d\n",
94 DENTRY_PATH(dentry
), (int) filp
->f_pos
);
100 switch ((unsigned int) filp
->f_pos
) {
102 if (filldir(dirent
, ".", 1, 0, dir
->i_ino
, DT_DIR
) < 0)
107 if (filldir(dirent
, "..", 2, 1, parent_ino(dentry
), DT_DIR
) < 0)
113 * Make sure our inode is up-to-date.
115 result
= smb_revalidate_inode(dentry
);
120 page
= grab_cache_page(&dir
->i_data
, 0);
124 ctl
.cache
= cache
= kmap(page
);
125 ctl
.head
= cache
->head
;
127 if (!PageUptodate(page
) || !ctl
.head
.eof
) {
128 VERBOSE("%s/%s, page uptodate=%d, eof=%d\n",
129 DENTRY_PATH(dentry
), PageUptodate(page
),ctl
.head
.eof
);
133 if (filp
->f_pos
== 2) {
134 if (jiffies
- ctl
.head
.time
>= SMB_MAX_AGE(server
))
138 * N.B. ncpfs checks mtime of dentry too here, we don't.
139 * 1. common smb servers do not update mtime on dir changes
140 * 2. it requires an extra smb request
141 * (revalidate has the same timeout as ctl.head.time)
143 * Instead smbfs invalidates its own cache on local changes
144 * and remote changes are not seen until timeout.
148 if (filp
->f_pos
> ctl
.head
.end
)
151 ctl
.fpos
= filp
->f_pos
+ (SMB_DIRCACHE_START
- 2);
152 ctl
.ofs
= ctl
.fpos
/ SMB_DIRCACHE_SIZE
;
153 ctl
.idx
= ctl
.fpos
% SMB_DIRCACHE_SIZE
;
157 ctl
.page
= find_lock_page(&dir
->i_data
, ctl
.ofs
);
160 ctl
.cache
= kmap(ctl
.page
);
161 if (!PageUptodate(ctl
.page
))
164 while (ctl
.idx
< SMB_DIRCACHE_SIZE
) {
168 dent
= smb_dget_fpos(ctl
.cache
->dentry
[ctl
.idx
],
169 dentry
, filp
->f_pos
);
173 res
= filldir(dirent
, dent
->d_name
.name
,
174 dent
->d_name
.len
, filp
->f_pos
,
175 dent
->d_inode
->i_ino
, DT_UNKNOWN
);
181 if (filp
->f_pos
> ctl
.head
.end
)
186 SetPageUptodate(ctl
.page
);
187 unlock_page(ctl
.page
);
188 page_cache_release(ctl
.page
);
197 unlock_page(ctl
.page
);
198 page_cache_release(ctl
.page
);
203 smb_invalidate_dircache_entries(dentry
);
204 ctl
.head
.time
= jiffies
;
208 ctl
.idx
= SMB_DIRCACHE_START
;
212 result
= server
->ops
->readdir(filp
, dirent
, filldir
, &ctl
);
213 if (result
== -ERESTARTSYS
&& page
)
214 ClearPageUptodate(page
);
216 goto invalid_cache
; /* retry */
217 ctl
.head
.end
= ctl
.fpos
- 1;
218 ctl
.head
.eof
= ctl
.valid
;
221 cache
->head
= ctl
.head
;
223 if (result
!= -ERESTARTSYS
)
224 SetPageUptodate(page
);
226 page_cache_release(page
);
230 SetPageUptodate(ctl
.page
);
231 unlock_page(ctl
.page
);
232 page_cache_release(ctl
.page
);
240 smb_dir_open(struct inode
*dir
, struct file
*file
)
242 struct dentry
*dentry
= file
->f_path
.dentry
;
243 struct smb_sb_info
*server
;
246 VERBOSE("(%s/%s)\n", dentry
->d_parent
->d_name
.name
,
247 file
->f_path
.dentry
->d_name
.name
);
250 * Directory timestamps in the core protocol aren't updated
251 * when a file is added, so we give them a very short TTL.
254 server
= server_from_dentry(dentry
);
255 if (server
->opt
.protocol
< SMB_PROTOCOL_LANMAN2
) {
256 unsigned long age
= jiffies
- SMB_I(dir
)->oldmtime
;
258 smb_invalid_dir_cache(dir
);
262 * Note: in order to allow the smbmount process to open the
263 * mount point, we only revalidate if the connection is valid or
264 * if the process is trying to access something other than the root.
266 if (server
->state
== CONN_VALID
|| !IS_ROOT(dentry
))
267 error
= smb_revalidate_inode(dentry
);
273 * Dentry operations routines
275 static int smb_lookup_validate(struct dentry
*, struct nameidata
*);
276 static int smb_hash_dentry(struct dentry
*, struct qstr
*);
277 static int smb_compare_dentry(struct dentry
*, struct qstr
*, struct qstr
*);
278 static int smb_delete_dentry(struct dentry
*);
280 static struct dentry_operations smbfs_dentry_operations
=
282 .d_revalidate
= smb_lookup_validate
,
283 .d_hash
= smb_hash_dentry
,
284 .d_compare
= smb_compare_dentry
,
285 .d_delete
= smb_delete_dentry
,
288 static struct dentry_operations smbfs_dentry_operations_case
=
290 .d_revalidate
= smb_lookup_validate
,
291 .d_delete
= smb_delete_dentry
,
296 * This is the callback when the dcache has a lookup hit.
299 smb_lookup_validate(struct dentry
* dentry
, struct nameidata
*nd
)
301 struct smb_sb_info
*server
= server_from_dentry(dentry
);
302 struct inode
* inode
= dentry
->d_inode
;
303 unsigned long age
= jiffies
- dentry
->d_time
;
307 * The default validation is based on dentry age:
308 * we believe in dentries for a few seconds. (But each
309 * successful server lookup renews the timestamp.)
311 valid
= (age
<= SMB_MAX_AGE(server
));
312 #ifdef SMBFS_DEBUG_VERBOSE
314 VERBOSE("%s/%s not valid, age=%lu\n",
315 DENTRY_PATH(dentry
), age
);
320 if (is_bad_inode(inode
)) {
321 PARANOIA("%s/%s has dud inode\n", DENTRY_PATH(dentry
));
324 valid
= (smb_revalidate_inode(dentry
) == 0);
328 * What should we do for negative dentries?
335 smb_hash_dentry(struct dentry
*dir
, struct qstr
*this)
340 hash
= init_name_hash();
341 for (i
=0; i
< this->len
; i
++)
342 hash
= partial_name_hash(tolower(this->name
[i
]), hash
);
343 this->hash
= end_name_hash(hash
);
349 smb_compare_dentry(struct dentry
*dir
, struct qstr
*a
, struct qstr
*b
)
353 if (a
->len
!= b
->len
)
355 for (i
=0; i
< a
->len
; i
++) {
356 if (tolower(a
->name
[i
]) != tolower(b
->name
[i
]))
365 * This is the callback from dput() when d_count is going to 0.
366 * We use this to unhash dentries with bad inodes.
369 smb_delete_dentry(struct dentry
* dentry
)
371 if (dentry
->d_inode
) {
372 if (is_bad_inode(dentry
->d_inode
)) {
373 PARANOIA("bad inode, unhashing %s/%s\n",
374 DENTRY_PATH(dentry
));
378 /* N.B. Unhash negative dentries? */
384 * Initialize a new dentry
387 smb_new_dentry(struct dentry
*dentry
)
389 struct smb_sb_info
*server
= server_from_dentry(dentry
);
391 if (server
->mnt
->flags
& SMB_MOUNT_CASE
)
392 dentry
->d_op
= &smbfs_dentry_operations_case
;
394 dentry
->d_op
= &smbfs_dentry_operations
;
395 dentry
->d_time
= jiffies
;
400 * Whenever a lookup succeeds, we know the parent directories
401 * are all valid, so we want to update the dentry timestamps.
402 * N.B. Move this to dcache?
405 smb_renew_times(struct dentry
* dentry
)
408 spin_lock(&dentry
->d_lock
);
410 struct dentry
*parent
;
412 dentry
->d_time
= jiffies
;
415 parent
= dentry
->d_parent
;
417 spin_unlock(&dentry
->d_lock
);
420 spin_lock(&dentry
->d_lock
);
422 spin_unlock(&dentry
->d_lock
);
426 static struct dentry
*
427 smb_lookup(struct inode
*dir
, struct dentry
*dentry
, struct nameidata
*nd
)
429 struct smb_fattr finfo
;
432 struct smb_sb_info
*server
;
434 error
= -ENAMETOOLONG
;
435 if (dentry
->d_name
.len
> SMB_MAXNAMELEN
)
438 /* Do not allow lookup of names with backslashes in */
440 if (memchr(dentry
->d_name
.name
, '\\', dentry
->d_name
.len
))
444 error
= smb_proc_getattr(dentry
, &finfo
);
445 #ifdef SMBFS_PARANOIA
446 if (error
&& error
!= -ENOENT
)
447 PARANOIA("find %s/%s failed, error=%d\n",
448 DENTRY_PATH(dentry
), error
);
452 if (error
== -ENOENT
)
456 finfo
.f_ino
= iunique(dentry
->d_sb
, 2);
457 inode
= smb_iget(dir
->i_sb
, &finfo
);
460 server
= server_from_dentry(dentry
);
461 if (server
->mnt
->flags
& SMB_MOUNT_CASE
)
462 dentry
->d_op
= &smbfs_dentry_operations_case
;
464 dentry
->d_op
= &smbfs_dentry_operations
;
466 d_add(dentry
, inode
);
467 smb_renew_times(dentry
);
473 return ERR_PTR(error
);
477 * This code is common to all routines creating a new inode.
480 smb_instantiate(struct dentry
*dentry
, __u16 fileid
, int have_id
)
482 struct smb_sb_info
*server
= server_from_dentry(dentry
);
485 struct smb_fattr fattr
;
487 VERBOSE("file %s/%s, fileid=%u\n", DENTRY_PATH(dentry
), fileid
);
489 error
= smb_proc_getattr(dentry
, &fattr
);
493 smb_renew_times(dentry
);
494 fattr
.f_ino
= iunique(dentry
->d_sb
, 2);
495 inode
= smb_iget(dentry
->d_sb
, &fattr
);
500 struct smb_inode_info
*ei
= SMB_I(inode
);
502 ei
->access
= SMB_O_RDWR
;
503 ei
->open
= server
->generation
;
505 d_instantiate(dentry
, inode
);
513 PARANOIA("%s/%s failed, error=%d, closing %u\n",
514 DENTRY_PATH(dentry
), error
, fileid
);
515 smb_close_fileid(dentry
, fileid
);
520 /* N.B. How should the mode argument be used? */
522 smb_create(struct inode
*dir
, struct dentry
*dentry
, int mode
,
523 struct nameidata
*nd
)
525 struct smb_sb_info
*server
= server_from_dentry(dentry
);
530 VERBOSE("creating %s/%s, mode=%d\n", DENTRY_PATH(dentry
), mode
);
533 smb_invalid_dir_cache(dir
);
534 error
= smb_proc_create(dentry
, 0, get_seconds(), &fileid
);
536 if (server
->opt
.capabilities
& SMB_CAP_UNIX
) {
537 /* Set attributes for new file */
538 attr
.ia_valid
= ATTR_MODE
;
540 error
= smb_proc_setattr_unix(dentry
, &attr
, 0, 0);
542 error
= smb_instantiate(dentry
, fileid
, 1);
544 PARANOIA("%s/%s failed, error=%d\n",
545 DENTRY_PATH(dentry
), error
);
551 /* N.B. How should the mode argument be used? */
553 smb_mkdir(struct inode
*dir
, struct dentry
*dentry
, int mode
)
555 struct smb_sb_info
*server
= server_from_dentry(dentry
);
560 smb_invalid_dir_cache(dir
);
561 error
= smb_proc_mkdir(dentry
);
563 if (server
->opt
.capabilities
& SMB_CAP_UNIX
) {
564 /* Set attributes for new directory */
565 attr
.ia_valid
= ATTR_MODE
;
567 error
= smb_proc_setattr_unix(dentry
, &attr
, 0, 0);
569 error
= smb_instantiate(dentry
, 0, 0);
576 smb_rmdir(struct inode
*dir
, struct dentry
*dentry
)
578 struct inode
*inode
= dentry
->d_inode
;
582 * Close the directory if it's open.
588 * Check that nobody else is using the directory..
591 if (!d_unhashed(dentry
))
594 smb_invalid_dir_cache(dir
);
595 error
= smb_proc_rmdir(dentry
);
603 smb_unlink(struct inode
*dir
, struct dentry
*dentry
)
608 * Close the file if it's open.
611 smb_close(dentry
->d_inode
);
613 smb_invalid_dir_cache(dir
);
614 error
= smb_proc_unlink(dentry
);
616 smb_renew_times(dentry
);
622 smb_rename(struct inode
*old_dir
, struct dentry
*old_dentry
,
623 struct inode
*new_dir
, struct dentry
*new_dentry
)
628 * Close any open files, and check whether to delete the
629 * target before attempting the rename.
632 if (old_dentry
->d_inode
)
633 smb_close(old_dentry
->d_inode
);
634 if (new_dentry
->d_inode
) {
635 smb_close(new_dentry
->d_inode
);
636 error
= smb_proc_unlink(new_dentry
);
638 VERBOSE("unlink %s/%s, error=%d\n",
639 DENTRY_PATH(new_dentry
), error
);
643 d_delete(new_dentry
);
646 smb_invalid_dir_cache(old_dir
);
647 smb_invalid_dir_cache(new_dir
);
648 error
= smb_proc_mv(old_dentry
, new_dentry
);
650 smb_renew_times(old_dentry
);
651 smb_renew_times(new_dentry
);
659 * FIXME: samba servers won't let you create device nodes unless uid/gid
660 * matches the connection credentials (and we don't know which those are ...)
663 smb_make_node(struct inode
*dir
, struct dentry
*dentry
, int mode
, dev_t dev
)
668 attr
.ia_valid
= ATTR_MODE
| ATTR_UID
| ATTR_GID
;
670 attr
.ia_uid
= current
->euid
;
671 attr
.ia_gid
= current
->egid
;
673 if (!new_valid_dev(dev
))
676 smb_invalid_dir_cache(dir
);
677 error
= smb_proc_setattr_unix(dentry
, &attr
, MAJOR(dev
), MINOR(dev
));
679 error
= smb_instantiate(dentry
, 0, 0);
685 * dentry = existing file
686 * new_dentry = new file
689 smb_link(struct dentry
*dentry
, struct inode
*dir
, struct dentry
*new_dentry
)
693 DEBUG1("smb_link old=%s/%s new=%s/%s\n",
694 DENTRY_PATH(dentry
), DENTRY_PATH(new_dentry
));
695 smb_invalid_dir_cache(dir
);
696 error
= smb_proc_link(server_from_dentry(dentry
), dentry
, new_dentry
);
698 smb_renew_times(dentry
);
699 error
= smb_instantiate(new_dentry
, 0, 0);