4 * vfs operations that deal with the file control API
6 * Copyright (C) International Business Machines Corp., 2003,2004
7 * Author(s): Steve French (sfrench@us.ibm.com)
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.
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.
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
24 #include <linux/stat.h>
25 #include <linux/fcntl.h>
27 #include "cifsproto.h"
28 #include "cifs_unicode.h"
29 #include "cifs_debug.h"
31 int cifs_directory_notify(unsigned long arg, struct file * file)
36 struct cifs_sb_info *cifs_sb;
37 struct cifsTconInfo *pTcon;
38 char *full_path = NULL;
39 __u32 filter = FILE_NOTIFY_CHANGE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES;
43 cifs_sb = CIFS_SB(file->f_dentry->d_sb);
44 pTcon = cifs_sb->tcon;
46 down(&file->f_dentry->d_sb->s_vfs_rename_sem);
47 full_path = build_path_from_dentry(file->f_dentry);
48 up(&file->f_dentry->d_sb->s_vfs_rename_sem);
50 if(full_path == NULL) {
53 cFYI(1,("cifs dir notify on file %s",full_path));
54 rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN,
55 GENERIC_READ | SYNCHRONIZE, 0 /* create options */,
56 &netfid, &oplock,NULL, cifs_sb->local_nls);
57 /* BB fixme - add this handle to a notify handle list */
59 cFYI(1,("Could not open directory for notify"));
61 rc = CIFSSMBNotify(xid, pTcon, 1 /* subdirs */, netfid,
62 filter, cifs_sb->local_nls);
63 /* BB add code to close file eventually (at unmount
64 it would close automatically but may be a way
65 to do it easily when inode freed or when
66 notify info is cleared/changed */
75 long cifs_fcntl(int file_desc, unsigned int command, unsigned long arg,
78 /* Few few file control functions need to be specially mapped. So far
80 F_NOTIFY (for directory change notification)
84 need to be mapped here. The others either already are mapped downstream
85 or do not need to go to the server (client only sideeffects):
101 cFYI(1,("cifs_fcntl: command %d with arg %lx",command,arg)); /* BB removeme BB */
105 /* let the local call have a chance to fail first */
106 rc = generic_file_fcntl(file_desc,command,arg,file);
110 /* local call succeeded try to do remote notify to
111 pick up changes from other clients to server file */
112 cifs_directory_notify(arg, file);
113 /* BB add case to long and return rc from above */
120 return generic_file_fcntl(file_desc,command,arg,file);