Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/cifs/cifsfs.c
15109 views
1
/*
2
* fs/cifs/cifsfs.c
3
*
4
* Copyright (C) International Business Machines Corp., 2002,2008
5
* Author(s): Steve French ([email protected])
6
*
7
* Common Internet FileSystem (CIFS) client
8
*
9
* This library is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU Lesser General Public License as published
11
* by the Free Software Foundation; either version 2.1 of the License, or
12
* (at your option) any later version.
13
*
14
* This library is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17
* the GNU Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public License
20
* along with this library; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
*/
23
24
/* Note that BB means BUGBUG (ie something to fix eventually) */
25
26
#include <linux/module.h>
27
#include <linux/fs.h>
28
#include <linux/mount.h>
29
#include <linux/slab.h>
30
#include <linux/init.h>
31
#include <linux/list.h>
32
#include <linux/seq_file.h>
33
#include <linux/vfs.h>
34
#include <linux/mempool.h>
35
#include <linux/delay.h>
36
#include <linux/kthread.h>
37
#include <linux/freezer.h>
38
#include <linux/namei.h>
39
#include <net/ipv6.h>
40
#include "cifsfs.h"
41
#include "cifspdu.h"
42
#define DECLARE_GLOBALS_HERE
43
#include "cifsglob.h"
44
#include "cifsproto.h"
45
#include "cifs_debug.h"
46
#include "cifs_fs_sb.h"
47
#include <linux/mm.h>
48
#include <linux/key-type.h>
49
#include "cifs_spnego.h"
50
#include "fscache.h"
51
#define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */
52
53
int cifsFYI = 0;
54
int cifsERROR = 1;
55
int traceSMB = 0;
56
unsigned int oplockEnabled = 1;
57
unsigned int linuxExtEnabled = 1;
58
unsigned int lookupCacheEnabled = 1;
59
unsigned int multiuser_mount = 0;
60
unsigned int global_secflags = CIFSSEC_DEF;
61
/* unsigned int ntlmv2_support = 0; */
62
unsigned int sign_CIFS_PDUs = 1;
63
static const struct super_operations cifs_super_ops;
64
unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
65
module_param(CIFSMaxBufSize, int, 0);
66
MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header). "
67
"Default: 16384 Range: 8192 to 130048");
68
unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
69
module_param(cifs_min_rcv, int, 0);
70
MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
71
"1 to 64");
72
unsigned int cifs_min_small = 30;
73
module_param(cifs_min_small, int, 0);
74
MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
75
"Range: 2 to 256");
76
unsigned int cifs_max_pending = CIFS_MAX_REQ;
77
module_param(cifs_max_pending, int, 0);
78
MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. "
79
"Default: 50 Range: 2 to 256");
80
unsigned short echo_retries = 5;
81
module_param(echo_retries, ushort, 0644);
82
MODULE_PARM_DESC(echo_retries, "Number of echo attempts before giving up and "
83
"reconnecting server. Default: 5. 0 means "
84
"never reconnect.");
85
extern mempool_t *cifs_sm_req_poolp;
86
extern mempool_t *cifs_req_poolp;
87
extern mempool_t *cifs_mid_poolp;
88
89
void
90
cifs_sb_active(struct super_block *sb)
91
{
92
struct cifs_sb_info *server = CIFS_SB(sb);
93
94
if (atomic_inc_return(&server->active) == 1)
95
atomic_inc(&sb->s_active);
96
}
97
98
void
99
cifs_sb_deactive(struct super_block *sb)
100
{
101
struct cifs_sb_info *server = CIFS_SB(sb);
102
103
if (atomic_dec_and_test(&server->active))
104
deactivate_super(sb);
105
}
106
107
static int
108
cifs_read_super(struct super_block *sb)
109
{
110
struct inode *inode;
111
struct cifs_sb_info *cifs_sb;
112
int rc = 0;
113
114
cifs_sb = CIFS_SB(sb);
115
116
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
117
sb->s_flags |= MS_POSIXACL;
118
119
if (cifs_sb_master_tcon(cifs_sb)->ses->capabilities & CAP_LARGE_FILES)
120
sb->s_maxbytes = MAX_LFS_FILESIZE;
121
else
122
sb->s_maxbytes = MAX_NON_LFS;
123
124
/* BB FIXME fix time_gran to be larger for LANMAN sessions */
125
sb->s_time_gran = 100;
126
127
sb->s_magic = CIFS_MAGIC_NUMBER;
128
sb->s_op = &cifs_super_ops;
129
sb->s_bdi = &cifs_sb->bdi;
130
sb->s_blocksize = CIFS_MAX_MSGSIZE;
131
sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */
132
inode = cifs_root_iget(sb);
133
134
if (IS_ERR(inode)) {
135
rc = PTR_ERR(inode);
136
inode = NULL;
137
goto out_no_root;
138
}
139
140
sb->s_root = d_alloc_root(inode);
141
142
if (!sb->s_root) {
143
rc = -ENOMEM;
144
goto out_no_root;
145
}
146
147
/* do that *after* d_alloc_root() - we want NULL ->d_op for root here */
148
if (cifs_sb_master_tcon(cifs_sb)->nocase)
149
sb->s_d_op = &cifs_ci_dentry_ops;
150
else
151
sb->s_d_op = &cifs_dentry_ops;
152
153
#ifdef CIFS_NFSD_EXPORT
154
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
155
cFYI(1, "export ops supported");
156
sb->s_export_op = &cifs_export_ops;
157
}
158
#endif /* CIFS_NFSD_EXPORT */
159
160
return 0;
161
162
out_no_root:
163
cERROR(1, "cifs_read_super: get root inode failed");
164
if (inode)
165
iput(inode);
166
167
return rc;
168
}
169
170
static void cifs_kill_sb(struct super_block *sb)
171
{
172
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
173
kill_anon_super(sb);
174
cifs_umount(cifs_sb);
175
}
176
177
static int
178
cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
179
{
180
struct super_block *sb = dentry->d_sb;
181
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
182
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
183
int rc = -EOPNOTSUPP;
184
int xid;
185
186
xid = GetXid();
187
188
buf->f_type = CIFS_MAGIC_NUMBER;
189
190
/*
191
* PATH_MAX may be too long - it would presumably be total path,
192
* but note that some servers (includinng Samba 3) have a shorter
193
* maximum path.
194
*
195
* Instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO.
196
*/
197
buf->f_namelen = PATH_MAX;
198
buf->f_files = 0; /* undefined */
199
buf->f_ffree = 0; /* unlimited */
200
201
/*
202
* We could add a second check for a QFS Unix capability bit
203
*/
204
if ((tcon->ses->capabilities & CAP_UNIX) &&
205
(CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability)))
206
rc = CIFSSMBQFSPosixInfo(xid, tcon, buf);
207
208
/*
209
* Only need to call the old QFSInfo if failed on newer one,
210
* e.g. by OS/2.
211
**/
212
if (rc && (tcon->ses->capabilities & CAP_NT_SMBS))
213
rc = CIFSSMBQFSInfo(xid, tcon, buf);
214
215
/*
216
* Some old Windows servers also do not support level 103, retry with
217
* older level one if old server failed the previous call or we
218
* bypassed it because we detected that this was an older LANMAN sess
219
*/
220
if (rc)
221
rc = SMBOldQFSInfo(xid, tcon, buf);
222
223
FreeXid(xid);
224
return 0;
225
}
226
227
static int cifs_permission(struct inode *inode, int mask, unsigned int flags)
228
{
229
struct cifs_sb_info *cifs_sb;
230
231
cifs_sb = CIFS_SB(inode->i_sb);
232
233
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
234
if ((mask & MAY_EXEC) && !execute_ok(inode))
235
return -EACCES;
236
else
237
return 0;
238
} else /* file mode might have been restricted at mount time
239
on the client (above and beyond ACL on servers) for
240
servers which do not support setting and viewing mode bits,
241
so allowing client to check permissions is useful */
242
return generic_permission(inode, mask, flags, NULL);
243
}
244
245
static struct kmem_cache *cifs_inode_cachep;
246
static struct kmem_cache *cifs_req_cachep;
247
static struct kmem_cache *cifs_mid_cachep;
248
static struct kmem_cache *cifs_sm_req_cachep;
249
mempool_t *cifs_sm_req_poolp;
250
mempool_t *cifs_req_poolp;
251
mempool_t *cifs_mid_poolp;
252
253
static struct inode *
254
cifs_alloc_inode(struct super_block *sb)
255
{
256
struct cifsInodeInfo *cifs_inode;
257
cifs_inode = kmem_cache_alloc(cifs_inode_cachep, GFP_KERNEL);
258
if (!cifs_inode)
259
return NULL;
260
cifs_inode->cifsAttrs = 0x20; /* default */
261
cifs_inode->time = 0;
262
/* Until the file is open and we have gotten oplock
263
info back from the server, can not assume caching of
264
file data or metadata */
265
cifs_set_oplock_level(cifs_inode, 0);
266
cifs_inode->delete_pending = false;
267
cifs_inode->invalid_mapping = false;
268
cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
269
cifs_inode->server_eof = 0;
270
cifs_inode->uniqueid = 0;
271
cifs_inode->createtime = 0;
272
273
/* Can not set i_flags here - they get immediately overwritten
274
to zero by the VFS */
275
/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
276
INIT_LIST_HEAD(&cifs_inode->openFileList);
277
return &cifs_inode->vfs_inode;
278
}
279
280
static void cifs_i_callback(struct rcu_head *head)
281
{
282
struct inode *inode = container_of(head, struct inode, i_rcu);
283
INIT_LIST_HEAD(&inode->i_dentry);
284
kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
285
}
286
287
static void
288
cifs_destroy_inode(struct inode *inode)
289
{
290
call_rcu(&inode->i_rcu, cifs_i_callback);
291
}
292
293
static void
294
cifs_evict_inode(struct inode *inode)
295
{
296
truncate_inode_pages(&inode->i_data, 0);
297
end_writeback(inode);
298
cifs_fscache_release_inode_cookie(inode);
299
}
300
301
static void
302
cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
303
{
304
struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
305
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
306
307
seq_printf(s, ",addr=");
308
309
switch (server->dstaddr.ss_family) {
310
case AF_INET:
311
seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
312
break;
313
case AF_INET6:
314
seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
315
if (sa6->sin6_scope_id)
316
seq_printf(s, "%%%u", sa6->sin6_scope_id);
317
break;
318
default:
319
seq_printf(s, "(unknown)");
320
}
321
}
322
323
static void
324
cifs_show_security(struct seq_file *s, struct TCP_Server_Info *server)
325
{
326
seq_printf(s, ",sec=");
327
328
switch (server->secType) {
329
case LANMAN:
330
seq_printf(s, "lanman");
331
break;
332
case NTLMv2:
333
seq_printf(s, "ntlmv2");
334
break;
335
case NTLM:
336
seq_printf(s, "ntlm");
337
break;
338
case Kerberos:
339
seq_printf(s, "krb5");
340
break;
341
case RawNTLMSSP:
342
seq_printf(s, "ntlmssp");
343
break;
344
default:
345
/* shouldn't ever happen */
346
seq_printf(s, "unknown");
347
break;
348
}
349
350
if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
351
seq_printf(s, "i");
352
}
353
354
/*
355
* cifs_show_options() is for displaying mount options in /proc/mounts.
356
* Not all settable options are displayed but most of the important
357
* ones are.
358
*/
359
static int
360
cifs_show_options(struct seq_file *s, struct vfsmount *m)
361
{
362
struct cifs_sb_info *cifs_sb = CIFS_SB(m->mnt_sb);
363
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
364
struct sockaddr *srcaddr;
365
srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
366
367
cifs_show_security(s, tcon->ses->server);
368
369
seq_printf(s, ",unc=%s", tcon->treeName);
370
371
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
372
seq_printf(s, ",multiuser");
373
else if (tcon->ses->user_name)
374
seq_printf(s, ",username=%s", tcon->ses->user_name);
375
376
if (tcon->ses->domainName)
377
seq_printf(s, ",domain=%s", tcon->ses->domainName);
378
379
if (srcaddr->sa_family != AF_UNSPEC) {
380
struct sockaddr_in *saddr4;
381
struct sockaddr_in6 *saddr6;
382
saddr4 = (struct sockaddr_in *)srcaddr;
383
saddr6 = (struct sockaddr_in6 *)srcaddr;
384
if (srcaddr->sa_family == AF_INET6)
385
seq_printf(s, ",srcaddr=%pI6c",
386
&saddr6->sin6_addr);
387
else if (srcaddr->sa_family == AF_INET)
388
seq_printf(s, ",srcaddr=%pI4",
389
&saddr4->sin_addr.s_addr);
390
else
391
seq_printf(s, ",srcaddr=BAD-AF:%i",
392
(int)(srcaddr->sa_family));
393
}
394
395
seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
396
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
397
seq_printf(s, ",forceuid");
398
else
399
seq_printf(s, ",noforceuid");
400
401
seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
402
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
403
seq_printf(s, ",forcegid");
404
else
405
seq_printf(s, ",noforcegid");
406
407
cifs_show_address(s, tcon->ses->server);
408
409
if (!tcon->unix_ext)
410
seq_printf(s, ",file_mode=0%o,dir_mode=0%o",
411
cifs_sb->mnt_file_mode,
412
cifs_sb->mnt_dir_mode);
413
if (tcon->seal)
414
seq_printf(s, ",seal");
415
if (tcon->nocase)
416
seq_printf(s, ",nocase");
417
if (tcon->retry)
418
seq_printf(s, ",hard");
419
if (tcon->unix_ext)
420
seq_printf(s, ",unix");
421
else
422
seq_printf(s, ",nounix");
423
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
424
seq_printf(s, ",posixpaths");
425
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
426
seq_printf(s, ",setuids");
427
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
428
seq_printf(s, ",serverino");
429
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
430
seq_printf(s, ",rwpidforward");
431
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
432
seq_printf(s, ",forcemand");
433
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
434
seq_printf(s, ",directio");
435
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
436
seq_printf(s, ",nouser_xattr");
437
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
438
seq_printf(s, ",mapchars");
439
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
440
seq_printf(s, ",sfu");
441
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
442
seq_printf(s, ",nobrl");
443
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
444
seq_printf(s, ",cifsacl");
445
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
446
seq_printf(s, ",dynperm");
447
if (m->mnt_sb->s_flags & MS_POSIXACL)
448
seq_printf(s, ",acl");
449
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS)
450
seq_printf(s, ",mfsymlinks");
451
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_FSCACHE)
452
seq_printf(s, ",fsc");
453
454
seq_printf(s, ",rsize=%d", cifs_sb->rsize);
455
seq_printf(s, ",wsize=%d", cifs_sb->wsize);
456
/* convert actimeo and display it in seconds */
457
seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
458
459
return 0;
460
}
461
462
static void cifs_umount_begin(struct super_block *sb)
463
{
464
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
465
struct cifs_tcon *tcon;
466
467
if (cifs_sb == NULL)
468
return;
469
470
tcon = cifs_sb_master_tcon(cifs_sb);
471
472
spin_lock(&cifs_tcp_ses_lock);
473
if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
474
/* we have other mounts to same share or we have
475
already tried to force umount this and woken up
476
all waiting network requests, nothing to do */
477
spin_unlock(&cifs_tcp_ses_lock);
478
return;
479
} else if (tcon->tc_count == 1)
480
tcon->tidStatus = CifsExiting;
481
spin_unlock(&cifs_tcp_ses_lock);
482
483
/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
484
/* cancel_notify_requests(tcon); */
485
if (tcon->ses && tcon->ses->server) {
486
cFYI(1, "wake up tasks now - umount begin not complete");
487
wake_up_all(&tcon->ses->server->request_q);
488
wake_up_all(&tcon->ses->server->response_q);
489
msleep(1); /* yield */
490
/* we have to kick the requests once more */
491
wake_up_all(&tcon->ses->server->response_q);
492
msleep(1);
493
}
494
495
return;
496
}
497
498
#ifdef CONFIG_CIFS_STATS2
499
static int cifs_show_stats(struct seq_file *s, struct vfsmount *mnt)
500
{
501
/* BB FIXME */
502
return 0;
503
}
504
#endif
505
506
static int cifs_remount(struct super_block *sb, int *flags, char *data)
507
{
508
*flags |= MS_NODIRATIME;
509
return 0;
510
}
511
512
static int cifs_drop_inode(struct inode *inode)
513
{
514
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
515
516
/* no serverino => unconditional eviction */
517
return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
518
generic_drop_inode(inode);
519
}
520
521
static const struct super_operations cifs_super_ops = {
522
.statfs = cifs_statfs,
523
.alloc_inode = cifs_alloc_inode,
524
.destroy_inode = cifs_destroy_inode,
525
.drop_inode = cifs_drop_inode,
526
.evict_inode = cifs_evict_inode,
527
/* .delete_inode = cifs_delete_inode, */ /* Do not need above
528
function unless later we add lazy close of inodes or unless the
529
kernel forgets to call us with the same number of releases (closes)
530
as opens */
531
.show_options = cifs_show_options,
532
.umount_begin = cifs_umount_begin,
533
.remount_fs = cifs_remount,
534
#ifdef CONFIG_CIFS_STATS2
535
.show_stats = cifs_show_stats,
536
#endif
537
};
538
539
/*
540
* Get root dentry from superblock according to prefix path mount option.
541
* Return dentry with refcount + 1 on success and NULL otherwise.
542
*/
543
static struct dentry *
544
cifs_get_root(struct smb_vol *vol, struct super_block *sb)
545
{
546
struct dentry *dentry;
547
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
548
char *full_path = NULL;
549
char *s, *p;
550
char sep;
551
int xid;
552
553
full_path = cifs_build_path_to_root(vol, cifs_sb,
554
cifs_sb_master_tcon(cifs_sb));
555
if (full_path == NULL)
556
return ERR_PTR(-ENOMEM);
557
558
cFYI(1, "Get root dentry for %s", full_path);
559
560
xid = GetXid();
561
sep = CIFS_DIR_SEP(cifs_sb);
562
dentry = dget(sb->s_root);
563
p = s = full_path;
564
565
do {
566
struct inode *dir = dentry->d_inode;
567
struct dentry *child;
568
569
/* skip separators */
570
while (*s == sep)
571
s++;
572
if (!*s)
573
break;
574
p = s++;
575
/* next separator */
576
while (*s && *s != sep)
577
s++;
578
579
mutex_lock(&dir->i_mutex);
580
child = lookup_one_len(p, dentry, s - p);
581
mutex_unlock(&dir->i_mutex);
582
dput(dentry);
583
dentry = child;
584
} while (!IS_ERR(dentry));
585
_FreeXid(xid);
586
kfree(full_path);
587
return dentry;
588
}
589
590
static int cifs_set_super(struct super_block *sb, void *data)
591
{
592
struct cifs_mnt_data *mnt_data = data;
593
sb->s_fs_info = mnt_data->cifs_sb;
594
return set_anon_super(sb, NULL);
595
}
596
597
static struct dentry *
598
cifs_do_mount(struct file_system_type *fs_type,
599
int flags, const char *dev_name, void *data)
600
{
601
int rc;
602
struct super_block *sb;
603
struct cifs_sb_info *cifs_sb;
604
struct smb_vol *volume_info;
605
struct cifs_mnt_data mnt_data;
606
struct dentry *root;
607
608
cFYI(1, "Devname: %s flags: %d ", dev_name, flags);
609
610
volume_info = cifs_get_volume_info((char *)data, dev_name);
611
if (IS_ERR(volume_info))
612
return ERR_CAST(volume_info);
613
614
cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
615
if (cifs_sb == NULL) {
616
root = ERR_PTR(-ENOMEM);
617
goto out_nls;
618
}
619
620
cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
621
if (cifs_sb->mountdata == NULL) {
622
root = ERR_PTR(-ENOMEM);
623
goto out_cifs_sb;
624
}
625
626
cifs_setup_cifs_sb(volume_info, cifs_sb);
627
628
rc = cifs_mount(cifs_sb, volume_info);
629
if (rc) {
630
if (!(flags & MS_SILENT))
631
cERROR(1, "cifs_mount failed w/return code = %d", rc);
632
root = ERR_PTR(rc);
633
goto out_mountdata;
634
}
635
636
mnt_data.vol = volume_info;
637
mnt_data.cifs_sb = cifs_sb;
638
mnt_data.flags = flags;
639
640
sb = sget(fs_type, cifs_match_super, cifs_set_super, &mnt_data);
641
if (IS_ERR(sb)) {
642
root = ERR_CAST(sb);
643
cifs_umount(cifs_sb);
644
goto out;
645
}
646
647
if (sb->s_root) {
648
cFYI(1, "Use existing superblock");
649
cifs_umount(cifs_sb);
650
} else {
651
sb->s_flags = flags;
652
/* BB should we make this contingent on mount parm? */
653
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
654
655
rc = cifs_read_super(sb);
656
if (rc) {
657
root = ERR_PTR(rc);
658
goto out_super;
659
}
660
661
sb->s_flags |= MS_ACTIVE;
662
}
663
664
root = cifs_get_root(volume_info, sb);
665
if (IS_ERR(root))
666
goto out_super;
667
668
cFYI(1, "dentry root is: %p", root);
669
goto out;
670
671
out_super:
672
deactivate_locked_super(sb);
673
out:
674
cifs_cleanup_volume_info(volume_info);
675
return root;
676
677
out_mountdata:
678
kfree(cifs_sb->mountdata);
679
out_cifs_sb:
680
kfree(cifs_sb);
681
out_nls:
682
unload_nls(volume_info->local_nls);
683
goto out;
684
}
685
686
static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
687
unsigned long nr_segs, loff_t pos)
688
{
689
struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
690
ssize_t written;
691
int rc;
692
693
written = generic_file_aio_write(iocb, iov, nr_segs, pos);
694
695
if (CIFS_I(inode)->clientCanCacheAll)
696
return written;
697
698
rc = filemap_fdatawrite(inode->i_mapping);
699
if (rc)
700
cFYI(1, "cifs_file_aio_write: %d rc on %p inode", rc, inode);
701
702
return written;
703
}
704
705
static loff_t cifs_llseek(struct file *file, loff_t offset, int origin)
706
{
707
/* origin == SEEK_END => we must revalidate the cached file length */
708
if (origin == SEEK_END) {
709
int rc;
710
struct inode *inode = file->f_path.dentry->d_inode;
711
712
/*
713
* We need to be sure that all dirty pages are written and the
714
* server has the newest file length.
715
*/
716
if (!CIFS_I(inode)->clientCanCacheRead && inode->i_mapping &&
717
inode->i_mapping->nrpages != 0) {
718
rc = filemap_fdatawait(inode->i_mapping);
719
if (rc) {
720
mapping_set_error(inode->i_mapping, rc);
721
return rc;
722
}
723
}
724
/*
725
* Some applications poll for the file length in this strange
726
* way so we must seek to end on non-oplocked files by
727
* setting the revalidate time to zero.
728
*/
729
CIFS_I(inode)->time = 0;
730
731
rc = cifs_revalidate_file_attr(file);
732
if (rc < 0)
733
return (loff_t)rc;
734
}
735
return generic_file_llseek_unlocked(file, offset, origin);
736
}
737
738
static int cifs_setlease(struct file *file, long arg, struct file_lock **lease)
739
{
740
/* note that this is called by vfs setlease with lock_flocks held
741
to protect *lease from going away */
742
struct inode *inode = file->f_path.dentry->d_inode;
743
struct cifsFileInfo *cfile = file->private_data;
744
745
if (!(S_ISREG(inode->i_mode)))
746
return -EINVAL;
747
748
/* check if file is oplocked */
749
if (((arg == F_RDLCK) &&
750
(CIFS_I(inode)->clientCanCacheRead)) ||
751
((arg == F_WRLCK) &&
752
(CIFS_I(inode)->clientCanCacheAll)))
753
return generic_setlease(file, arg, lease);
754
else if (tlink_tcon(cfile->tlink)->local_lease &&
755
!CIFS_I(inode)->clientCanCacheRead)
756
/* If the server claims to support oplock on this
757
file, then we still need to check oplock even
758
if the local_lease mount option is set, but there
759
are servers which do not support oplock for which
760
this mount option may be useful if the user
761
knows that the file won't be changed on the server
762
by anyone else */
763
return generic_setlease(file, arg, lease);
764
else
765
return -EAGAIN;
766
}
767
768
struct file_system_type cifs_fs_type = {
769
.owner = THIS_MODULE,
770
.name = "cifs",
771
.mount = cifs_do_mount,
772
.kill_sb = cifs_kill_sb,
773
/* .fs_flags */
774
};
775
const struct inode_operations cifs_dir_inode_ops = {
776
.create = cifs_create,
777
.lookup = cifs_lookup,
778
.getattr = cifs_getattr,
779
.unlink = cifs_unlink,
780
.link = cifs_hardlink,
781
.mkdir = cifs_mkdir,
782
.rmdir = cifs_rmdir,
783
.rename = cifs_rename,
784
.permission = cifs_permission,
785
/* revalidate:cifs_revalidate, */
786
.setattr = cifs_setattr,
787
.symlink = cifs_symlink,
788
.mknod = cifs_mknod,
789
#ifdef CONFIG_CIFS_XATTR
790
.setxattr = cifs_setxattr,
791
.getxattr = cifs_getxattr,
792
.listxattr = cifs_listxattr,
793
.removexattr = cifs_removexattr,
794
#endif
795
};
796
797
const struct inode_operations cifs_file_inode_ops = {
798
/* revalidate:cifs_revalidate, */
799
.setattr = cifs_setattr,
800
.getattr = cifs_getattr, /* do we need this anymore? */
801
.rename = cifs_rename,
802
.permission = cifs_permission,
803
#ifdef CONFIG_CIFS_XATTR
804
.setxattr = cifs_setxattr,
805
.getxattr = cifs_getxattr,
806
.listxattr = cifs_listxattr,
807
.removexattr = cifs_removexattr,
808
#endif
809
};
810
811
const struct inode_operations cifs_symlink_inode_ops = {
812
.readlink = generic_readlink,
813
.follow_link = cifs_follow_link,
814
.put_link = cifs_put_link,
815
.permission = cifs_permission,
816
/* BB add the following two eventually */
817
/* revalidate: cifs_revalidate,
818
setattr: cifs_notify_change, *//* BB do we need notify change */
819
#ifdef CONFIG_CIFS_XATTR
820
.setxattr = cifs_setxattr,
821
.getxattr = cifs_getxattr,
822
.listxattr = cifs_listxattr,
823
.removexattr = cifs_removexattr,
824
#endif
825
};
826
827
const struct file_operations cifs_file_ops = {
828
.read = do_sync_read,
829
.write = do_sync_write,
830
.aio_read = generic_file_aio_read,
831
.aio_write = cifs_file_aio_write,
832
.open = cifs_open,
833
.release = cifs_close,
834
.lock = cifs_lock,
835
.fsync = cifs_fsync,
836
.flush = cifs_flush,
837
.mmap = cifs_file_mmap,
838
.splice_read = generic_file_splice_read,
839
.llseek = cifs_llseek,
840
#ifdef CONFIG_CIFS_POSIX
841
.unlocked_ioctl = cifs_ioctl,
842
#endif /* CONFIG_CIFS_POSIX */
843
.setlease = cifs_setlease,
844
};
845
846
const struct file_operations cifs_file_strict_ops = {
847
.read = do_sync_read,
848
.write = do_sync_write,
849
.aio_read = cifs_strict_readv,
850
.aio_write = cifs_strict_writev,
851
.open = cifs_open,
852
.release = cifs_close,
853
.lock = cifs_lock,
854
.fsync = cifs_strict_fsync,
855
.flush = cifs_flush,
856
.mmap = cifs_file_strict_mmap,
857
.splice_read = generic_file_splice_read,
858
.llseek = cifs_llseek,
859
#ifdef CONFIG_CIFS_POSIX
860
.unlocked_ioctl = cifs_ioctl,
861
#endif /* CONFIG_CIFS_POSIX */
862
.setlease = cifs_setlease,
863
};
864
865
const struct file_operations cifs_file_direct_ops = {
866
/* BB reevaluate whether they can be done with directio, no cache */
867
.read = do_sync_read,
868
.write = do_sync_write,
869
.aio_read = cifs_user_readv,
870
.aio_write = cifs_user_writev,
871
.open = cifs_open,
872
.release = cifs_close,
873
.lock = cifs_lock,
874
.fsync = cifs_fsync,
875
.flush = cifs_flush,
876
.mmap = cifs_file_mmap,
877
.splice_read = generic_file_splice_read,
878
#ifdef CONFIG_CIFS_POSIX
879
.unlocked_ioctl = cifs_ioctl,
880
#endif /* CONFIG_CIFS_POSIX */
881
.llseek = cifs_llseek,
882
.setlease = cifs_setlease,
883
};
884
885
const struct file_operations cifs_file_nobrl_ops = {
886
.read = do_sync_read,
887
.write = do_sync_write,
888
.aio_read = generic_file_aio_read,
889
.aio_write = cifs_file_aio_write,
890
.open = cifs_open,
891
.release = cifs_close,
892
.fsync = cifs_fsync,
893
.flush = cifs_flush,
894
.mmap = cifs_file_mmap,
895
.splice_read = generic_file_splice_read,
896
.llseek = cifs_llseek,
897
#ifdef CONFIG_CIFS_POSIX
898
.unlocked_ioctl = cifs_ioctl,
899
#endif /* CONFIG_CIFS_POSIX */
900
.setlease = cifs_setlease,
901
};
902
903
const struct file_operations cifs_file_strict_nobrl_ops = {
904
.read = do_sync_read,
905
.write = do_sync_write,
906
.aio_read = cifs_strict_readv,
907
.aio_write = cifs_strict_writev,
908
.open = cifs_open,
909
.release = cifs_close,
910
.fsync = cifs_strict_fsync,
911
.flush = cifs_flush,
912
.mmap = cifs_file_strict_mmap,
913
.splice_read = generic_file_splice_read,
914
.llseek = cifs_llseek,
915
#ifdef CONFIG_CIFS_POSIX
916
.unlocked_ioctl = cifs_ioctl,
917
#endif /* CONFIG_CIFS_POSIX */
918
.setlease = cifs_setlease,
919
};
920
921
const struct file_operations cifs_file_direct_nobrl_ops = {
922
/* BB reevaluate whether they can be done with directio, no cache */
923
.read = do_sync_read,
924
.write = do_sync_write,
925
.aio_read = cifs_user_readv,
926
.aio_write = cifs_user_writev,
927
.open = cifs_open,
928
.release = cifs_close,
929
.fsync = cifs_fsync,
930
.flush = cifs_flush,
931
.mmap = cifs_file_mmap,
932
.splice_read = generic_file_splice_read,
933
#ifdef CONFIG_CIFS_POSIX
934
.unlocked_ioctl = cifs_ioctl,
935
#endif /* CONFIG_CIFS_POSIX */
936
.llseek = cifs_llseek,
937
.setlease = cifs_setlease,
938
};
939
940
const struct file_operations cifs_dir_ops = {
941
.readdir = cifs_readdir,
942
.release = cifs_closedir,
943
.read = generic_read_dir,
944
.unlocked_ioctl = cifs_ioctl,
945
.llseek = generic_file_llseek,
946
};
947
948
static void
949
cifs_init_once(void *inode)
950
{
951
struct cifsInodeInfo *cifsi = inode;
952
953
inode_init_once(&cifsi->vfs_inode);
954
INIT_LIST_HEAD(&cifsi->lockList);
955
}
956
957
static int
958
cifs_init_inodecache(void)
959
{
960
cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
961
sizeof(struct cifsInodeInfo),
962
0, (SLAB_RECLAIM_ACCOUNT|
963
SLAB_MEM_SPREAD),
964
cifs_init_once);
965
if (cifs_inode_cachep == NULL)
966
return -ENOMEM;
967
968
return 0;
969
}
970
971
static void
972
cifs_destroy_inodecache(void)
973
{
974
kmem_cache_destroy(cifs_inode_cachep);
975
}
976
977
static int
978
cifs_init_request_bufs(void)
979
{
980
if (CIFSMaxBufSize < 8192) {
981
/* Buffer size can not be smaller than 2 * PATH_MAX since maximum
982
Unicode path name has to fit in any SMB/CIFS path based frames */
983
CIFSMaxBufSize = 8192;
984
} else if (CIFSMaxBufSize > 1024*127) {
985
CIFSMaxBufSize = 1024 * 127;
986
} else {
987
CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
988
}
989
/* cERROR(1, "CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize); */
990
cifs_req_cachep = kmem_cache_create("cifs_request",
991
CIFSMaxBufSize +
992
MAX_CIFS_HDR_SIZE, 0,
993
SLAB_HWCACHE_ALIGN, NULL);
994
if (cifs_req_cachep == NULL)
995
return -ENOMEM;
996
997
if (cifs_min_rcv < 1)
998
cifs_min_rcv = 1;
999
else if (cifs_min_rcv > 64) {
1000
cifs_min_rcv = 64;
1001
cERROR(1, "cifs_min_rcv set to maximum (64)");
1002
}
1003
1004
cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1005
cifs_req_cachep);
1006
1007
if (cifs_req_poolp == NULL) {
1008
kmem_cache_destroy(cifs_req_cachep);
1009
return -ENOMEM;
1010
}
1011
/* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1012
almost all handle based requests (but not write response, nor is it
1013
sufficient for path based requests). A smaller size would have
1014
been more efficient (compacting multiple slab items on one 4k page)
1015
for the case in which debug was on, but this larger size allows
1016
more SMBs to use small buffer alloc and is still much more
1017
efficient to alloc 1 per page off the slab compared to 17K (5page)
1018
alloc of large cifs buffers even when page debugging is on */
1019
cifs_sm_req_cachep = kmem_cache_create("cifs_small_rq",
1020
MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
1021
NULL);
1022
if (cifs_sm_req_cachep == NULL) {
1023
mempool_destroy(cifs_req_poolp);
1024
kmem_cache_destroy(cifs_req_cachep);
1025
return -ENOMEM;
1026
}
1027
1028
if (cifs_min_small < 2)
1029
cifs_min_small = 2;
1030
else if (cifs_min_small > 256) {
1031
cifs_min_small = 256;
1032
cFYI(1, "cifs_min_small set to maximum (256)");
1033
}
1034
1035
cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1036
cifs_sm_req_cachep);
1037
1038
if (cifs_sm_req_poolp == NULL) {
1039
mempool_destroy(cifs_req_poolp);
1040
kmem_cache_destroy(cifs_req_cachep);
1041
kmem_cache_destroy(cifs_sm_req_cachep);
1042
return -ENOMEM;
1043
}
1044
1045
return 0;
1046
}
1047
1048
static void
1049
cifs_destroy_request_bufs(void)
1050
{
1051
mempool_destroy(cifs_req_poolp);
1052
kmem_cache_destroy(cifs_req_cachep);
1053
mempool_destroy(cifs_sm_req_poolp);
1054
kmem_cache_destroy(cifs_sm_req_cachep);
1055
}
1056
1057
static int
1058
cifs_init_mids(void)
1059
{
1060
cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
1061
sizeof(struct mid_q_entry), 0,
1062
SLAB_HWCACHE_ALIGN, NULL);
1063
if (cifs_mid_cachep == NULL)
1064
return -ENOMEM;
1065
1066
/* 3 is a reasonable minimum number of simultaneous operations */
1067
cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
1068
if (cifs_mid_poolp == NULL) {
1069
kmem_cache_destroy(cifs_mid_cachep);
1070
return -ENOMEM;
1071
}
1072
1073
return 0;
1074
}
1075
1076
static void
1077
cifs_destroy_mids(void)
1078
{
1079
mempool_destroy(cifs_mid_poolp);
1080
kmem_cache_destroy(cifs_mid_cachep);
1081
}
1082
1083
static int __init
1084
init_cifs(void)
1085
{
1086
int rc = 0;
1087
cifs_proc_init();
1088
INIT_LIST_HEAD(&cifs_tcp_ses_list);
1089
#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
1090
INIT_LIST_HEAD(&GlobalDnotifyReqList);
1091
INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
1092
#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1093
/*
1094
* Initialize Global counters
1095
*/
1096
atomic_set(&sesInfoAllocCount, 0);
1097
atomic_set(&tconInfoAllocCount, 0);
1098
atomic_set(&tcpSesAllocCount, 0);
1099
atomic_set(&tcpSesReconnectCount, 0);
1100
atomic_set(&tconInfoReconnectCount, 0);
1101
1102
atomic_set(&bufAllocCount, 0);
1103
atomic_set(&smBufAllocCount, 0);
1104
#ifdef CONFIG_CIFS_STATS2
1105
atomic_set(&totBufAllocCount, 0);
1106
atomic_set(&totSmBufAllocCount, 0);
1107
#endif /* CONFIG_CIFS_STATS2 */
1108
1109
atomic_set(&midCount, 0);
1110
GlobalCurrentXid = 0;
1111
GlobalTotalActiveXid = 0;
1112
GlobalMaxActiveXid = 0;
1113
spin_lock_init(&cifs_tcp_ses_lock);
1114
spin_lock_init(&cifs_file_list_lock);
1115
spin_lock_init(&GlobalMid_Lock);
1116
1117
if (cifs_max_pending < 2) {
1118
cifs_max_pending = 2;
1119
cFYI(1, "cifs_max_pending set to min of 2");
1120
} else if (cifs_max_pending > 256) {
1121
cifs_max_pending = 256;
1122
cFYI(1, "cifs_max_pending set to max of 256");
1123
}
1124
1125
rc = cifs_fscache_register();
1126
if (rc)
1127
goto out_clean_proc;
1128
1129
rc = cifs_init_inodecache();
1130
if (rc)
1131
goto out_unreg_fscache;
1132
1133
rc = cifs_init_mids();
1134
if (rc)
1135
goto out_destroy_inodecache;
1136
1137
rc = cifs_init_request_bufs();
1138
if (rc)
1139
goto out_destroy_mids;
1140
1141
#ifdef CONFIG_CIFS_UPCALL
1142
rc = register_key_type(&cifs_spnego_key_type);
1143
if (rc)
1144
goto out_destroy_request_bufs;
1145
#endif /* CONFIG_CIFS_UPCALL */
1146
1147
#ifdef CONFIG_CIFS_ACL
1148
rc = init_cifs_idmap();
1149
if (rc)
1150
goto out_register_key_type;
1151
#endif /* CONFIG_CIFS_ACL */
1152
1153
rc = register_filesystem(&cifs_fs_type);
1154
if (rc)
1155
goto out_init_cifs_idmap;
1156
1157
return 0;
1158
1159
out_init_cifs_idmap:
1160
#ifdef CONFIG_CIFS_ACL
1161
exit_cifs_idmap();
1162
out_register_key_type:
1163
#endif
1164
#ifdef CONFIG_CIFS_UPCALL
1165
unregister_key_type(&cifs_spnego_key_type);
1166
out_destroy_request_bufs:
1167
#endif
1168
cifs_destroy_request_bufs();
1169
out_destroy_mids:
1170
cifs_destroy_mids();
1171
out_destroy_inodecache:
1172
cifs_destroy_inodecache();
1173
out_unreg_fscache:
1174
cifs_fscache_unregister();
1175
out_clean_proc:
1176
cifs_proc_clean();
1177
return rc;
1178
}
1179
1180
static void __exit
1181
exit_cifs(void)
1182
{
1183
cFYI(DBG2, "exit_cifs");
1184
cifs_proc_clean();
1185
cifs_fscache_unregister();
1186
#ifdef CONFIG_CIFS_DFS_UPCALL
1187
cifs_dfs_release_automount_timer();
1188
#endif
1189
#ifdef CONFIG_CIFS_ACL
1190
cifs_destroy_idmaptrees();
1191
exit_cifs_idmap();
1192
#endif
1193
#ifdef CONFIG_CIFS_UPCALL
1194
unregister_key_type(&cifs_spnego_key_type);
1195
#endif
1196
unregister_filesystem(&cifs_fs_type);
1197
cifs_destroy_inodecache();
1198
cifs_destroy_mids();
1199
cifs_destroy_request_bufs();
1200
}
1201
1202
MODULE_AUTHOR("Steve French <[email protected]>");
1203
MODULE_LICENSE("GPL"); /* combination of LGPL + GPL source behaves as GPL */
1204
MODULE_DESCRIPTION
1205
("VFS to access servers complying with the SNIA CIFS Specification "
1206
"e.g. Samba and Windows");
1207
MODULE_VERSION(CIFS_VERSION);
1208
module_init(init_cifs)
1209
module_exit(exit_cifs)
1210
1211