1/*
2 *  linux/fs/open.c
3 *
4 *  Copyright (C) 1991, 1992  Linus Torvalds
5 */
6
7#include <linux/string.h>
8#include <linux/mm.h>
9#include <linux/file.h>
10#include <linux/quotaops.h>
11#include <linux/fsnotify.h>
12#include <linux/module.h>
13#include <linux/slab.h>
14#include <linux/tty.h>
15#include <linux/namei.h>
16#include <linux/backing-dev.h>
17#include <linux/capability.h>
18#include <linux/security.h>
19#include <linux/mount.h>
20#include <linux/vfs.h>
21#include <linux/fcntl.h>
22#include <asm/uaccess.h>
23#include <linux/fs.h>
24#include <linux/personality.h>
25#include <linux/pagemap.h>
26#include <linux/syscalls.h>
27#include <linux/rcupdate.h>
28#include <linux/audit.h>
29
30int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)
31{
32	int retval = -ENODEV;
33
34	if (dentry) {
35		retval = -ENOSYS;
36		if (dentry->d_sb->s_op->statfs) {
37			memset(buf, 0, sizeof(*buf));
38			retval = security_sb_statfs(dentry);
39			if (retval)
40				return retval;
41			retval = dentry->d_sb->s_op->statfs(dentry, buf);
42			if (retval == 0 && buf->f_frsize == 0)
43				buf->f_frsize = buf->f_bsize;
44		}
45	}
46	return retval;
47}
48
49EXPORT_SYMBOL(vfs_statfs);
50
51static int vfs_statfs_native(struct dentry *dentry, struct statfs *buf)
52{
53	struct kstatfs st;
54	int retval;
55
56	retval = vfs_statfs(dentry, &st);
57	if (retval)
58		return retval;
59
60	if (sizeof(*buf) == sizeof(st))
61		memcpy(buf, &st, sizeof(st));
62	else {
63		if (sizeof buf->f_blocks == 4) {
64			if ((st.f_blocks | st.f_bfree | st.f_bavail) &
65			    0xffffffff00000000ULL)
66				return -EOVERFLOW;
67			/*
68			 * f_files and f_ffree may be -1; it's okay to stuff
69			 * that into 32 bits
70			 */
71			if (st.f_files != -1 &&
72			    (st.f_files & 0xffffffff00000000ULL))
73				return -EOVERFLOW;
74			if (st.f_ffree != -1 &&
75			    (st.f_ffree & 0xffffffff00000000ULL))
76				return -EOVERFLOW;
77		}
78
79		buf->f_type = st.f_type;
80		buf->f_bsize = st.f_bsize;
81		buf->f_blocks = st.f_blocks;
82		buf->f_bfree = st.f_bfree;
83		buf->f_bavail = st.f_bavail;
84		buf->f_files = st.f_files;
85		buf->f_ffree = st.f_ffree;
86		buf->f_fsid = st.f_fsid;
87		buf->f_namelen = st.f_namelen;
88		buf->f_frsize = st.f_frsize;
89		memset(buf->f_spare, 0, sizeof(buf->f_spare));
90	}
91	return 0;
92}
93
94static int vfs_statfs64(struct dentry *dentry, struct statfs64 *buf)
95{
96	struct kstatfs st;
97	int retval;
98
99	retval = vfs_statfs(dentry, &st);
100	if (retval)
101		return retval;
102
103	if (sizeof(*buf) == sizeof(st))
104		memcpy(buf, &st, sizeof(st));
105	else {
106		buf->f_type = st.f_type;
107		buf->f_bsize = st.f_bsize;
108		buf->f_blocks = st.f_blocks;
109		buf->f_bfree = st.f_bfree;
110		buf->f_bavail = st.f_bavail;
111		buf->f_files = st.f_files;
112		buf->f_ffree = st.f_ffree;
113		buf->f_fsid = st.f_fsid;
114		buf->f_namelen = st.f_namelen;
115		buf->f_frsize = st.f_frsize;
116		memset(buf->f_spare, 0, sizeof(buf->f_spare));
117	}
118	return 0;
119}
120
121asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf)
122{
123	struct nameidata nd;
124	int error;
125
126	error = user_path_walk(path, &nd);
127	if (!error) {
128		struct statfs tmp;
129		error = vfs_statfs_native(nd.dentry, &tmp);
130		if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
131			error = -EFAULT;
132		path_release(&nd);
133	}
134	return error;
135}
136
137
138asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64 __user *buf)
139{
140	struct nameidata nd;
141	long error;
142
143	if (sz != sizeof(*buf))
144		return -EINVAL;
145	error = user_path_walk(path, &nd);
146	if (!error) {
147		struct statfs64 tmp;
148		error = vfs_statfs64(nd.dentry, &tmp);
149		if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
150			error = -EFAULT;
151		path_release(&nd);
152	}
153	return error;
154}
155
156
157asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf)
158{
159	struct file * file;
160	struct statfs tmp;
161	int error;
162
163	error = -EBADF;
164	file = fget(fd);
165	if (!file)
166		goto out;
167	error = vfs_statfs_native(file->f_path.dentry, &tmp);
168	if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
169		error = -EFAULT;
170	fput(file);
171out:
172	return error;
173}
174
175asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user *buf)
176{
177	struct file * file;
178	struct statfs64 tmp;
179	int error;
180
181	if (sz != sizeof(*buf))
182		return -EINVAL;
183
184	error = -EBADF;
185	file = fget(fd);
186	if (!file)
187		goto out;
188	error = vfs_statfs64(file->f_path.dentry, &tmp);
189	if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
190		error = -EFAULT;
191	fput(file);
192out:
193	return error;
194}
195
196int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
197	struct file *filp)
198{
199	int err;
200	struct iattr newattrs;
201
202	/* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
203	if (length < 0)
204		return -EINVAL;
205
206	newattrs.ia_size = length;
207	newattrs.ia_valid = ATTR_SIZE | time_attrs;
208	if (filp) {
209		newattrs.ia_file = filp;
210		newattrs.ia_valid |= ATTR_FILE;
211	}
212
213	/* Remove suid/sgid on truncate too */
214	newattrs.ia_valid |= should_remove_suid(dentry);
215
216	mutex_lock(&dentry->d_inode->i_mutex);
217	err = notify_change(dentry, &newattrs);
218	mutex_unlock(&dentry->d_inode->i_mutex);
219	return err;
220}
221
222static long do_sys_truncate(const char __user * path, loff_t length)
223{
224	struct nameidata nd;
225	struct inode * inode;
226	int error;
227
228	error = -EINVAL;
229	if (length < 0)	/* sorry, but loff_t says... */
230		goto out;
231
232	error = user_path_walk(path, &nd);
233	if (error)
234		goto out;
235	inode = nd.dentry->d_inode;
236
237	/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
238	error = -EISDIR;
239	if (S_ISDIR(inode->i_mode))
240		goto dput_and_out;
241
242	error = -EINVAL;
243	if (!S_ISREG(inode->i_mode))
244		goto dput_and_out;
245
246	error = vfs_permission(&nd, MAY_WRITE);
247	if (error)
248		goto dput_and_out;
249
250	error = -EROFS;
251	if (IS_RDONLY(inode))
252		goto dput_and_out;
253
254	error = -EPERM;
255	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
256		goto dput_and_out;
257
258	/*
259	 * Make sure that there are no leases.
260	 */
261	error = break_lease(inode, FMODE_WRITE);
262	if (error)
263		goto dput_and_out;
264
265	error = get_write_access(inode);
266	if (error)
267		goto dput_and_out;
268
269	error = locks_verify_truncate(inode, NULL, length);
270	if (!error) {
271		DQUOT_INIT(inode);
272		error = do_truncate(nd.dentry, length, 0, NULL);
273	}
274	put_write_access(inode);
275
276dput_and_out:
277	path_release(&nd);
278out:
279	return error;
280}
281
282asmlinkage long sys_truncate(const char __user * path, unsigned long length)
283{
284	/* on 32-bit boxen it will cut the range 2^31--2^32-1 off */
285	return do_sys_truncate(path, (long)length);
286}
287
288static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
289{
290	struct inode * inode;
291	struct dentry *dentry;
292	struct file * file;
293	int error;
294
295	error = -EINVAL;
296	if (length < 0)
297		goto out;
298	error = -EBADF;
299	file = fget(fd);
300	if (!file)
301		goto out;
302
303	/* explicitly opened as large or we are on 64-bit box */
304	if (file->f_flags & O_LARGEFILE)
305		small = 0;
306
307	dentry = file->f_path.dentry;
308	inode = dentry->d_inode;
309	error = -EINVAL;
310	if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
311		goto out_putf;
312
313	error = -EINVAL;
314
315    /* Foxconn modified start pling 12/04/2009 */
316    /* Remove large file limitation */
317#if (!defined SAMBA_ENABLE)
318	/* Cannot ftruncate over 2^31 bytes without large file support */
319	if (small && length > MAX_NON_LFS)
320		goto out_putf;
321#endif
322    /* Foxconn modified end pling 12/04/2009 */
323
324	error = -EPERM;
325	if (IS_APPEND(inode))
326		goto out_putf;
327
328	error = locks_verify_truncate(inode, file, length);
329	if (!error)
330		error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file);
331out_putf:
332	fput(file);
333out:
334	return error;
335}
336
337asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)
338{
339	long ret = do_sys_ftruncate(fd, length, 1);
340	/* avoid REGPARM breakage on x86: */
341	prevent_tail_call(ret);
342	return ret;
343}
344
345/* LFS versions of truncate are only needed on 32 bit machines */
346#if BITS_PER_LONG == 32
347asmlinkage long sys_truncate64(const char __user * path, loff_t length)
348{
349	return do_sys_truncate(path, length);
350}
351
352asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length)
353{
354	long ret = do_sys_ftruncate(fd, length, 0);
355	/* avoid REGPARM breakage on x86: */
356	prevent_tail_call(ret);
357	return ret;
358}
359#endif
360
361/*
362 * access() needs to use the real uid/gid, not the effective uid/gid.
363 * We do this by temporarily clearing all FS-related capabilities and
364 * switching the fsuid/fsgid around to the real ones.
365 */
366asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode)
367{
368	struct nameidata nd;
369	int old_fsuid, old_fsgid;
370	kernel_cap_t old_cap;
371	int res;
372
373	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
374		return -EINVAL;
375
376	old_fsuid = current->fsuid;
377	old_fsgid = current->fsgid;
378	old_cap = current->cap_effective;
379
380	current->fsuid = current->uid;
381	current->fsgid = current->gid;
382
383	if (current->uid)
384		cap_clear(current->cap_effective);
385	else
386		current->cap_effective = current->cap_permitted;
387
388	res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd);
389	if (res)
390		goto out;
391
392	res = vfs_permission(&nd, mode);
393	/* SuS v2 requires we report a read only fs too */
394	if(res || !(mode & S_IWOTH) ||
395	   special_file(nd.dentry->d_inode->i_mode))
396		goto out_path_release;
397
398	if(IS_RDONLY(nd.dentry->d_inode))
399		res = -EROFS;
400
401out_path_release:
402	path_release(&nd);
403out:
404	current->fsuid = old_fsuid;
405	current->fsgid = old_fsgid;
406	current->cap_effective = old_cap;
407
408	return res;
409}
410
411asmlinkage long sys_access(const char __user *filename, int mode)
412{
413	return sys_faccessat(AT_FDCWD, filename, mode);
414}
415
416asmlinkage long sys_chdir(const char __user * filename)
417{
418	struct nameidata nd;
419	int error;
420
421	error = __user_walk(filename,
422			    LOOKUP_FOLLOW|LOOKUP_DIRECTORY|LOOKUP_CHDIR, &nd);
423	if (error)
424		goto out;
425
426	error = vfs_permission(&nd, MAY_EXEC);
427	if (error)
428		goto dput_and_out;
429
430	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
431
432dput_and_out:
433	path_release(&nd);
434out:
435	return error;
436}
437
438asmlinkage long sys_fchdir(unsigned int fd)
439{
440	struct file *file;
441	struct dentry *dentry;
442	struct inode *inode;
443	struct vfsmount *mnt;
444	int error;
445
446	error = -EBADF;
447	file = fget(fd);
448	if (!file)
449		goto out;
450
451	dentry = file->f_path.dentry;
452	mnt = file->f_path.mnt;
453	inode = dentry->d_inode;
454
455	error = -ENOTDIR;
456	if (!S_ISDIR(inode->i_mode))
457		goto out_putf;
458
459	error = file_permission(file, MAY_EXEC);
460	if (!error)
461		set_fs_pwd(current->fs, mnt, dentry);
462out_putf:
463	fput(file);
464out:
465	return error;
466}
467
468asmlinkage long sys_chroot(const char __user * filename)
469{
470	struct nameidata nd;
471	int error;
472
473	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
474	if (error)
475		goto out;
476
477	error = vfs_permission(&nd, MAY_EXEC);
478	if (error)
479		goto dput_and_out;
480
481	error = -EPERM;
482	if (!capable(CAP_SYS_CHROOT))
483		goto dput_and_out;
484
485	set_fs_root(current->fs, nd.mnt, nd.dentry);
486	set_fs_altroot();
487	error = 0;
488dput_and_out:
489	path_release(&nd);
490out:
491	return error;
492}
493
494asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
495{
496	struct inode * inode;
497	struct dentry * dentry;
498	struct file * file;
499	int err = -EBADF;
500	struct iattr newattrs;
501
502	file = fget(fd);
503	if (!file)
504		goto out;
505
506	dentry = file->f_path.dentry;
507	inode = dentry->d_inode;
508
509	audit_inode(NULL, inode);
510
511	err = -EROFS;
512	if (IS_RDONLY(inode))
513		goto out_putf;
514	err = -EPERM;
515	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
516		goto out_putf;
517	mutex_lock(&inode->i_mutex);
518	if (mode == (mode_t) -1)
519		mode = inode->i_mode;
520	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
521	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
522	err = notify_change(dentry, &newattrs);
523	mutex_unlock(&inode->i_mutex);
524
525out_putf:
526	fput(file);
527out:
528	return err;
529}
530
531asmlinkage long sys_fchmodat(int dfd, const char __user *filename,
532			     mode_t mode)
533{
534	struct nameidata nd;
535	struct inode * inode;
536	int error;
537	struct iattr newattrs;
538
539	error = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW, &nd);
540	if (error)
541		goto out;
542	inode = nd.dentry->d_inode;
543
544	error = -EROFS;
545	if (IS_RDONLY(inode))
546		goto dput_and_out;
547
548	error = -EPERM;
549	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
550		goto dput_and_out;
551
552	mutex_lock(&inode->i_mutex);
553	if (mode == (mode_t) -1)
554		mode = inode->i_mode;
555	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
556	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
557	error = notify_change(nd.dentry, &newattrs);
558	mutex_unlock(&inode->i_mutex);
559
560dput_and_out:
561	path_release(&nd);
562out:
563	return error;
564}
565
566asmlinkage long sys_chmod(const char __user *filename, mode_t mode)
567{
568	return sys_fchmodat(AT_FDCWD, filename, mode);
569}
570
571static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
572{
573	struct inode * inode;
574	int error;
575	struct iattr newattrs;
576
577	error = -ENOENT;
578	if (!(inode = dentry->d_inode)) {
579		printk(KERN_ERR "chown_common: NULL inode\n");
580		goto out;
581	}
582	error = -EROFS;
583	if (IS_RDONLY(inode))
584		goto out;
585	error = -EPERM;
586	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
587		goto out;
588	newattrs.ia_valid =  ATTR_CTIME;
589	if (user != (uid_t) -1) {
590		newattrs.ia_valid |= ATTR_UID;
591		newattrs.ia_uid = user;
592	}
593	if (group != (gid_t) -1) {
594		newattrs.ia_valid |= ATTR_GID;
595		newattrs.ia_gid = group;
596	}
597	if (!S_ISDIR(inode->i_mode))
598		newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
599	mutex_lock(&inode->i_mutex);
600	error = notify_change(dentry, &newattrs);
601	mutex_unlock(&inode->i_mutex);
602out:
603	return error;
604}
605
606asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group)
607{
608	struct nameidata nd;
609	int error;
610
611	error = user_path_walk(filename, &nd);
612	if (error)
613		goto out;
614	error = chown_common(nd.dentry, user, group);
615	path_release(&nd);
616out:
617	return error;
618}
619
620asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,
621			     gid_t group, int flag)
622{
623	struct nameidata nd;
624	int error = -EINVAL;
625	int follow;
626
627	if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
628		goto out;
629
630	follow = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW;
631	error = __user_walk_fd(dfd, filename, follow, &nd);
632	if (error)
633		goto out;
634	error = chown_common(nd.dentry, user, group);
635	path_release(&nd);
636out:
637	return error;
638}
639
640asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group)
641{
642	struct nameidata nd;
643	int error;
644
645	error = user_path_walk_link(filename, &nd);
646	if (error)
647		goto out;
648	error = chown_common(nd.dentry, user, group);
649	path_release(&nd);
650out:
651	return error;
652}
653
654
655asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group)
656{
657	struct file * file;
658	int error = -EBADF;
659	struct dentry * dentry;
660
661	file = fget(fd);
662	if (!file)
663		goto out;
664
665	dentry = file->f_path.dentry;
666	audit_inode(NULL, dentry->d_inode);
667	error = chown_common(dentry, user, group);
668	fput(file);
669out:
670	return error;
671}
672
673static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
674					int flags, struct file *f,
675					int (*open)(struct inode *, struct file *))
676{
677	struct inode *inode;
678	int error;
679
680	f->f_flags = flags;
681	f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK |
682				FMODE_PREAD | FMODE_PWRITE;
683	inode = dentry->d_inode;
684	if (f->f_mode & FMODE_WRITE) {
685		error = get_write_access(inode);
686		if (error)
687			goto cleanup_file;
688	}
689
690	f->f_mapping = inode->i_mapping;
691	f->f_path.dentry = dentry;
692	f->f_path.mnt = mnt;
693	f->f_pos = 0;
694	f->f_op = fops_get(inode->i_fop);
695	file_move(f, &inode->i_sb->s_files);
696
697	if (!open && f->f_op)
698		open = f->f_op->open;
699	if (open) {
700		error = open(inode, f);
701		if (error)
702			goto cleanup_all;
703	}
704
705	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
706
707	file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
708
709	/* NB: we're sure to have correct a_ops only after f_op->open */
710	if (f->f_flags & O_DIRECT) {
711		if (!f->f_mapping->a_ops ||
712		    ((!f->f_mapping->a_ops->direct_IO) &&
713		    (!f->f_mapping->a_ops->get_xip_page))) {
714			fput(f);
715			f = ERR_PTR(-EINVAL);
716		}
717	}
718
719	return f;
720
721cleanup_all:
722	fops_put(f->f_op);
723	if (f->f_mode & FMODE_WRITE)
724		put_write_access(inode);
725	file_kill(f);
726	f->f_path.dentry = NULL;
727	f->f_path.mnt = NULL;
728cleanup_file:
729	put_filp(f);
730	dput(dentry);
731	mntput(mnt);
732	return ERR_PTR(error);
733}
734
735/*
736 * Note that while the flag value (low two bits) for sys_open means:
737 *	00 - read-only
738 *	01 - write-only
739 *	10 - read-write
740 *	11 - special
741 * it is changed into
742 *	00 - no permissions needed
743 *	01 - read-permission
744 *	10 - write-permission
745 *	11 - read-write
746 * for the internal routines (ie open_namei()/follow_link() etc). 00 is
747 * used by symlinks.
748 */
749static struct file *do_filp_open(int dfd, const char *filename, int flags,
750				 int mode)
751{
752	int namei_flags, error;
753	struct nameidata nd;
754
755	namei_flags = flags;
756	if ((namei_flags+1) & O_ACCMODE)
757		namei_flags++;
758
759	error = open_namei(dfd, filename, namei_flags, mode, &nd);
760	if (!error)
761		return nameidata_to_filp(&nd, flags);
762
763	return ERR_PTR(error);
764}
765
766struct file *filp_open(const char *filename, int flags, int mode)
767{
768	return do_filp_open(AT_FDCWD, filename, flags, mode);
769}
770EXPORT_SYMBOL(filp_open);
771
772/**
773 * lookup_instantiate_filp - instantiates the open intent filp
774 * @nd: pointer to nameidata
775 * @dentry: pointer to dentry
776 * @open: open callback
777 *
778 * Helper for filesystems that want to use lookup open intents and pass back
779 * a fully instantiated struct file to the caller.
780 * This function is meant to be called from within a filesystem's
781 * lookup method.
782 * Beware of calling it for non-regular files! Those ->open methods might block
783 * (e.g. in fifo_open), leaving you with parent locked (and in case of fifo,
784 * leading to a deadlock, as nobody can open that fifo anymore, because
785 * another process to open fifo will block on locked parent when doing lookup).
786 * Note that in case of error, nd->intent.open.file is destroyed, but the
787 * path information remains valid.
788 * If the open callback is set to NULL, then the standard f_op->open()
789 * filesystem callback is substituted.
790 */
791struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
792		int (*open)(struct inode *, struct file *))
793{
794	if (IS_ERR(nd->intent.open.file))
795		goto out;
796	if (IS_ERR(dentry))
797		goto out_err;
798	nd->intent.open.file = __dentry_open(dget(dentry), mntget(nd->mnt),
799					     nd->intent.open.flags - 1,
800					     nd->intent.open.file,
801					     open);
802out:
803	return nd->intent.open.file;
804out_err:
805	release_open_intent(nd);
806	nd->intent.open.file = (struct file *)dentry;
807	goto out;
808}
809EXPORT_SYMBOL_GPL(lookup_instantiate_filp);
810
811/**
812 * nameidata_to_filp - convert a nameidata to an open filp.
813 * @nd: pointer to nameidata
814 * @flags: open flags
815 *
816 * Note that this function destroys the original nameidata
817 */
818struct file *nameidata_to_filp(struct nameidata *nd, int flags)
819{
820	struct file *filp;
821
822	/* Pick up the filp from the open intent */
823	filp = nd->intent.open.file;
824	/* Has the filesystem initialised the file for us? */
825	if (filp->f_path.dentry == NULL)
826		filp = __dentry_open(nd->dentry, nd->mnt, flags, filp, NULL);
827	else
828		path_release(nd);
829	return filp;
830}
831
832/*
833 * dentry_open() will have done dput(dentry) and mntput(mnt) if it returns an
834 * error.
835 */
836struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
837{
838	int error;
839	struct file *f;
840
841	error = -ENFILE;
842	f = get_empty_filp();
843	if (f == NULL) {
844		dput(dentry);
845		mntput(mnt);
846		return ERR_PTR(error);
847	}
848
849	return __dentry_open(dentry, mnt, flags, f, NULL);
850}
851EXPORT_SYMBOL(dentry_open);
852
853/*
854 * Find an empty file descriptor entry, and mark it busy.
855 */
856int get_unused_fd(void)
857{
858	struct files_struct * files = current->files;
859	int fd, error;
860	struct fdtable *fdt;
861
862  	error = -EMFILE;
863	spin_lock(&files->file_lock);
864
865repeat:
866	fdt = files_fdtable(files);
867	fd = find_next_zero_bit(fdt->open_fds->fds_bits, fdt->max_fds,
868				files->next_fd);
869
870	/*
871	 * N.B. For clone tasks sharing a files structure, this test
872	 * will limit the total number of files that can be opened.
873	 */
874	if (fd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
875		goto out;
876
877	/* Do we need to expand the fd array or fd set?  */
878	error = expand_files(files, fd);
879	if (error < 0)
880		goto out;
881
882	if (error) {
883		/*
884	 	 * If we needed to expand the fs array we
885		 * might have blocked - try again.
886		 */
887		error = -EMFILE;
888		goto repeat;
889	}
890
891	FD_SET(fd, fdt->open_fds);
892	FD_CLR(fd, fdt->close_on_exec);
893	files->next_fd = fd + 1;
894	/* Sanity check */
895	if (fdt->fd[fd] != NULL) {
896		printk(KERN_WARNING "get_unused_fd: slot %d not NULL!\n", fd);
897		fdt->fd[fd] = NULL;
898	}
899	error = fd;
900
901out:
902	spin_unlock(&files->file_lock);
903	return error;
904}
905
906EXPORT_SYMBOL(get_unused_fd);
907
908static void __put_unused_fd(struct files_struct *files, unsigned int fd)
909{
910	struct fdtable *fdt = files_fdtable(files);
911	__FD_CLR(fd, fdt->open_fds);
912	if (fd < files->next_fd)
913		files->next_fd = fd;
914}
915
916void fastcall put_unused_fd(unsigned int fd)
917{
918	struct files_struct *files = current->files;
919	spin_lock(&files->file_lock);
920	__put_unused_fd(files, fd);
921	spin_unlock(&files->file_lock);
922}
923
924EXPORT_SYMBOL(put_unused_fd);
925
926/*
927 * Install a file pointer in the fd array.
928 *
929 * The VFS is full of places where we drop the files lock between
930 * setting the open_fds bitmap and installing the file in the file
931 * array.  At any such point, we are vulnerable to a dup2() race
932 * installing a file in the array before us.  We need to detect this and
933 * fput() the struct file we are about to overwrite in this case.
934 *
935 * It should never happen - if we allow dup2() do it, _really_ bad things
936 * will follow.
937 */
938
939void fastcall fd_install(unsigned int fd, struct file * file)
940{
941	struct files_struct *files = current->files;
942	struct fdtable *fdt;
943	spin_lock(&files->file_lock);
944	fdt = files_fdtable(files);
945	BUG_ON(fdt->fd[fd] != NULL);
946	rcu_assign_pointer(fdt->fd[fd], file);
947	spin_unlock(&files->file_lock);
948}
949
950EXPORT_SYMBOL(fd_install);
951
952long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
953{
954	char *tmp = getname(filename);
955	int fd = PTR_ERR(tmp);
956
957	if (!IS_ERR(tmp)) {
958		fd = get_unused_fd();
959		if (fd >= 0) {
960			struct file *f = do_filp_open(dfd, tmp, flags, mode);
961			if (IS_ERR(f)) {
962				put_unused_fd(fd);
963				fd = PTR_ERR(f);
964			} else {
965				fsnotify_open(f->f_path.dentry);
966				fd_install(fd, f);
967			}
968		}
969		putname(tmp);
970	}
971	return fd;
972}
973
974asmlinkage long sys_open(const char __user *filename, int flags, int mode)
975{
976	long ret;
977
978	if (force_o_largefile())
979		flags |= O_LARGEFILE;
980
981	ret = do_sys_open(AT_FDCWD, filename, flags, mode);
982	/* avoid REGPARM breakage on x86: */
983	prevent_tail_call(ret);
984	return ret;
985}
986EXPORT_SYMBOL_GPL(sys_open);
987
988asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
989			   int mode)
990{
991	long ret;
992
993	if (force_o_largefile())
994		flags |= O_LARGEFILE;
995
996	ret = do_sys_open(dfd, filename, flags, mode);
997	/* avoid REGPARM breakage on x86: */
998	prevent_tail_call(ret);
999	return ret;
1000}
1001
1002#ifndef __alpha__
1003
1004/*
1005 * For backward compatibility?  Maybe this should be moved
1006 * into arch/i386 instead?
1007 */
1008asmlinkage long sys_creat(const char __user * pathname, int mode)
1009{
1010	return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
1011}
1012
1013#endif
1014
1015/*
1016 * "id" is the POSIX thread ID. We use the
1017 * files pointer for this..
1018 */
1019int filp_close(struct file *filp, fl_owner_t id)
1020{
1021	int retval = 0;
1022
1023	if (!file_count(filp)) {
1024		printk(KERN_ERR "VFS: Close: file count is 0\n");
1025		return 0;
1026	}
1027
1028	if (filp->f_op && filp->f_op->flush)
1029		retval = filp->f_op->flush(filp, id);
1030
1031	dnotify_flush(filp, id);
1032	locks_remove_posix(filp, id);
1033	fput(filp);
1034	return retval;
1035}
1036
1037EXPORT_SYMBOL(filp_close);
1038
1039/*
1040 * Careful here! We test whether the file pointer is NULL before
1041 * releasing the fd. This ensures that one clone task can't release
1042 * an fd while another clone is opening it.
1043 */
1044asmlinkage long sys_close(unsigned int fd)
1045{
1046	struct file * filp;
1047	struct files_struct *files = current->files;
1048	struct fdtable *fdt;
1049	int retval;
1050
1051	spin_lock(&files->file_lock);
1052	fdt = files_fdtable(files);
1053	if (fd >= fdt->max_fds)
1054		goto out_unlock;
1055	filp = fdt->fd[fd];
1056	if (!filp)
1057		goto out_unlock;
1058	rcu_assign_pointer(fdt->fd[fd], NULL);
1059	FD_CLR(fd, fdt->close_on_exec);
1060	__put_unused_fd(files, fd);
1061	spin_unlock(&files->file_lock);
1062	retval = filp_close(filp, files);
1063
1064	/* can't restart close syscall because file table entry was cleared */
1065	if (unlikely(retval == -ERESTARTSYS ||
1066		     retval == -ERESTARTNOINTR ||
1067		     retval == -ERESTARTNOHAND ||
1068		     retval == -ERESTART_RESTARTBLOCK))
1069		retval = -EINTR;
1070
1071	return retval;
1072
1073out_unlock:
1074	spin_unlock(&files->file_lock);
1075	return -EBADF;
1076}
1077
1078EXPORT_SYMBOL(sys_close);
1079
1080/*
1081 * This routine simulates a hangup on the tty, to arrange that users
1082 * are given clean terminals at login time.
1083 */
1084asmlinkage long sys_vhangup(void)
1085{
1086	if (capable(CAP_SYS_TTY_CONFIG)) {
1087		tty_vhangup(current->signal->tty);
1088		return 0;
1089	}
1090	return -EPERM;
1091}
1092
1093/*
1094 * Called when an inode is about to be open.
1095 * We use this to disallow opening large files on 32bit systems if
1096 * the caller didn't specify O_LARGEFILE.  On 64bit systems we force
1097 * on this flag in sys_open.
1098 */
1099int generic_file_open(struct inode * inode, struct file * filp)
1100{
1101    /* Foxconn modifed start pling 06/12/2009 */
1102    /* remove "big file" limitation */
1103#if (!defined SAMBA_ENABLE)
1104	if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
1105		return -EFBIG;
1106#endif
1107    /* Foxconn modifed end pling 06/12/2009 */
1108	return 0;
1109}
1110
1111EXPORT_SYMBOL(generic_file_open);
1112
1113/*
1114 * This is used by subsystems that don't want seekable
1115 * file descriptors
1116 */
1117int nonseekable_open(struct inode *inode, struct file *filp)
1118{
1119	filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
1120	return 0;
1121}
1122
1123EXPORT_SYMBOL(nonseekable_open);
1124