Whamcloud - gitweb
05daf03fae1a14f54be468db69dbe9a0b02bdc4c
[fs/lustre-release.git] / lustre / llite / file.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/llite/file.c
37  *
38  * Author: Peter Braam <braam@clusterfs.com>
39  * Author: Phil Schwan <phil@clusterfs.com>
40  * Author: Andreas Dilger <adilger@clusterfs.com>
41  */
42
43 #define DEBUG_SUBSYSTEM S_LLITE
44 #include <lustre_dlm.h>
45 #include <lustre_lite.h>
46 #include <lustre_mdc.h>
47 #include <linux/pagemap.h>
48 #include <linux/file.h>
49 #include "llite_internal.h"
50 #include <lustre/ll_fiemap.h>
51
52 #include "cl_object.h"
53
54 struct ll_file_data *ll_file_data_get(void)
55 {
56         struct ll_file_data *fd;
57
58         OBD_SLAB_ALLOC_PTR_GFP(fd, ll_file_data_slab, CFS_ALLOC_IO);
59         return fd;
60 }
61
62 static void ll_file_data_put(struct ll_file_data *fd)
63 {
64         if (fd != NULL)
65                 OBD_SLAB_FREE_PTR(fd, ll_file_data_slab);
66 }
67
68 void ll_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
69                           struct lustre_handle *fh)
70 {
71         op_data->op_fid1 = ll_i2info(inode)->lli_fid;
72         op_data->op_attr.ia_mode = inode->i_mode;
73         op_data->op_attr.ia_atime = inode->i_atime;
74         op_data->op_attr.ia_mtime = inode->i_mtime;
75         op_data->op_attr.ia_ctime = inode->i_ctime;
76         op_data->op_attr.ia_size = i_size_read(inode);
77         op_data->op_attr_blocks = inode->i_blocks;
78         ((struct ll_iattr *)&op_data->op_attr)->ia_attr_flags =
79                                         ll_inode_to_ext_flags(inode->i_flags);
80         op_data->op_ioepoch = ll_i2info(inode)->lli_ioepoch;
81         if (fh)
82                 op_data->op_handle = *fh;
83         op_data->op_capa1 = ll_mdscapa_get(inode);
84 }
85
86 /**
87  * Closes the IO epoch and packs all the attributes into @op_data for
88  * the CLOSE rpc.
89  */
90 static void ll_prepare_close(struct inode *inode, struct md_op_data *op_data,
91                              struct obd_client_handle *och)
92 {
93         ENTRY;
94
95         op_data->op_attr.ia_valid = ATTR_MODE | ATTR_ATIME_SET |
96                                  ATTR_MTIME_SET | ATTR_CTIME_SET;
97
98         if (!(och->och_flags & FMODE_WRITE))
99                 goto out;
100
101         if (!exp_connect_som(ll_i2mdexp(inode)) || !S_ISREG(inode->i_mode))
102                 op_data->op_attr.ia_valid |= ATTR_SIZE | ATTR_BLOCKS;
103         else
104                 ll_ioepoch_close(inode, op_data, &och, 0);
105
106 out:
107         ll_pack_inode2opdata(inode, op_data, &och->och_fh);
108         ll_prep_md_op_data(op_data, inode, NULL, NULL,
109                            0, 0, LUSTRE_OPC_ANY, NULL);
110         EXIT;
111 }
112
113 static int ll_close_inode_openhandle(struct obd_export *md_exp,
114                                      struct inode *inode,
115                                      struct obd_client_handle *och)
116 {
117         struct obd_export *exp = ll_i2mdexp(inode);
118         struct md_op_data *op_data;
119         struct ptlrpc_request *req = NULL;
120         struct obd_device *obd = class_exp2obd(exp);
121         int epoch_close = 1;
122         int rc;
123         ENTRY;
124
125         if (obd == NULL) {
126                 /*
127                  * XXX: in case of LMV, is this correct to access
128                  * ->exp_handle?
129                  */
130                 CERROR("Invalid MDC connection handle "LPX64"\n",
131                        ll_i2mdexp(inode)->exp_handle.h_cookie);
132                 GOTO(out, rc = 0);
133         }
134
135         OBD_ALLOC_PTR(op_data);
136         if (op_data == NULL)
137                 GOTO(out, rc = -ENOMEM); // XXX We leak openhandle and request here.
138
139         ll_prepare_close(inode, op_data, och);
140         epoch_close = (op_data->op_flags & MF_EPOCH_CLOSE);
141         rc = md_close(md_exp, op_data, och->och_mod, &req);
142         if (rc == -EAGAIN) {
143                 /* This close must have the epoch closed. */
144                 LASSERT(epoch_close);
145                 /* MDS has instructed us to obtain Size-on-MDS attribute from
146                  * OSTs and send setattr to back to MDS. */
147                 rc = ll_som_update(inode, op_data);
148                 if (rc) {
149                         CERROR("inode %lu mdc Size-on-MDS update failed: "
150                                "rc = %d\n", inode->i_ino, rc);
151                         rc = 0;
152                 }
153         } else if (rc) {
154                 CERROR("inode %lu mdc close failed: rc = %d\n",
155                        inode->i_ino, rc);
156         }
157         ll_finish_md_op_data(op_data);
158
159         if (rc == 0) {
160                 rc = ll_objects_destroy(req, inode);
161                 if (rc)
162                         CERROR("inode %lu ll_objects destroy: rc = %d\n",
163                                inode->i_ino, rc);
164         }
165
166         EXIT;
167 out:
168
169         if (exp_connect_som(exp) && !epoch_close &&
170             S_ISREG(inode->i_mode) && (och->och_flags & FMODE_WRITE)) {
171                 ll_queue_done_writing(inode, LLIF_DONE_WRITING);
172         } else {
173                 md_clear_open_replay_data(md_exp, och);
174                 /* Free @och if it is not waiting for DONE_WRITING. */
175                 och->och_fh.cookie = DEAD_HANDLE_MAGIC;
176                 OBD_FREE_PTR(och);
177         }
178         if (req) /* This is close request */
179                 ptlrpc_req_finished(req);
180         return rc;
181 }
182
183 int ll_md_real_close(struct inode *inode, int flags)
184 {
185         struct ll_inode_info *lli = ll_i2info(inode);
186         struct obd_client_handle **och_p;
187         struct obd_client_handle *och;
188         __u64 *och_usecount;
189         int rc = 0;
190         ENTRY;
191
192         if (flags & FMODE_WRITE) {
193                 och_p = &lli->lli_mds_write_och;
194                 och_usecount = &lli->lli_open_fd_write_count;
195         } else if (flags & FMODE_EXEC) {
196                 och_p = &lli->lli_mds_exec_och;
197                 och_usecount = &lli->lli_open_fd_exec_count;
198         } else {
199                 LASSERT(flags & FMODE_READ);
200                 och_p = &lli->lli_mds_read_och;
201                 och_usecount = &lli->lli_open_fd_read_count;
202         }
203
204         cfs_down(&lli->lli_och_sem);
205         if (*och_usecount) { /* There are still users of this handle, so
206                                 skip freeing it. */
207                 cfs_up(&lli->lli_och_sem);
208                 RETURN(0);
209         }
210         och=*och_p;
211         *och_p = NULL;
212         cfs_up(&lli->lli_och_sem);
213
214         if (och) { /* There might be a race and somebody have freed this och
215                       already */
216                 rc = ll_close_inode_openhandle(ll_i2sbi(inode)->ll_md_exp,
217                                                inode, och);
218         }
219
220         RETURN(rc);
221 }
222
223 int ll_md_close(struct obd_export *md_exp, struct inode *inode,
224                 struct file *file)
225 {
226         struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
227         struct ll_inode_info *lli = ll_i2info(inode);
228         int rc = 0;
229         ENTRY;
230
231         /* clear group lock, if present */
232         if (unlikely(fd->fd_flags & LL_FILE_GROUP_LOCKED))
233                 ll_put_grouplock(inode, file, fd->fd_grouplock.cg_gid);
234
235         /* Let's see if we have good enough OPEN lock on the file and if
236            we can skip talking to MDS */
237         if (file->f_dentry->d_inode) { /* Can this ever be false? */
238                 int lockmode;
239                 int flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_TEST_LOCK;
240                 struct lustre_handle lockh;
241                 struct inode *inode = file->f_dentry->d_inode;
242                 ldlm_policy_data_t policy = {.l_inodebits={MDS_INODELOCK_OPEN}};
243
244                 cfs_down(&lli->lli_och_sem);
245                 if (fd->fd_omode & FMODE_WRITE) {
246                         lockmode = LCK_CW;
247                         LASSERT(lli->lli_open_fd_write_count);
248                         lli->lli_open_fd_write_count--;
249                 } else if (fd->fd_omode & FMODE_EXEC) {
250                         lockmode = LCK_PR;
251                         LASSERT(lli->lli_open_fd_exec_count);
252                         lli->lli_open_fd_exec_count--;
253                 } else {
254                         lockmode = LCK_CR;
255                         LASSERT(lli->lli_open_fd_read_count);
256                         lli->lli_open_fd_read_count--;
257                 }
258                 cfs_up(&lli->lli_och_sem);
259
260                 if (!md_lock_match(md_exp, flags, ll_inode2fid(inode),
261                                    LDLM_IBITS, &policy, lockmode,
262                                    &lockh)) {
263                         rc = ll_md_real_close(file->f_dentry->d_inode,
264                                               fd->fd_omode);
265                 }
266         } else {
267                 CERROR("Releasing a file %p with negative dentry %p. Name %s",
268                        file, file->f_dentry, file->f_dentry->d_name.name);
269         }
270
271         LUSTRE_FPRIVATE(file) = NULL;
272         ll_file_data_put(fd);
273         ll_capa_close(inode);
274
275         RETURN(rc);
276 }
277
278 int lov_test_and_clear_async_rc(struct lov_stripe_md *lsm);
279
280 /* While this returns an error code, fput() the caller does not, so we need
281  * to make every effort to clean up all of our state here.  Also, applications
282  * rarely check close errors and even if an error is returned they will not
283  * re-try the close call.
284  */
285 int ll_file_release(struct inode *inode, struct file *file)
286 {
287         struct ll_file_data *fd;
288         struct ll_sb_info *sbi = ll_i2sbi(inode);
289         struct ll_inode_info *lli = ll_i2info(inode);
290         struct lov_stripe_md *lsm = lli->lli_smd;
291         int rc;
292         ENTRY;
293
294         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
295                inode->i_generation, inode);
296
297 #ifdef CONFIG_FS_POSIX_ACL
298         if (sbi->ll_flags & LL_SBI_RMT_CLIENT &&
299             inode == inode->i_sb->s_root->d_inode) {
300                 struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
301
302                 LASSERT(fd != NULL);
303                 if (unlikely(fd->fd_flags & LL_FILE_RMTACL)) {
304                         fd->fd_flags &= ~LL_FILE_RMTACL;
305                         rct_del(&sbi->ll_rct, cfs_curproc_pid());
306                         et_search_free(&sbi->ll_et, cfs_curproc_pid());
307                 }
308         }
309 #endif
310
311         if (inode->i_sb->s_root != file->f_dentry)
312                 ll_stats_ops_tally(sbi, LPROC_LL_RELEASE, 1);
313         fd = LUSTRE_FPRIVATE(file);
314         LASSERT(fd != NULL);
315
316         /* The last ref on @file, maybe not the the owner pid of statahead.
317          * Different processes can open the same dir, "ll_opendir_key" means:
318          * it is me that should stop the statahead thread. */
319         if (lli->lli_opendir_key == fd && lli->lli_opendir_pid != 0)
320                 ll_stop_statahead(inode, lli->lli_opendir_key);
321
322         if (inode->i_sb->s_root == file->f_dentry) {
323                 LUSTRE_FPRIVATE(file) = NULL;
324                 ll_file_data_put(fd);
325                 RETURN(0);
326         }
327
328         if (lsm)
329                 lov_test_and_clear_async_rc(lsm);
330         lli->lli_async_rc = 0;
331
332         rc = ll_md_close(sbi->ll_md_exp, inode, file);
333
334         if (OBD_FAIL_TIMEOUT_MS(OBD_FAIL_PTLRPC_DUMP_LOG, obd_fail_val))
335                 libcfs_debug_dumplog();
336
337         RETURN(rc);
338 }
339
340 static int ll_intent_file_open(struct file *file, void *lmm,
341                                int lmmsize, struct lookup_intent *itp)
342 {
343         struct ll_sb_info *sbi = ll_i2sbi(file->f_dentry->d_inode);
344         struct dentry *parent = file->f_dentry->d_parent;
345         const char *name = file->f_dentry->d_name.name;
346         const int len = file->f_dentry->d_name.len;
347         struct md_op_data *op_data;
348         struct ptlrpc_request *req;
349         int rc;
350         ENTRY;
351
352         if (!parent)
353                 RETURN(-ENOENT);
354
355         /* Usually we come here only for NFSD, and we want open lock.
356            But we can also get here with pre 2.6.15 patchless kernels, and in
357            that case that lock is also ok */
358         /* We can also get here if there was cached open handle in revalidate_it
359          * but it disappeared while we were getting from there to ll_file_open.
360          * But this means this file was closed and immediatelly opened which
361          * makes a good candidate for using OPEN lock */
362         /* If lmmsize & lmm are not 0, we are just setting stripe info
363          * parameters. No need for the open lock */
364         if (!lmm && !lmmsize)
365                 itp->it_flags |= MDS_OPEN_LOCK;
366
367         op_data  = ll_prep_md_op_data(NULL, parent->d_inode,
368                                       file->f_dentry->d_inode, name, len,
369                                       O_RDWR, LUSTRE_OPC_ANY, NULL);
370         if (IS_ERR(op_data))
371                 RETURN(PTR_ERR(op_data));
372
373         rc = md_intent_lock(sbi->ll_md_exp, op_data, lmm, lmmsize, itp,
374                             0 /*unused */, &req, ll_md_blocking_ast, 0);
375         ll_finish_md_op_data(op_data);
376         if (rc == -ESTALE) {
377                 /* reason for keep own exit path - don`t flood log
378                 * with messages with -ESTALE errors.
379                 */
380                 if (!it_disposition(itp, DISP_OPEN_OPEN) ||
381                      it_open_error(DISP_OPEN_OPEN, itp))
382                         GOTO(out, rc);
383                 ll_release_openhandle(file->f_dentry, itp);
384                 GOTO(out, rc);
385         }
386
387         if (rc != 0 || it_open_error(DISP_OPEN_OPEN, itp)) {
388                 rc = rc ? rc : it_open_error(DISP_OPEN_OPEN, itp);
389                 CDEBUG(D_VFSTRACE, "lock enqueue: err: %d\n", rc);
390                 GOTO(out, rc);
391         }
392
393         rc = ll_prep_inode(&file->f_dentry->d_inode, req, NULL);
394         if (!rc && itp->d.lustre.it_lock_mode)
395                 md_set_lock_data(sbi->ll_md_exp,
396                                  &itp->d.lustre.it_lock_handle,
397                                  file->f_dentry->d_inode, NULL);
398
399 out:
400         ptlrpc_req_finished(itp->d.lustre.it_data);
401         it_clear_disposition(itp, DISP_ENQ_COMPLETE);
402         ll_intent_drop_lock(itp);
403
404         RETURN(rc);
405 }
406
407 /**
408  * Assign an obtained @ioepoch to client's inode. No lock is needed, MDS does
409  * not believe attributes if a few ioepoch holders exist. Attributes for
410  * previous ioepoch if new one is opened are also skipped by MDS.
411  */
412 void ll_ioepoch_open(struct ll_inode_info *lli, __u64 ioepoch)
413 {
414         if (ioepoch && lli->lli_ioepoch != ioepoch) {
415                 lli->lli_ioepoch = ioepoch;
416                 CDEBUG(D_INODE, "Epoch "LPU64" opened on "DFID"\n",
417                        ioepoch, PFID(&lli->lli_fid));
418         }
419 }
420
421 static int ll_och_fill(struct obd_export *md_exp, struct ll_inode_info *lli,
422                        struct lookup_intent *it, struct obd_client_handle *och)
423 {
424         struct ptlrpc_request *req = it->d.lustre.it_data;
425         struct mdt_body *body;
426
427         LASSERT(och);
428
429         body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
430         LASSERT(body != NULL);                      /* reply already checked out */
431
432         memcpy(&och->och_fh, &body->handle, sizeof(body->handle));
433         och->och_magic = OBD_CLIENT_HANDLE_MAGIC;
434         och->och_fid = lli->lli_fid;
435         och->och_flags = it->it_flags;
436         ll_ioepoch_open(lli, body->ioepoch);
437
438         return md_set_open_replay_data(md_exp, och, req);
439 }
440
441 int ll_local_open(struct file *file, struct lookup_intent *it,
442                   struct ll_file_data *fd, struct obd_client_handle *och)
443 {
444         struct inode *inode = file->f_dentry->d_inode;
445         struct ll_inode_info *lli = ll_i2info(inode);
446         ENTRY;
447
448         LASSERT(!LUSTRE_FPRIVATE(file));
449
450         LASSERT(fd != NULL);
451
452         if (och) {
453                 struct ptlrpc_request *req = it->d.lustre.it_data;
454                 struct mdt_body *body;
455                 int rc;
456
457                 rc = ll_och_fill(ll_i2sbi(inode)->ll_md_exp, lli, it, och);
458                 if (rc)
459                         RETURN(rc);
460
461                 body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
462                 if ((it->it_flags & FMODE_WRITE) &&
463                     (body->valid & OBD_MD_FLSIZE))
464                         CDEBUG(D_INODE, "Epoch "LPU64" opened on "DFID"\n",
465                                lli->lli_ioepoch, PFID(&lli->lli_fid));
466         }
467
468         LUSTRE_FPRIVATE(file) = fd;
469         ll_readahead_init(inode, &fd->fd_ras);
470         fd->fd_omode = it->it_flags;
471         RETURN(0);
472 }
473
474 /* Open a file, and (for the very first open) create objects on the OSTs at
475  * this time.  If opened with O_LOV_DELAY_CREATE, then we don't do the object
476  * creation or open until ll_lov_setstripe() ioctl is called.  We grab
477  * lli_open_sem to ensure no other process will create objects, send the
478  * stripe MD to the MDS, or try to destroy the objects if that fails.
479  *
480  * If we already have the stripe MD locally then we don't request it in
481  * md_open(), by passing a lmm_size = 0.
482  *
483  * It is up to the application to ensure no other processes open this file
484  * in the O_LOV_DELAY_CREATE case, or the default striping pattern will be
485  * used.  We might be able to avoid races of that sort by getting lli_open_sem
486  * before returning in the O_LOV_DELAY_CREATE case and dropping it here
487  * or in ll_file_release(), but I'm not sure that is desirable/necessary.
488  */
489 int ll_file_open(struct inode *inode, struct file *file)
490 {
491         struct ll_inode_info *lli = ll_i2info(inode);
492         struct lookup_intent *it, oit = { .it_op = IT_OPEN,
493                                           .it_flags = file->f_flags };
494         struct lov_stripe_md *lsm;
495         struct ptlrpc_request *req = NULL;
496         struct obd_client_handle **och_p;
497         __u64 *och_usecount;
498         struct ll_file_data *fd;
499         int rc = 0, opendir_set = 0;
500         ENTRY;
501
502         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), flags %o\n", inode->i_ino,
503                inode->i_generation, inode, file->f_flags);
504
505 #ifdef HAVE_VFS_INTENT_PATCHES
506         it = file->f_it;
507 #else
508         it = file->private_data; /* XXX: compat macro */
509         file->private_data = NULL; /* prevent ll_local_open assertion */
510 #endif
511
512         fd = ll_file_data_get();
513         if (fd == NULL)
514                 RETURN(-ENOMEM);
515
516         fd->fd_file = file;
517         if (S_ISDIR(inode->i_mode)) {
518                 cfs_spin_lock(&lli->lli_sa_lock);
519                 if (lli->lli_opendir_key == NULL && lli->lli_opendir_pid == 0) {
520                         LASSERT(lli->lli_sai == NULL);
521                         lli->lli_opendir_key = fd;
522                         lli->lli_opendir_pid = cfs_curproc_pid();
523                         opendir_set = 1;
524                 }
525                 cfs_spin_unlock(&lli->lli_sa_lock);
526         }
527
528         if (inode->i_sb->s_root == file->f_dentry) {
529                 LUSTRE_FPRIVATE(file) = fd;
530                 RETURN(0);
531         }
532
533         if (!it || !it->d.lustre.it_disposition) {
534                 /* Convert f_flags into access mode. We cannot use file->f_mode,
535                  * because everything but O_ACCMODE mask was stripped from
536                  * there */
537                 if ((oit.it_flags + 1) & O_ACCMODE)
538                         oit.it_flags++;
539                 if (file->f_flags & O_TRUNC)
540                         oit.it_flags |= FMODE_WRITE;
541
542                 /* kernel only call f_op->open in dentry_open.  filp_open calls
543                  * dentry_open after call to open_namei that checks permissions.
544                  * Only nfsd_open call dentry_open directly without checking
545                  * permissions and because of that this code below is safe. */
546                 if (oit.it_flags & FMODE_WRITE)
547                         oit.it_flags |= MDS_OPEN_OWNEROVERRIDE;
548
549                 /* We do not want O_EXCL here, presumably we opened the file
550                  * already? XXX - NFS implications? */
551                 oit.it_flags &= ~O_EXCL;
552
553                 /* bug20584, if "it_flags" contains O_CREAT, the file will be
554                  * created if necessary, then "IT_CREAT" should be set to keep
555                  * consistent with it */
556                 if (oit.it_flags & O_CREAT)
557                         oit.it_op |= IT_CREAT;
558
559                 it = &oit;
560         }
561
562 restart:
563         /* Let's see if we have file open on MDS already. */
564         if (it->it_flags & FMODE_WRITE) {
565                 och_p = &lli->lli_mds_write_och;
566                 och_usecount = &lli->lli_open_fd_write_count;
567         } else if (it->it_flags & FMODE_EXEC) {
568                 och_p = &lli->lli_mds_exec_och;
569                 och_usecount = &lli->lli_open_fd_exec_count;
570          } else {
571                 och_p = &lli->lli_mds_read_och;
572                 och_usecount = &lli->lli_open_fd_read_count;
573         }
574
575         cfs_down(&lli->lli_och_sem);
576         if (*och_p) { /* Open handle is present */
577                 if (it_disposition(it, DISP_OPEN_OPEN)) {
578                         /* Well, there's extra open request that we do not need,
579                            let's close it somehow. This will decref request. */
580                         rc = it_open_error(DISP_OPEN_OPEN, it);
581                         if (rc) {
582                                 cfs_up(&lli->lli_och_sem);
583                                 ll_file_data_put(fd);
584                                 GOTO(out_openerr, rc);
585                         }
586                         ll_release_openhandle(file->f_dentry, it);
587                         lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats,
588                                              LPROC_LL_OPEN);
589                 }
590                 (*och_usecount)++;
591
592                 rc = ll_local_open(file, it, fd, NULL);
593                 if (rc) {
594                         (*och_usecount)--;
595                         cfs_up(&lli->lli_och_sem);
596                         ll_file_data_put(fd);
597                         GOTO(out_openerr, rc);
598                 }
599         } else {
600                 LASSERT(*och_usecount == 0);
601                 if (!it->d.lustre.it_disposition) {
602                         /* We cannot just request lock handle now, new ELC code
603                            means that one of other OPEN locks for this file
604                            could be cancelled, and since blocking ast handler
605                            would attempt to grab och_sem as well, that would
606                            result in a deadlock */
607                         cfs_up(&lli->lli_och_sem);
608                         it->it_create_mode |= M_CHECK_STALE;
609                         rc = ll_intent_file_open(file, NULL, 0, it);
610                         it->it_create_mode &= ~M_CHECK_STALE;
611                         if (rc) {
612                                 ll_file_data_put(fd);
613                                 GOTO(out_openerr, rc);
614                         }
615
616                         /* Got some error? Release the request */
617                         if (it->d.lustre.it_status < 0) {
618                                 req = it->d.lustre.it_data;
619                                 ptlrpc_req_finished(req);
620                         }
621                         goto restart;
622                 }
623                 OBD_ALLOC(*och_p, sizeof (struct obd_client_handle));
624                 if (!*och_p) {
625                         ll_file_data_put(fd);
626                         GOTO(out_och_free, rc = -ENOMEM);
627                 }
628                 (*och_usecount)++;
629                 req = it->d.lustre.it_data;
630
631                 /* md_intent_lock() didn't get a request ref if there was an
632                  * open error, so don't do cleanup on the request here
633                  * (bug 3430) */
634                 /* XXX (green): Should not we bail out on any error here, not
635                  * just open error? */
636                 rc = it_open_error(DISP_OPEN_OPEN, it);
637                 if (rc) {
638                         ll_file_data_put(fd);
639                         GOTO(out_och_free, rc);
640                 }
641
642                 ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_OPEN, 1);
643                 rc = ll_local_open(file, it, fd, *och_p);
644                 if (rc) {
645                         ll_file_data_put(fd);
646                         GOTO(out_och_free, rc);
647                 }
648         }
649         cfs_up(&lli->lli_och_sem);
650
651         /* Must do this outside lli_och_sem lock to prevent deadlock where
652            different kind of OPEN lock for this same inode gets cancelled
653            by ldlm_cancel_lru */
654         if (!S_ISREG(inode->i_mode))
655                 GOTO(out, rc);
656
657         ll_capa_open(inode);
658
659         lsm = lli->lli_smd;
660         if (lsm == NULL) {
661                 if (file->f_flags & O_LOV_DELAY_CREATE ||
662                     !(file->f_mode & FMODE_WRITE)) {
663                         CDEBUG(D_INODE, "object creation was delayed\n");
664                         GOTO(out, rc);
665                 }
666         }
667         file->f_flags &= ~O_LOV_DELAY_CREATE;
668         GOTO(out, rc);
669 out:
670         ptlrpc_req_finished(req);
671         if (req)
672                 it_clear_disposition(it, DISP_ENQ_OPEN_REF);
673 out_och_free:
674         if (rc) {
675                 if (*och_p) {
676                         OBD_FREE(*och_p, sizeof (struct obd_client_handle));
677                         *och_p = NULL; /* OBD_FREE writes some magic there */
678                         (*och_usecount)--;
679                 }
680                 cfs_up(&lli->lli_och_sem);
681 out_openerr:
682                 if (opendir_set != 0)
683                         ll_stop_statahead(inode, lli->lli_opendir_key);
684         }
685
686         return rc;
687 }
688
689 /* Fills the obdo with the attributes for the lsm */
690 static int ll_lsm_getattr(struct lov_stripe_md *lsm, struct obd_export *exp,
691                           struct obd_capa *capa, struct obdo *obdo,
692                           __u64 ioepoch, int sync)
693 {
694         struct ptlrpc_request_set *set;
695         struct obd_info            oinfo = { { { 0 } } };
696         int                        rc;
697
698         ENTRY;
699
700         LASSERT(lsm != NULL);
701
702         oinfo.oi_md = lsm;
703         oinfo.oi_oa = obdo;
704         oinfo.oi_oa->o_id = lsm->lsm_object_id;
705         oinfo.oi_oa->o_seq = lsm->lsm_object_seq;
706         oinfo.oi_oa->o_mode = S_IFREG;
707         oinfo.oi_oa->o_ioepoch = ioepoch;
708         oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE |
709                                OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
710                                OBD_MD_FLBLKSZ | OBD_MD_FLATIME |
711                                OBD_MD_FLMTIME | OBD_MD_FLCTIME |
712                                OBD_MD_FLGROUP | OBD_MD_FLEPOCH;
713         oinfo.oi_capa = capa;
714         if (sync) {
715                 oinfo.oi_oa->o_valid |= OBD_MD_FLFLAGS;
716                 oinfo.oi_oa->o_flags |= OBD_FL_SRVLOCK;
717         }
718
719         set = ptlrpc_prep_set();
720         if (set == NULL) {
721                 CERROR("can't allocate ptlrpc set\n");
722                 rc = -ENOMEM;
723         } else {
724                 rc = obd_getattr_async(exp, &oinfo, set);
725                 if (rc == 0)
726                         rc = ptlrpc_set_wait(set);
727                 ptlrpc_set_destroy(set);
728         }
729         if (rc == 0)
730                 oinfo.oi_oa->o_valid &= (OBD_MD_FLBLOCKS | OBD_MD_FLBLKSZ |
731                                          OBD_MD_FLATIME | OBD_MD_FLMTIME |
732                                          OBD_MD_FLCTIME | OBD_MD_FLSIZE);
733         RETURN(rc);
734 }
735
736 /**
737   * Performs the getattr on the inode and updates its fields.
738   * If @sync != 0, perform the getattr under the server-side lock.
739   */
740 int ll_inode_getattr(struct inode *inode, struct obdo *obdo,
741                      __u64 ioepoch, int sync)
742 {
743         struct ll_inode_info *lli  = ll_i2info(inode);
744         struct obd_capa      *capa = ll_mdscapa_get(inode);
745         int rc;
746         ENTRY;
747
748         rc = ll_lsm_getattr(lli->lli_smd, ll_i2dtexp(inode),
749                             capa, obdo, ioepoch, sync);
750         capa_put(capa);
751         if (rc == 0) {
752                 obdo_refresh_inode(inode, obdo, obdo->o_valid);
753                 CDEBUG(D_INODE,
754                        "objid "LPX64" size %Lu, blocks %llu, blksize %lu\n",
755                        lli->lli_smd->lsm_object_id, i_size_read(inode),
756                        (unsigned long long)inode->i_blocks,
757                        (unsigned long)ll_inode_blksize(inode));
758         }
759         RETURN(rc);
760 }
761
762 int ll_merge_lvb(struct inode *inode)
763 {
764         struct ll_inode_info *lli = ll_i2info(inode);
765         struct ll_sb_info *sbi = ll_i2sbi(inode);
766         struct ost_lvb lvb;
767         int rc;
768
769         ENTRY;
770
771         ll_inode_size_lock(inode, 1);
772         inode_init_lvb(inode, &lvb);
773
774         /* merge timestamps the most resently obtained from mds with
775            timestamps obtained from osts */
776         lvb.lvb_atime = lli->lli_lvb.lvb_atime;
777         lvb.lvb_mtime = lli->lli_lvb.lvb_mtime;
778         lvb.lvb_ctime = lli->lli_lvb.lvb_ctime;
779         rc = obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0);
780         cl_isize_write_nolock(inode, lvb.lvb_size);
781
782         CDEBUG(D_VFSTRACE, DFID" updating i_size "LPU64"\n",
783                PFID(&lli->lli_fid), lvb.lvb_size);
784         inode->i_blocks = lvb.lvb_blocks;
785
786         LTIME_S(inode->i_mtime) = lvb.lvb_mtime;
787         LTIME_S(inode->i_atime) = lvb.lvb_atime;
788         LTIME_S(inode->i_ctime) = lvb.lvb_ctime;
789         ll_inode_size_unlock(inode, 1);
790
791         RETURN(rc);
792 }
793
794 int ll_glimpse_ioctl(struct ll_sb_info *sbi, struct lov_stripe_md *lsm,
795                      lstat_t *st)
796 {
797         struct obdo obdo = { 0 };
798         int rc;
799
800         rc = ll_lsm_getattr(lsm, sbi->ll_dt_exp, NULL, &obdo, 0, 0);
801         if (rc == 0) {
802                 st->st_size   = obdo.o_size;
803                 st->st_blocks = obdo.o_blocks;
804                 st->st_mtime  = obdo.o_mtime;
805                 st->st_atime  = obdo.o_atime;
806                 st->st_ctime  = obdo.o_ctime;
807         }
808         return rc;
809 }
810
811 void ll_io_init(struct cl_io *io, const struct file *file, int write)
812 {
813         struct inode *inode = file->f_dentry->d_inode;
814
815         memset(io, 0, sizeof *io);
816         io->u.ci_rw.crw_nonblock = file->f_flags & O_NONBLOCK;
817         if (write)
818                 io->u.ci_wr.wr_append = !!(file->f_flags & O_APPEND);
819         io->ci_obj     = ll_i2info(inode)->lli_clob;
820         io->ci_lockreq = CILR_MAYBE;
821         if (ll_file_nolock(file)) {
822                 io->ci_lockreq = CILR_NEVER;
823                 io->ci_no_srvlock = 1;
824         } else if (file->f_flags & O_APPEND) {
825                 io->ci_lockreq = CILR_MANDATORY;
826         }
827 }
828
829 static ssize_t ll_file_io_generic(const struct lu_env *env,
830                 struct vvp_io_args *args, struct file *file,
831                 enum cl_io_type iot, loff_t *ppos, size_t count)
832 {
833         struct cl_io       *io;
834         ssize_t             result;
835         ENTRY;
836
837         io = &ccc_env_info(env)->cti_io;
838         ll_io_init(io, file, iot == CIT_WRITE);
839
840         if (cl_io_rw_init(env, io, iot, *ppos, count) == 0) {
841                 struct vvp_io *vio = vvp_env_io(env);
842                 struct ccc_io *cio = ccc_env_io(env);
843                 struct ll_inode_info *lli = ll_i2info(file->f_dentry->d_inode);
844                 int write_sem_locked = 0;
845
846                 cio->cui_fd  = LUSTRE_FPRIVATE(file);
847                 vio->cui_io_subtype = args->via_io_subtype;
848
849                 switch (vio->cui_io_subtype) {
850                 case IO_NORMAL:
851                         cio->cui_iov = args->u.normal.via_iov;
852                         cio->cui_nrsegs = args->u.normal.via_nrsegs;
853                         cio->cui_tot_nrsegs = cio->cui_nrsegs;
854 #ifndef HAVE_FILE_WRITEV
855                         cio->cui_iocb = args->u.normal.via_iocb;
856 #endif
857                         if ((iot == CIT_WRITE) &&
858                             !(cio->cui_fd->fd_flags & LL_FILE_GROUP_LOCKED)) {
859                                 if(cfs_down_interruptible(&lli->lli_write_sem))
860                                         GOTO(out, result = -ERESTARTSYS);
861                                 write_sem_locked = 1;
862                         }
863                         break;
864                 case IO_SENDFILE:
865                         vio->u.sendfile.cui_actor = args->u.sendfile.via_actor;
866                         vio->u.sendfile.cui_target = args->u.sendfile.via_target;
867                         break;
868                 case IO_SPLICE:
869                         vio->u.splice.cui_pipe = args->u.splice.via_pipe;
870                         vio->u.splice.cui_flags = args->u.splice.via_flags;
871                         break;
872                 default:
873                         CERROR("Unknow IO type - %u\n", vio->cui_io_subtype);
874                         LBUG();
875                 }
876                 result = cl_io_loop(env, io);
877                 if (write_sem_locked)
878                         cfs_up(&lli->lli_write_sem);
879         } else {
880                 /* cl_io_rw_init() handled IO */
881                 result = io->ci_result;
882         }
883
884         if (io->ci_nob > 0) {
885                 result = io->ci_nob;
886                 *ppos = io->u.ci_wr.wr.crw_pos;
887         }
888         GOTO(out, result);
889 out:
890         cl_io_fini(env, io);
891         return result;
892 }
893
894
895 /*
896  * XXX: exact copy from kernel code (__generic_file_aio_write_nolock)
897  */
898 static int ll_file_get_iov_count(const struct iovec *iov,
899                                  unsigned long *nr_segs, size_t *count)
900 {
901         size_t cnt = 0;
902         unsigned long seg;
903
904         for (seg = 0; seg < *nr_segs; seg++) {
905                 const struct iovec *iv = &iov[seg];
906
907                 /*
908                  * If any segment has a negative length, or the cumulative
909                  * length ever wraps negative then return -EINVAL.
910                  */
911                 cnt += iv->iov_len;
912                 if (unlikely((ssize_t)(cnt|iv->iov_len) < 0))
913                         return -EINVAL;
914                 if (access_ok(VERIFY_READ, iv->iov_base, iv->iov_len))
915                         continue;
916                 if (seg == 0)
917                         return -EFAULT;
918                 *nr_segs = seg;
919                 cnt -= iv->iov_len;   /* This segment is no good */
920                 break;
921         }
922         *count = cnt;
923         return 0;
924 }
925
926 #ifdef HAVE_FILE_READV
927 static ssize_t ll_file_readv(struct file *file, const struct iovec *iov,
928                               unsigned long nr_segs, loff_t *ppos)
929 {
930         struct lu_env      *env;
931         struct vvp_io_args *args;
932         size_t              count;
933         ssize_t             result;
934         int                 refcheck;
935         ENTRY;
936
937         result = ll_file_get_iov_count(iov, &nr_segs, &count);
938         if (result)
939                 RETURN(result);
940
941         env = cl_env_get(&refcheck);
942         if (IS_ERR(env))
943                 RETURN(PTR_ERR(env));
944
945         args = vvp_env_args(env, IO_NORMAL);
946         args->u.normal.via_iov = (struct iovec *)iov;
947         args->u.normal.via_nrsegs = nr_segs;
948
949         result = ll_file_io_generic(env, args, file, CIT_READ, ppos, count);
950         cl_env_put(env, &refcheck);
951         RETURN(result);
952 }
953
954 static ssize_t ll_file_read(struct file *file, char *buf, size_t count,
955                             loff_t *ppos)
956 {
957         struct lu_env *env;
958         struct iovec  *local_iov;
959         ssize_t        result;
960         int            refcheck;
961         ENTRY;
962
963         env = cl_env_get(&refcheck);
964         if (IS_ERR(env))
965                 RETURN(PTR_ERR(env));
966
967         local_iov = &vvp_env_info(env)->vti_local_iov;
968         local_iov->iov_base = (void __user *)buf;
969         local_iov->iov_len = count;
970         result = ll_file_readv(file, local_iov, 1, ppos);
971         cl_env_put(env, &refcheck);
972         RETURN(result);
973 }
974
975 #else
976 static ssize_t ll_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
977                                 unsigned long nr_segs, loff_t pos)
978 {
979         struct lu_env      *env;
980         struct vvp_io_args *args;
981         size_t              count;
982         ssize_t             result;
983         int                 refcheck;
984         ENTRY;
985
986         result = ll_file_get_iov_count(iov, &nr_segs, &count);
987         if (result)
988                 RETURN(result);
989
990         env = cl_env_get(&refcheck);
991         if (IS_ERR(env))
992                 RETURN(PTR_ERR(env));
993
994         args = vvp_env_args(env, IO_NORMAL);
995         args->u.normal.via_iov = (struct iovec *)iov;
996         args->u.normal.via_nrsegs = nr_segs;
997         args->u.normal.via_iocb = iocb;
998
999         result = ll_file_io_generic(env, args, iocb->ki_filp, CIT_READ,
1000                                     &iocb->ki_pos, count);
1001         cl_env_put(env, &refcheck);
1002         RETURN(result);
1003 }
1004
1005 static ssize_t ll_file_read(struct file *file, char *buf, size_t count,
1006                             loff_t *ppos)
1007 {
1008         struct lu_env *env;
1009         struct iovec  *local_iov;
1010         struct kiocb  *kiocb;
1011         ssize_t        result;
1012         int            refcheck;
1013         ENTRY;
1014
1015         env = cl_env_get(&refcheck);
1016         if (IS_ERR(env))
1017                 RETURN(PTR_ERR(env));
1018
1019         local_iov = &vvp_env_info(env)->vti_local_iov;
1020         kiocb = &vvp_env_info(env)->vti_kiocb;
1021         local_iov->iov_base = (void __user *)buf;
1022         local_iov->iov_len = count;
1023         init_sync_kiocb(kiocb, file);
1024         kiocb->ki_pos = *ppos;
1025         kiocb->ki_left = count;
1026
1027         result = ll_file_aio_read(kiocb, local_iov, 1, kiocb->ki_pos);
1028         *ppos = kiocb->ki_pos;
1029
1030         cl_env_put(env, &refcheck);
1031         RETURN(result);
1032 }
1033 #endif
1034
1035 /*
1036  * Write to a file (through the page cache).
1037  */
1038 #ifdef HAVE_FILE_WRITEV
1039 static ssize_t ll_file_writev(struct file *file, const struct iovec *iov,
1040                               unsigned long nr_segs, loff_t *ppos)
1041 {
1042         struct lu_env      *env;
1043         struct vvp_io_args *args;
1044         size_t              count;
1045         ssize_t             result;
1046         int                 refcheck;
1047         ENTRY;
1048
1049         result = ll_file_get_iov_count(iov, &nr_segs, &count);
1050         if (result)
1051                 RETURN(result);
1052
1053         env = cl_env_get(&refcheck);
1054         if (IS_ERR(env))
1055                 RETURN(PTR_ERR(env));
1056
1057         args = vvp_env_args(env, IO_NORMAL);
1058         args->u.normal.via_iov = (struct iovec *)iov;
1059         args->u.normal.via_nrsegs = nr_segs;
1060
1061         result = ll_file_io_generic(env, args, file, CIT_WRITE, ppos, count);
1062         cl_env_put(env, &refcheck);
1063         RETURN(result);
1064 }
1065
1066 static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
1067                              loff_t *ppos)
1068 {
1069         struct lu_env    *env;
1070         struct iovec     *local_iov;
1071         ssize_t           result;
1072         int               refcheck;
1073         ENTRY;
1074
1075         env = cl_env_get(&refcheck);
1076         if (IS_ERR(env))
1077                 RETURN(PTR_ERR(env));
1078
1079         local_iov = &vvp_env_info(env)->vti_local_iov;
1080         local_iov->iov_base = (void __user *)buf;
1081         local_iov->iov_len = count;
1082
1083         result = ll_file_writev(file, local_iov, 1, ppos);
1084         cl_env_put(env, &refcheck);
1085         RETURN(result);
1086 }
1087
1088 #else /* AIO stuff */
1089 static ssize_t ll_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
1090                                  unsigned long nr_segs, loff_t pos)
1091 {
1092         struct lu_env      *env;
1093         struct vvp_io_args *args;
1094         size_t              count;
1095         ssize_t             result;
1096         int                 refcheck;
1097         ENTRY;
1098
1099         result = ll_file_get_iov_count(iov, &nr_segs, &count);
1100         if (result)
1101                 RETURN(result);
1102
1103         env = cl_env_get(&refcheck);
1104         if (IS_ERR(env))
1105                 RETURN(PTR_ERR(env));
1106
1107         args = vvp_env_args(env, IO_NORMAL);
1108         args->u.normal.via_iov = (struct iovec *)iov;
1109         args->u.normal.via_nrsegs = nr_segs;
1110         args->u.normal.via_iocb = iocb;
1111
1112         result = ll_file_io_generic(env, args, iocb->ki_filp, CIT_WRITE,
1113                                   &iocb->ki_pos, count);
1114         cl_env_put(env, &refcheck);
1115         RETURN(result);
1116 }
1117
1118 static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
1119                              loff_t *ppos)
1120 {
1121         struct lu_env *env;
1122         struct iovec  *local_iov;
1123         struct kiocb  *kiocb;
1124         ssize_t        result;
1125         int            refcheck;
1126         ENTRY;
1127
1128         env = cl_env_get(&refcheck);
1129         if (IS_ERR(env))
1130                 RETURN(PTR_ERR(env));
1131
1132         local_iov = &vvp_env_info(env)->vti_local_iov;
1133         kiocb = &vvp_env_info(env)->vti_kiocb;
1134         local_iov->iov_base = (void __user *)buf;
1135         local_iov->iov_len = count;
1136         init_sync_kiocb(kiocb, file);
1137         kiocb->ki_pos = *ppos;
1138         kiocb->ki_left = count;
1139
1140         result = ll_file_aio_write(kiocb, local_iov, 1, kiocb->ki_pos);
1141         *ppos = kiocb->ki_pos;
1142
1143         cl_env_put(env, &refcheck);
1144         RETURN(result);
1145 }
1146 #endif
1147
1148
1149 #ifdef HAVE_KERNEL_SENDFILE
1150 /*
1151  * Send file content (through pagecache) somewhere with helper
1152  */
1153 static ssize_t ll_file_sendfile(struct file *in_file, loff_t *ppos,size_t count,
1154                                 read_actor_t actor, void *target)
1155 {
1156         struct lu_env      *env;
1157         struct vvp_io_args *args;
1158         ssize_t             result;
1159         int                 refcheck;
1160         ENTRY;
1161
1162         env = cl_env_get(&refcheck);
1163         if (IS_ERR(env))
1164                 RETURN(PTR_ERR(env));
1165
1166         args = vvp_env_args(env, IO_SENDFILE);
1167         args->u.sendfile.via_target = target;
1168         args->u.sendfile.via_actor = actor;
1169
1170         result = ll_file_io_generic(env, args, in_file, CIT_READ, ppos, count);
1171         cl_env_put(env, &refcheck);
1172         RETURN(result);
1173 }
1174 #endif
1175
1176 #ifdef HAVE_KERNEL_SPLICE_READ
1177 /*
1178  * Send file content (through pagecache) somewhere with helper
1179  */
1180 static ssize_t ll_file_splice_read(struct file *in_file, loff_t *ppos,
1181                                    struct pipe_inode_info *pipe, size_t count,
1182                                    unsigned int flags)
1183 {
1184         struct lu_env      *env;
1185         struct vvp_io_args *args;
1186         ssize_t             result;
1187         int                 refcheck;
1188         ENTRY;
1189
1190         env = cl_env_get(&refcheck);
1191         if (IS_ERR(env))
1192                 RETURN(PTR_ERR(env));
1193
1194         args = vvp_env_args(env, IO_SPLICE);
1195         args->u.splice.via_pipe = pipe;
1196         args->u.splice.via_flags = flags;
1197
1198         result = ll_file_io_generic(env, args, in_file, CIT_READ, ppos, count);
1199         cl_env_put(env, &refcheck);
1200         RETURN(result);
1201 }
1202 #endif
1203
1204 static int ll_lov_recreate(struct inode *inode, obd_id id, obd_seq seq,
1205                            obd_count ost_idx)
1206 {
1207         struct obd_export *exp = ll_i2dtexp(inode);
1208         struct obd_trans_info oti = { 0 };
1209         struct obdo *oa = NULL;
1210         int lsm_size;
1211         int rc = 0;
1212         struct lov_stripe_md *lsm, *lsm2;
1213         ENTRY;
1214
1215         OBDO_ALLOC(oa);
1216         if (oa == NULL)
1217                 RETURN(-ENOMEM);
1218
1219         ll_inode_size_lock(inode, 0);
1220         lsm = ll_i2info(inode)->lli_smd;
1221         if (lsm == NULL)
1222                 GOTO(out, rc = -ENOENT);
1223         lsm_size = sizeof(*lsm) + (sizeof(struct lov_oinfo) *
1224                    (lsm->lsm_stripe_count));
1225
1226         OBD_ALLOC(lsm2, lsm_size);
1227         if (lsm2 == NULL)
1228                 GOTO(out, rc = -ENOMEM);
1229
1230         oa->o_id = id;
1231         oa->o_seq = seq;
1232         oa->o_nlink = ost_idx;
1233         oa->o_flags |= OBD_FL_RECREATE_OBJS;
1234         oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS | OBD_MD_FLGROUP;
1235         obdo_from_inode(oa, inode, &ll_i2info(inode)->lli_fid, OBD_MD_FLTYPE |
1236                         OBD_MD_FLATIME | OBD_MD_FLMTIME | OBD_MD_FLCTIME);
1237         memcpy(lsm2, lsm, lsm_size);
1238         rc = obd_create(exp, oa, &lsm2, &oti);
1239
1240         OBD_FREE(lsm2, lsm_size);
1241         GOTO(out, rc);
1242 out:
1243         ll_inode_size_unlock(inode, 0);
1244         OBDO_FREE(oa);
1245         return rc;
1246 }
1247
1248 static int ll_lov_recreate_obj(struct inode *inode, unsigned long arg)
1249 {
1250         struct ll_recreate_obj ucreat;
1251         ENTRY;
1252
1253         if (!cfs_capable(CFS_CAP_SYS_ADMIN))
1254                 RETURN(-EPERM);
1255
1256         if (cfs_copy_from_user(&ucreat, (struct ll_recreate_obj *)arg,
1257                                sizeof(struct ll_recreate_obj)))
1258                 RETURN(-EFAULT);
1259
1260         RETURN(ll_lov_recreate(inode, ucreat.lrc_id, 0,
1261                                ucreat.lrc_ost_idx));
1262 }
1263
1264 static int ll_lov_recreate_fid(struct inode *inode, unsigned long arg)
1265 {
1266         struct lu_fid fid;
1267         obd_id id;
1268         obd_count ost_idx;
1269         ENTRY;
1270
1271         if (!cfs_capable(CFS_CAP_SYS_ADMIN))
1272                 RETURN(-EPERM);
1273
1274         if (cfs_copy_from_user(&fid, (struct lu_fid *)arg,
1275                                sizeof(struct lu_fid)))
1276                 RETURN(-EFAULT);
1277
1278         id = fid_oid(&fid) | ((fid_seq(&fid) & 0xffff) << 32);
1279         ost_idx = (fid_seq(&fid) >> 16) & 0xffff;
1280         RETURN(ll_lov_recreate(inode, id, 0, ost_idx));
1281 }
1282
1283 int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
1284                              int flags, struct lov_user_md *lum, int lum_size)
1285 {
1286         struct lov_stripe_md *lsm;
1287         struct lookup_intent oit = {.it_op = IT_OPEN, .it_flags = flags};
1288         int rc = 0;
1289         ENTRY;
1290
1291         ll_inode_size_lock(inode, 0);
1292         lsm = ll_i2info(inode)->lli_smd;
1293         if (lsm) {
1294                 ll_inode_size_unlock(inode, 0);
1295                 CDEBUG(D_IOCTL, "stripe already exists for ino %lu\n",
1296                        inode->i_ino);
1297                 RETURN(-EEXIST);
1298         }
1299
1300         rc = ll_intent_file_open(file, lum, lum_size, &oit);
1301         if (rc)
1302                 GOTO(out, rc);
1303         if (it_disposition(&oit, DISP_LOOKUP_NEG))
1304                 GOTO(out_req_free, rc = -ENOENT);
1305         rc = oit.d.lustre.it_status;
1306         if (rc < 0)
1307                 GOTO(out_req_free, rc);
1308
1309         ll_release_openhandle(file->f_dentry, &oit);
1310
1311  out:
1312         ll_inode_size_unlock(inode, 0);
1313         ll_intent_release(&oit);
1314         RETURN(rc);
1315 out_req_free:
1316         ptlrpc_req_finished((struct ptlrpc_request *) oit.d.lustre.it_data);
1317         goto out;
1318 }
1319
1320 int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename,
1321                              struct lov_mds_md **lmmp, int *lmm_size,
1322                              struct ptlrpc_request **request)
1323 {
1324         struct ll_sb_info *sbi = ll_i2sbi(inode);
1325         struct mdt_body  *body;
1326         struct lov_mds_md *lmm = NULL;
1327         struct ptlrpc_request *req = NULL;
1328         struct md_op_data *op_data;
1329         int rc, lmmsize;
1330
1331         rc = ll_get_max_mdsize(sbi, &lmmsize);
1332         if (rc)
1333                 RETURN(rc);
1334
1335         op_data = ll_prep_md_op_data(NULL, inode, NULL, filename,
1336                                      strlen(filename), lmmsize,
1337                                      LUSTRE_OPC_ANY, NULL);
1338         if (op_data == NULL)
1339                 RETURN(-ENOMEM);
1340
1341         op_data->op_valid = OBD_MD_FLEASIZE | OBD_MD_FLDIREA;
1342         rc = md_getattr_name(sbi->ll_md_exp, op_data, &req);
1343         ll_finish_md_op_data(op_data);
1344         if (rc < 0) {
1345                 CDEBUG(D_INFO, "md_getattr_name failed "
1346                        "on %s: rc %d\n", filename, rc);
1347                 GOTO(out, rc);
1348         }
1349
1350         body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
1351         LASSERT(body != NULL); /* checked by mdc_getattr_name */
1352
1353         lmmsize = body->eadatasize;
1354
1355         if (!(body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) ||
1356                         lmmsize == 0) {
1357                 GOTO(out, rc = -ENODATA);
1358         }
1359
1360         lmm = req_capsule_server_sized_get(&req->rq_pill, &RMF_MDT_MD, lmmsize);
1361         LASSERT(lmm != NULL);
1362
1363         if ((lmm->lmm_magic != cpu_to_le32(LOV_MAGIC_V1)) &&
1364             (lmm->lmm_magic != cpu_to_le32(LOV_MAGIC_V3))) {
1365                 GOTO(out, rc = -EPROTO);
1366         }
1367
1368         /*
1369          * This is coming from the MDS, so is probably in
1370          * little endian.  We convert it to host endian before
1371          * passing it to userspace.
1372          */
1373         if (LOV_MAGIC != cpu_to_le32(LOV_MAGIC)) {
1374                 /* if function called for directory - we should
1375                  * avoid swab not existent lsm objects */
1376                 if (lmm->lmm_magic == cpu_to_le32(LOV_MAGIC_V1)) {
1377                         lustre_swab_lov_user_md_v1((struct lov_user_md_v1 *)lmm);
1378                         if (S_ISREG(body->mode))
1379                                 lustre_swab_lov_user_md_objects(
1380                                  ((struct lov_user_md_v1 *)lmm)->lmm_objects,
1381                                  ((struct lov_user_md_v1 *)lmm)->lmm_stripe_count);
1382                 } else if (lmm->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)) {
1383                         lustre_swab_lov_user_md_v3((struct lov_user_md_v3 *)lmm);
1384                         if (S_ISREG(body->mode))
1385                                 lustre_swab_lov_user_md_objects(
1386                                  ((struct lov_user_md_v3 *)lmm)->lmm_objects,
1387                                  ((struct lov_user_md_v3 *)lmm)->lmm_stripe_count);
1388                 }
1389         }
1390
1391 out:
1392         *lmmp = lmm;
1393         *lmm_size = lmmsize;
1394         *request = req;
1395         return rc;
1396 }
1397
1398 static int ll_lov_setea(struct inode *inode, struct file *file,
1399                             unsigned long arg)
1400 {
1401         int flags = MDS_OPEN_HAS_OBJS | FMODE_WRITE;
1402         struct lov_user_md  *lump;
1403         int lum_size = sizeof(struct lov_user_md) +
1404                        sizeof(struct lov_user_ost_data);
1405         int rc;
1406         ENTRY;
1407
1408         if (!cfs_capable(CFS_CAP_SYS_ADMIN))
1409                 RETURN(-EPERM);
1410
1411         OBD_ALLOC(lump, lum_size);
1412         if (lump == NULL) {
1413                 RETURN(-ENOMEM);
1414         }
1415         if (cfs_copy_from_user(lump, (struct lov_user_md  *)arg, lum_size)) {
1416                 OBD_FREE(lump, lum_size);
1417                 RETURN(-EFAULT);
1418         }
1419
1420         rc = ll_lov_setstripe_ea_info(inode, file, flags, lump, lum_size);
1421
1422         OBD_FREE(lump, lum_size);
1423         RETURN(rc);
1424 }
1425
1426 static int ll_lov_setstripe(struct inode *inode, struct file *file,
1427                             unsigned long arg)
1428 {
1429         struct lov_user_md_v3 lumv3;
1430         struct lov_user_md_v1 *lumv1 = (struct lov_user_md_v1 *)&lumv3;
1431         struct lov_user_md_v1 *lumv1p = (struct lov_user_md_v1 *)arg;
1432         struct lov_user_md_v3 *lumv3p = (struct lov_user_md_v3 *)arg;
1433         int lum_size;
1434         int rc;
1435         int flags = FMODE_WRITE;
1436         ENTRY;
1437
1438         /* first try with v1 which is smaller than v3 */
1439         lum_size = sizeof(struct lov_user_md_v1);
1440         if (cfs_copy_from_user(lumv1, lumv1p, lum_size))
1441                 RETURN(-EFAULT);
1442
1443         if (lumv1->lmm_magic == LOV_USER_MAGIC_V3) {
1444                 lum_size = sizeof(struct lov_user_md_v3);
1445                 if (cfs_copy_from_user(&lumv3, lumv3p, lum_size))
1446                         RETURN(-EFAULT);
1447         }
1448
1449         rc = ll_lov_setstripe_ea_info(inode, file, flags, lumv1, lum_size);
1450         if (rc == 0) {
1451                  put_user(0, &lumv1p->lmm_stripe_count);
1452                  rc = obd_iocontrol(LL_IOC_LOV_GETSTRIPE, ll_i2dtexp(inode),
1453                                     0, ll_i2info(inode)->lli_smd,
1454                                     (void *)arg);
1455         }
1456         RETURN(rc);
1457 }
1458
1459 static int ll_lov_getstripe(struct inode *inode, unsigned long arg)
1460 {
1461         struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
1462
1463         if (!lsm)
1464                 RETURN(-ENODATA);
1465
1466         return obd_iocontrol(LL_IOC_LOV_GETSTRIPE, ll_i2dtexp(inode), 0, lsm,
1467                             (void *)arg);
1468 }
1469
1470 int ll_get_grouplock(struct inode *inode, struct file *file, unsigned long arg)
1471 {
1472         struct ll_inode_info   *lli = ll_i2info(inode);
1473         struct ll_file_data    *fd = LUSTRE_FPRIVATE(file);
1474         struct ccc_grouplock    grouplock;
1475         int                     rc;
1476         ENTRY;
1477
1478         if (ll_file_nolock(file))
1479                 RETURN(-EOPNOTSUPP);
1480
1481         cfs_spin_lock(&lli->lli_lock);
1482         if (fd->fd_flags & LL_FILE_GROUP_LOCKED) {
1483                 CWARN("group lock already existed with gid %lu\n",
1484                        fd->fd_grouplock.cg_gid);
1485                 cfs_spin_unlock(&lli->lli_lock);
1486                 RETURN(-EINVAL);
1487         }
1488         LASSERT(fd->fd_grouplock.cg_lock == NULL);
1489         cfs_spin_unlock(&lli->lli_lock);
1490
1491         rc = cl_get_grouplock(cl_i2info(inode)->lli_clob,
1492                               arg, (file->f_flags & O_NONBLOCK), &grouplock);
1493         if (rc)
1494                 RETURN(rc);
1495
1496         cfs_spin_lock(&lli->lli_lock);
1497         if (fd->fd_flags & LL_FILE_GROUP_LOCKED) {
1498                 cfs_spin_unlock(&lli->lli_lock);
1499                 CERROR("another thread just won the race\n");
1500                 cl_put_grouplock(&grouplock);
1501                 RETURN(-EINVAL);
1502         }
1503
1504         fd->fd_flags |= LL_FILE_GROUP_LOCKED;
1505         fd->fd_grouplock = grouplock;
1506         cfs_spin_unlock(&lli->lli_lock);
1507
1508         CDEBUG(D_INFO, "group lock %lu obtained\n", arg);
1509         RETURN(0);
1510 }
1511
1512 int ll_put_grouplock(struct inode *inode, struct file *file, unsigned long arg)
1513 {
1514         struct ll_inode_info   *lli = ll_i2info(inode);
1515         struct ll_file_data    *fd = LUSTRE_FPRIVATE(file);
1516         struct ccc_grouplock    grouplock;
1517         ENTRY;
1518
1519         cfs_spin_lock(&lli->lli_lock);
1520         if (!(fd->fd_flags & LL_FILE_GROUP_LOCKED)) {
1521                 cfs_spin_unlock(&lli->lli_lock);
1522                 CWARN("no group lock held\n");
1523                 RETURN(-EINVAL);
1524         }
1525         LASSERT(fd->fd_grouplock.cg_lock != NULL);
1526
1527         if (fd->fd_grouplock.cg_gid != arg) {
1528                 CWARN("group lock %lu doesn't match current id %lu\n",
1529                        arg, fd->fd_grouplock.cg_gid);
1530                 cfs_spin_unlock(&lli->lli_lock);
1531                 RETURN(-EINVAL);
1532         }
1533
1534         grouplock = fd->fd_grouplock;
1535         memset(&fd->fd_grouplock, 0, sizeof(fd->fd_grouplock));
1536         fd->fd_flags &= ~LL_FILE_GROUP_LOCKED;
1537         cfs_spin_unlock(&lli->lli_lock);
1538
1539         cl_put_grouplock(&grouplock);
1540         CDEBUG(D_INFO, "group lock %lu released\n", arg);
1541         RETURN(0);
1542 }
1543
1544 /**
1545  * Close inode open handle
1546  *
1547  * \param dentry [in]     dentry which contains the inode
1548  * \param it     [in,out] intent which contains open info and result
1549  *
1550  * \retval 0     success
1551  * \retval <0    failure
1552  */
1553 int ll_release_openhandle(struct dentry *dentry, struct lookup_intent *it)
1554 {
1555         struct inode *inode = dentry->d_inode;
1556         struct obd_client_handle *och;
1557         int rc;
1558         ENTRY;
1559
1560         LASSERT(inode);
1561
1562         /* Root ? Do nothing. */
1563         if (dentry->d_inode->i_sb->s_root == dentry)
1564                 RETURN(0);
1565
1566         /* No open handle to close? Move away */
1567         if (!it_disposition(it, DISP_OPEN_OPEN))
1568                 RETURN(0);
1569
1570         LASSERT(it_open_error(DISP_OPEN_OPEN, it) == 0);
1571
1572         OBD_ALLOC(och, sizeof(*och));
1573         if (!och)
1574                 GOTO(out, rc = -ENOMEM);
1575
1576         ll_och_fill(ll_i2sbi(inode)->ll_md_exp,
1577                     ll_i2info(inode), it, och);
1578
1579         rc = ll_close_inode_openhandle(ll_i2sbi(inode)->ll_md_exp,
1580                                        inode, och);
1581  out:
1582         /* this one is in place of ll_file_open */
1583         if (it_disposition(it, DISP_ENQ_OPEN_REF))
1584                 ptlrpc_req_finished(it->d.lustre.it_data);
1585         it_clear_disposition(it, DISP_ENQ_OPEN_REF);
1586         RETURN(rc);
1587 }
1588
1589 /**
1590  * Get size for inode for which FIEMAP mapping is requested.
1591  * Make the FIEMAP get_info call and returns the result.
1592  */
1593 int ll_do_fiemap(struct inode *inode, struct ll_user_fiemap *fiemap,
1594               int num_bytes)
1595 {
1596         struct obd_export *exp = ll_i2dtexp(inode);
1597         struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
1598         struct ll_fiemap_info_key fm_key = { .name = KEY_FIEMAP, };
1599         int vallen = num_bytes;
1600         int rc;
1601         ENTRY;
1602
1603         /* Checks for fiemap flags */
1604         if (fiemap->fm_flags & ~LUSTRE_FIEMAP_FLAGS_COMPAT) {
1605                 fiemap->fm_flags &= ~LUSTRE_FIEMAP_FLAGS_COMPAT;
1606                 return -EBADR;
1607         }
1608
1609         /* Check for FIEMAP_FLAG_SYNC */
1610         if (fiemap->fm_flags & FIEMAP_FLAG_SYNC) {
1611                 rc = filemap_fdatawrite(inode->i_mapping);
1612                 if (rc)
1613                         return rc;
1614         }
1615
1616         /* If the stripe_count > 1 and the application does not understand
1617          * DEVICE_ORDER flag, then it cannot interpret the extents correctly.
1618          */
1619         if (lsm->lsm_stripe_count > 1 &&
1620             !(fiemap->fm_flags & FIEMAP_FLAG_DEVICE_ORDER))
1621                 return -EOPNOTSUPP;
1622
1623         fm_key.oa.o_id = lsm->lsm_object_id;
1624         fm_key.oa.o_seq = lsm->lsm_object_seq;
1625         fm_key.oa.o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
1626
1627         obdo_from_inode(&fm_key.oa, inode, &ll_i2info(inode)->lli_fid,
1628                         OBD_MD_FLSIZE);
1629         /* If filesize is 0, then there would be no objects for mapping */
1630         if (fm_key.oa.o_size == 0) {
1631                 fiemap->fm_mapped_extents = 0;
1632                 RETURN(0);
1633         }
1634
1635         memcpy(&fm_key.fiemap, fiemap, sizeof(*fiemap));
1636
1637         rc = obd_get_info(exp, sizeof(fm_key), &fm_key, &vallen, fiemap, lsm);
1638         if (rc)
1639                 CERROR("obd_get_info failed: rc = %d\n", rc);
1640
1641         RETURN(rc);
1642 }
1643
1644 int ll_fid2path(struct obd_export *exp, void *arg)
1645 {
1646         struct getinfo_fid2path *gfout, *gfin;
1647         int outsize, rc;
1648         ENTRY;
1649
1650         /* Need to get the buflen */
1651         OBD_ALLOC_PTR(gfin);
1652         if (gfin == NULL)
1653                 RETURN(-ENOMEM);
1654         if (cfs_copy_from_user(gfin, arg, sizeof(*gfin))) {
1655                 OBD_FREE_PTR(gfin);
1656                 RETURN(-EFAULT);
1657         }
1658
1659         outsize = sizeof(*gfout) + gfin->gf_pathlen;
1660         OBD_ALLOC(gfout, outsize);
1661         if (gfout == NULL) {
1662                 OBD_FREE_PTR(gfin);
1663                 RETURN(-ENOMEM);
1664         }
1665         memcpy(gfout, gfin, sizeof(*gfout));
1666         OBD_FREE_PTR(gfin);
1667
1668         /* Call mdc_iocontrol */
1669         rc = obd_iocontrol(OBD_IOC_FID2PATH, exp, outsize, gfout, NULL);
1670         if (rc)
1671                 GOTO(gf_free, rc);
1672         if (cfs_copy_to_user(arg, gfout, outsize))
1673                 rc = -EFAULT;
1674
1675 gf_free:
1676         OBD_FREE(gfout, outsize);
1677         RETURN(rc);
1678 }
1679
1680 static int ll_ioctl_fiemap(struct inode *inode, unsigned long arg)
1681 {
1682         struct ll_user_fiemap *fiemap_s;
1683         size_t num_bytes, ret_bytes;
1684         unsigned int extent_count;
1685         int rc = 0;
1686
1687         /* Get the extent count so we can calculate the size of
1688          * required fiemap buffer */
1689         if (get_user(extent_count,
1690             &((struct ll_user_fiemap __user *)arg)->fm_extent_count))
1691                 RETURN(-EFAULT);
1692         num_bytes = sizeof(*fiemap_s) + (extent_count *
1693                                          sizeof(struct ll_fiemap_extent));
1694
1695         OBD_VMALLOC(fiemap_s, num_bytes);
1696         if (fiemap_s == NULL)
1697                 RETURN(-ENOMEM);
1698
1699         /* get the fiemap value */
1700         if (copy_from_user(fiemap_s,(struct ll_user_fiemap __user *)arg,
1701                            sizeof(*fiemap_s)))
1702                 GOTO(error, rc = -EFAULT);
1703
1704         /* If fm_extent_count is non-zero, read the first extent since
1705          * it is used to calculate end_offset and device from previous
1706          * fiemap call. */
1707         if (extent_count) {
1708                 if (copy_from_user(&fiemap_s->fm_extents[0],
1709                     (char __user *)arg + sizeof(*fiemap_s),
1710                     sizeof(struct ll_fiemap_extent)))
1711                         GOTO(error, rc = -EFAULT);
1712         }
1713
1714         rc = ll_do_fiemap(inode, fiemap_s, num_bytes);
1715         if (rc)
1716                 GOTO(error, rc);
1717
1718         ret_bytes = sizeof(struct ll_user_fiemap);
1719
1720         if (extent_count != 0)
1721                 ret_bytes += (fiemap_s->fm_mapped_extents *
1722                                  sizeof(struct ll_fiemap_extent));
1723
1724         if (copy_to_user((void *)arg, fiemap_s, ret_bytes))
1725                 rc = -EFAULT;
1726
1727 error:
1728         OBD_VFREE(fiemap_s, num_bytes);
1729         RETURN(rc);
1730 }
1731
1732 int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
1733                   unsigned long arg)
1734 {
1735         struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
1736         int flags;
1737         ENTRY;
1738
1739         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),cmd=%x\n", inode->i_ino,
1740                inode->i_generation, inode, cmd);
1741         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_IOCTL, 1);
1742
1743         /* asm-ppc{,64} declares TCGETS, et. al. as type 't' not 'T' */
1744         if (_IOC_TYPE(cmd) == 'T' || _IOC_TYPE(cmd) == 't') /* tty ioctls */
1745                 RETURN(-ENOTTY);
1746
1747         switch(cmd) {
1748         case LL_IOC_GETFLAGS:
1749                 /* Get the current value of the file flags */
1750                 return put_user(fd->fd_flags, (int *)arg);
1751         case LL_IOC_SETFLAGS:
1752         case LL_IOC_CLRFLAGS:
1753                 /* Set or clear specific file flags */
1754                 /* XXX This probably needs checks to ensure the flags are
1755                  *     not abused, and to handle any flag side effects.
1756                  */
1757                 if (get_user(flags, (int *) arg))
1758                         RETURN(-EFAULT);
1759
1760                 if (cmd == LL_IOC_SETFLAGS) {
1761                         if ((flags & LL_FILE_IGNORE_LOCK) &&
1762                             !(file->f_flags & O_DIRECT)) {
1763                                 CERROR("%s: unable to disable locking on "
1764                                        "non-O_DIRECT file\n", current->comm);
1765                                 RETURN(-EINVAL);
1766                         }
1767
1768                         fd->fd_flags |= flags;
1769                 } else {
1770                         fd->fd_flags &= ~flags;
1771                 }
1772                 RETURN(0);
1773         case LL_IOC_LOV_SETSTRIPE:
1774                 RETURN(ll_lov_setstripe(inode, file, arg));
1775         case LL_IOC_LOV_SETEA:
1776                 RETURN(ll_lov_setea(inode, file, arg));
1777         case LL_IOC_LOV_GETSTRIPE:
1778                 RETURN(ll_lov_getstripe(inode, arg));
1779         case LL_IOC_RECREATE_OBJ:
1780                 RETURN(ll_lov_recreate_obj(inode, arg));
1781         case LL_IOC_RECREATE_FID:
1782                 RETURN(ll_lov_recreate_fid(inode, arg));
1783         case FSFILT_IOC_FIEMAP:
1784                 RETURN(ll_ioctl_fiemap(inode, arg));
1785         case FSFILT_IOC_GETFLAGS:
1786         case FSFILT_IOC_SETFLAGS:
1787                 RETURN(ll_iocontrol(inode, file, cmd, arg));
1788         case FSFILT_IOC_GETVERSION_OLD:
1789         case FSFILT_IOC_GETVERSION:
1790                 RETURN(put_user(inode->i_generation, (int *)arg));
1791         case LL_IOC_GROUP_LOCK:
1792                 RETURN(ll_get_grouplock(inode, file, arg));
1793         case LL_IOC_GROUP_UNLOCK:
1794                 RETURN(ll_put_grouplock(inode, file, arg));
1795         case IOC_OBD_STATFS:
1796                 RETURN(ll_obd_statfs(inode, (void *)arg));
1797
1798         /* We need to special case any other ioctls we want to handle,
1799          * to send them to the MDS/OST as appropriate and to properly
1800          * network encode the arg field.
1801         case FSFILT_IOC_SETVERSION_OLD:
1802         case FSFILT_IOC_SETVERSION:
1803         */
1804         case LL_IOC_FLUSHCTX:
1805                 RETURN(ll_flush_ctx(inode));
1806         case LL_IOC_PATH2FID: {
1807                 if (cfs_copy_to_user((void *)arg, ll_inode2fid(inode),
1808                                      sizeof(struct lu_fid)))
1809                         RETURN(-EFAULT);
1810
1811                 RETURN(0);
1812         }
1813         case OBD_IOC_FID2PATH:
1814                 RETURN(ll_fid2path(ll_i2mdexp(inode), (void *)arg));
1815
1816         case LL_IOC_GET_MDTIDX: {
1817                 int mdtidx;
1818
1819                 mdtidx = ll_get_mdt_idx(inode);
1820                 if (mdtidx < 0)
1821                         RETURN(mdtidx);
1822
1823                 if (put_user((int)mdtidx, (int*)arg))
1824                         RETURN(-EFAULT);
1825
1826                 RETURN(0);
1827         }
1828
1829         default: {
1830                 int err;
1831
1832                 if (LLIOC_STOP ==
1833                     ll_iocontrol_call(inode, file, cmd, arg, &err))
1834                         RETURN(err);
1835
1836                 RETURN(obd_iocontrol(cmd, ll_i2dtexp(inode), 0, NULL,
1837                                      (void *)arg));
1838         }
1839         }
1840 }
1841
1842 loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
1843 {
1844         struct inode *inode = file->f_dentry->d_inode;
1845         loff_t retval;
1846         ENTRY;
1847         retval = offset + ((origin == 2) ? i_size_read(inode) :
1848                            (origin == 1) ? file->f_pos : 0);
1849         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), to=%Lu=%#Lx(%s)\n",
1850                inode->i_ino, inode->i_generation, inode, retval, retval,
1851                origin == 2 ? "SEEK_END": origin == 1 ? "SEEK_CUR" : "SEEK_SET");
1852         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_LLSEEK, 1);
1853
1854         if (origin == 2) { /* SEEK_END */
1855                 int nonblock = 0, rc;
1856
1857                 if (file->f_flags & O_NONBLOCK)
1858                         nonblock = LDLM_FL_BLOCK_NOWAIT;
1859
1860                 rc = cl_glimpse_size(inode);
1861                 if (rc != 0)
1862                         RETURN(rc);
1863
1864                 offset += i_size_read(inode);
1865         } else if (origin == 1) { /* SEEK_CUR */
1866                 offset += file->f_pos;
1867         }
1868
1869         retval = -EINVAL;
1870         if (offset >= 0 && offset <= ll_file_maxbytes(inode)) {
1871                 if (offset != file->f_pos) {
1872                         file->f_pos = offset;
1873                 }
1874                 retval = offset;
1875         }
1876
1877         RETURN(retval);
1878 }
1879
1880 #ifdef HAVE_FLUSH_OWNER_ID
1881 int ll_flush(struct file *file, fl_owner_t id)
1882 #else
1883 int ll_flush(struct file *file)
1884 #endif
1885 {
1886         struct inode *inode = file->f_dentry->d_inode;
1887         struct ll_inode_info *lli = ll_i2info(inode);
1888         struct lov_stripe_md *lsm = lli->lli_smd;
1889         int rc, err;
1890
1891         /* catch async errors that were recorded back when async writeback
1892          * failed for pages in this mapping. */
1893         rc = lli->lli_async_rc;
1894         lli->lli_async_rc = 0;
1895         if (lsm) {
1896                 err = lov_test_and_clear_async_rc(lsm);
1897                 if (rc == 0)
1898                         rc = err;
1899         }
1900
1901         return rc ? -EIO : 0;
1902 }
1903
1904 int ll_fsync(struct file *file, struct dentry *dentry, int data)
1905 {
1906         struct inode *inode = dentry->d_inode;
1907         struct ll_inode_info *lli = ll_i2info(inode);
1908         struct lov_stripe_md *lsm = lli->lli_smd;
1909         struct ptlrpc_request *req;
1910         struct obd_capa *oc;
1911         int rc, err;
1912         ENTRY;
1913         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
1914                inode->i_generation, inode);
1915         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FSYNC, 1);
1916
1917         /* fsync's caller has already called _fdata{sync,write}, we want
1918          * that IO to finish before calling the osc and mdc sync methods */
1919         rc = filemap_fdatawait(inode->i_mapping);
1920
1921         /* catch async errors that were recorded back when async writeback
1922          * failed for pages in this mapping. */
1923         err = lli->lli_async_rc;
1924         lli->lli_async_rc = 0;
1925         if (rc == 0)
1926                 rc = err;
1927         if (lsm) {
1928                 err = lov_test_and_clear_async_rc(lsm);
1929                 if (rc == 0)
1930                         rc = err;
1931         }
1932
1933         oc = ll_mdscapa_get(inode);
1934         err = md_sync(ll_i2sbi(inode)->ll_md_exp, ll_inode2fid(inode), oc,
1935                       &req);
1936         capa_put(oc);
1937         if (!rc)
1938                 rc = err;
1939         if (!err)
1940                 ptlrpc_req_finished(req);
1941
1942         if (data && lsm) {
1943                 struct obdo *oa;
1944
1945                 OBDO_ALLOC(oa);
1946                 if (!oa)
1947                         RETURN(rc ? rc : -ENOMEM);
1948
1949                 oa->o_id = lsm->lsm_object_id;
1950                 oa->o_seq = lsm->lsm_object_seq;
1951                 oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
1952                 obdo_from_inode(oa, inode, &ll_i2info(inode)->lli_fid,
1953                                 OBD_MD_FLTYPE | OBD_MD_FLATIME |
1954                                 OBD_MD_FLMTIME | OBD_MD_FLCTIME |
1955                                 OBD_MD_FLGROUP);
1956
1957                 oc = ll_osscapa_get(inode, CAPA_OPC_OSS_WRITE);
1958                 err = obd_sync(ll_i2sbi(inode)->ll_dt_exp, oa, lsm,
1959                                0, OBD_OBJECT_EOF, oc);
1960                 capa_put(oc);
1961                 if (!rc)
1962                         rc = err;
1963                 OBDO_FREE(oa);
1964         }
1965
1966         RETURN(rc);
1967 }
1968
1969 int ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock)
1970 {
1971         struct inode *inode = file->f_dentry->d_inode;
1972         struct ll_sb_info *sbi = ll_i2sbi(inode);
1973         struct ldlm_enqueue_info einfo = { .ei_type = LDLM_FLOCK,
1974                                            .ei_cb_cp =ldlm_flock_completion_ast,
1975                                            .ei_cbdata = file_lock };
1976         struct md_op_data *op_data;
1977         struct lustre_handle lockh = {0};
1978         ldlm_policy_data_t flock;
1979         int flags = 0;
1980         int rc;
1981         ENTRY;
1982
1983         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu file_lock=%p\n",
1984                inode->i_ino, file_lock);
1985
1986         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_FLOCK, 1);
1987
1988         if (file_lock->fl_flags & FL_FLOCK) {
1989                 LASSERT((cmd == F_SETLKW) || (cmd == F_SETLK));
1990                 /* set missing params for flock() calls */
1991                 file_lock->fl_end = OFFSET_MAX;
1992                 file_lock->fl_pid = current->tgid;
1993         }
1994         flock.l_flock.pid = file_lock->fl_pid;
1995         flock.l_flock.start = file_lock->fl_start;
1996         flock.l_flock.end = file_lock->fl_end;
1997
1998         switch (file_lock->fl_type) {
1999         case F_RDLCK:
2000                 einfo.ei_mode = LCK_PR;
2001                 break;
2002         case F_UNLCK:
2003                 /* An unlock request may or may not have any relation to
2004                  * existing locks so we may not be able to pass a lock handle
2005                  * via a normal ldlm_lock_cancel() request. The request may even
2006                  * unlock a byte range in the middle of an existing lock. In
2007                  * order to process an unlock request we need all of the same
2008                  * information that is given with a normal read or write record
2009                  * lock request. To avoid creating another ldlm unlock (cancel)
2010                  * message we'll treat a LCK_NL flock request as an unlock. */
2011                 einfo.ei_mode = LCK_NL;
2012                 break;
2013         case F_WRLCK:
2014                 einfo.ei_mode = LCK_PW;
2015                 break;
2016         default:
2017                 CERROR("unknown fcntl lock type: %d\n", file_lock->fl_type);
2018                 RETURN (-EINVAL);
2019         }
2020
2021         switch (cmd) {
2022         case F_SETLKW:
2023 #ifdef F_SETLKW64
2024         case F_SETLKW64:
2025 #endif
2026                 flags = 0;
2027                 break;
2028         case F_SETLK:
2029 #ifdef F_SETLK64
2030         case F_SETLK64:
2031 #endif
2032                 flags = LDLM_FL_BLOCK_NOWAIT;
2033                 break;
2034         case F_GETLK:
2035 #ifdef F_GETLK64
2036         case F_GETLK64:
2037 #endif
2038                 flags = LDLM_FL_TEST_LOCK;
2039                 /* Save the old mode so that if the mode in the lock changes we
2040                  * can decrement the appropriate reader or writer refcount. */
2041                 file_lock->fl_type = einfo.ei_mode;
2042                 break;
2043         default:
2044                 CERROR("unknown fcntl lock command: %d\n", cmd);
2045                 RETURN (-EINVAL);
2046         }
2047
2048         op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
2049                                      LUSTRE_OPC_ANY, NULL);
2050         if (IS_ERR(op_data))
2051                 RETURN(PTR_ERR(op_data));
2052
2053         CDEBUG(D_DLMTRACE, "inode=%lu, pid=%u, flags=%#x, mode=%u, "
2054                "start="LPU64", end="LPU64"\n", inode->i_ino, flock.l_flock.pid,
2055                flags, einfo.ei_mode, flock.l_flock.start, flock.l_flock.end);
2056
2057         rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL,
2058                         op_data, &lockh, &flock, 0, NULL /* req */, flags);
2059
2060         ll_finish_md_op_data(op_data);
2061
2062         if ((file_lock->fl_flags & FL_FLOCK) &&
2063             (rc == 0 || file_lock->fl_type == F_UNLCK))
2064                 ll_flock_lock_file_wait(file, file_lock, (cmd == F_SETLKW));
2065 #ifdef HAVE_F_OP_FLOCK
2066         if ((file_lock->fl_flags & FL_POSIX) &&
2067             (rc == 0 || file_lock->fl_type == F_UNLCK) &&
2068             !(flags & LDLM_FL_TEST_LOCK))
2069                 posix_lock_file_wait(file, file_lock);
2070 #endif
2071
2072         RETURN(rc);
2073 }
2074
2075 int ll_file_noflock(struct file *file, int cmd, struct file_lock *file_lock)
2076 {
2077         ENTRY;
2078
2079         RETURN(-ENOSYS);
2080 }
2081
2082 int ll_have_md_lock(struct inode *inode, __u64 bits,  ldlm_mode_t l_req_mode)
2083 {
2084         struct lustre_handle lockh;
2085         ldlm_policy_data_t policy = { .l_inodebits = {bits}};
2086         ldlm_mode_t mode = (l_req_mode == LCK_MINMODE) ?
2087                                 (LCK_CR|LCK_CW|LCK_PR|LCK_PW) : l_req_mode;
2088         struct lu_fid *fid;
2089         int flags;
2090         ENTRY;
2091
2092         if (!inode)
2093                RETURN(0);
2094
2095         fid = &ll_i2info(inode)->lli_fid;
2096         CDEBUG(D_INFO, "trying to match res "DFID" mode %s\n", PFID(fid),
2097                ldlm_lockname[mode]);
2098
2099         flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_CBPENDING | LDLM_FL_TEST_LOCK;
2100         if (md_lock_match(ll_i2mdexp(inode), flags, fid, LDLM_IBITS, &policy,
2101                           mode, &lockh)) {
2102                 RETURN(1);
2103         }
2104         RETURN(0);
2105 }
2106
2107 ldlm_mode_t ll_take_md_lock(struct inode *inode, __u64 bits,
2108                             struct lustre_handle *lockh)
2109 {
2110         ldlm_policy_data_t policy = { .l_inodebits = {bits}};
2111         struct lu_fid *fid;
2112         ldlm_mode_t rc;
2113         int flags;
2114         ENTRY;
2115
2116         fid = &ll_i2info(inode)->lli_fid;
2117         CDEBUG(D_INFO, "trying to match res "DFID"\n", PFID(fid));
2118
2119         flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_CBPENDING;
2120         rc = md_lock_match(ll_i2mdexp(inode), flags, fid, LDLM_IBITS, &policy,
2121                            LCK_CR|LCK_CW|LCK_PR|LCK_PW, lockh);
2122         RETURN(rc);
2123 }
2124
2125 static int ll_inode_revalidate_fini(struct inode *inode, int rc) {
2126         if (rc == -ENOENT) { /* Already unlinked. Just update nlink
2127                               * and return success */
2128                 inode->i_nlink = 0;
2129                 /* This path cannot be hit for regular files unless in
2130                  * case of obscure races, so no need to to validate
2131                  * size. */
2132                 if (!S_ISREG(inode->i_mode) &&
2133                     !S_ISDIR(inode->i_mode))
2134                         return 0;
2135         }
2136
2137         if (rc) {
2138                 CERROR("failure %d inode %lu\n", rc, inode->i_ino);
2139                 return -abs(rc);
2140
2141         }
2142
2143         return 0;
2144 }
2145
2146 int __ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it,
2147                              __u64 ibits)
2148 {
2149         struct inode *inode = dentry->d_inode;
2150         struct ptlrpc_request *req = NULL;
2151         struct ll_sb_info *sbi;
2152         struct obd_export *exp;
2153         int rc = 0;
2154         ENTRY;
2155
2156         if (!inode) {
2157                 CERROR("REPORT THIS LINE TO PETER\n");
2158                 RETURN(0);
2159         }
2160         sbi = ll_i2sbi(inode);
2161
2162         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),name=%s\n",
2163                inode->i_ino, inode->i_generation, inode, dentry->d_name.name);
2164
2165         exp = ll_i2mdexp(inode);
2166
2167         if (exp->exp_connect_flags & OBD_CONNECT_ATTRFID) {
2168                 struct lookup_intent oit = { .it_op = IT_GETATTR };
2169                 struct md_op_data *op_data;
2170
2171                 /* Call getattr by fid, so do not provide name at all. */
2172                 op_data = ll_prep_md_op_data(NULL, dentry->d_parent->d_inode,
2173                                              dentry->d_inode, NULL, 0, 0,
2174                                              LUSTRE_OPC_ANY, NULL);
2175                 if (IS_ERR(op_data))
2176                         RETURN(PTR_ERR(op_data));
2177
2178                 oit.it_create_mode |= M_CHECK_STALE;
2179                 rc = md_intent_lock(exp, op_data, NULL, 0,
2180                                     /* we are not interested in name
2181                                        based lookup */
2182                                     &oit, 0, &req,
2183                                     ll_md_blocking_ast, 0);
2184                 ll_finish_md_op_data(op_data);
2185                 oit.it_create_mode &= ~M_CHECK_STALE;
2186                 if (rc < 0) {
2187                         rc = ll_inode_revalidate_fini(inode, rc);
2188                         GOTO (out, rc);
2189                 }
2190
2191                 rc = ll_revalidate_it_finish(req, &oit, dentry);
2192                 if (rc != 0) {
2193                         ll_intent_release(&oit);
2194                         GOTO(out, rc);
2195                 }
2196
2197                 /* Unlinked? Unhash dentry, so it is not picked up later by
2198                    do_lookup() -> ll_revalidate_it(). We cannot use d_drop
2199                    here to preserve get_cwd functionality on 2.6.
2200                    Bug 10503 */
2201                 if (!dentry->d_inode->i_nlink) {
2202                         cfs_spin_lock(&ll_lookup_lock);
2203                         spin_lock(&dcache_lock);
2204                         ll_drop_dentry(dentry);
2205                         spin_unlock(&dcache_lock);
2206                         cfs_spin_unlock(&ll_lookup_lock);
2207                 }
2208
2209                 ll_lookup_finish_locks(&oit, dentry);
2210         } else if (!ll_have_md_lock(dentry->d_inode, ibits, LCK_MINMODE)) {
2211                 struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
2212                 obd_valid valid = OBD_MD_FLGETATTR;
2213                 struct md_op_data *op_data;
2214                 int ealen = 0;
2215
2216                 if (S_ISREG(inode->i_mode)) {
2217                         rc = ll_get_max_mdsize(sbi, &ealen);
2218                         if (rc)
2219                                 RETURN(rc);
2220                         valid |= OBD_MD_FLEASIZE | OBD_MD_FLMODEASIZE;
2221                 }
2222
2223                 op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL,
2224                                              0, ealen, LUSTRE_OPC_ANY,
2225                                              NULL);
2226                 if (op_data == NULL)
2227                         RETURN(-ENOMEM);
2228
2229                 op_data->op_valid = valid;
2230                 /* Once OBD_CONNECT_ATTRFID is not supported, we can't find one
2231                  * capa for this inode. Because we only keep capas of dirs
2232                  * fresh. */
2233                 rc = md_getattr(sbi->ll_md_exp, op_data, &req);
2234                 ll_finish_md_op_data(op_data);
2235                 if (rc) {
2236                         rc = ll_inode_revalidate_fini(inode, rc);
2237                         RETURN(rc);
2238                 }
2239
2240                 rc = ll_prep_inode(&inode, req, NULL);
2241         }
2242 out:
2243         ptlrpc_req_finished(req);
2244         return rc;
2245 }
2246
2247 int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it)
2248 {
2249         struct inode *inode = dentry->d_inode;
2250         int rc;
2251         ENTRY;
2252
2253         rc = __ll_inode_revalidate_it(dentry, it, MDS_INODELOCK_UPDATE |
2254                                                   MDS_INODELOCK_LOOKUP);
2255
2256         /* if object not yet allocated, don't validate size */
2257         if (rc == 0 && ll_i2info(dentry->d_inode)->lli_smd == NULL) {
2258                 LTIME_S(inode->i_atime) = ll_i2info(inode)->lli_lvb.lvb_atime;
2259                 LTIME_S(inode->i_mtime) = ll_i2info(inode)->lli_lvb.lvb_mtime;
2260                 LTIME_S(inode->i_ctime) = ll_i2info(inode)->lli_lvb.lvb_ctime;
2261                 RETURN(0);
2262         }
2263
2264         /* cl_glimpse_size will prefer locally cached writes if they extend
2265          * the file */
2266
2267         if (rc == 0)
2268                 rc = cl_glimpse_size(inode);
2269
2270         RETURN(rc);
2271 }
2272
2273 int ll_getattr_it(struct vfsmount *mnt, struct dentry *de,
2274                   struct lookup_intent *it, struct kstat *stat)
2275 {
2276         struct inode *inode = de->d_inode;
2277         struct ll_inode_info *lli = ll_i2info(inode);
2278         int res = 0;
2279
2280         res = ll_inode_revalidate_it(de, it);
2281         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_GETATTR, 1);
2282
2283         if (res)
2284                 return res;
2285
2286         stat->dev = inode->i_sb->s_dev;
2287         if (ll_need_32bit_api(ll_i2sbi(inode)))
2288                 stat->ino = cl_fid_build_ino32(&lli->lli_fid);
2289         else
2290                 stat->ino = inode->i_ino;
2291
2292         stat->mode = inode->i_mode;
2293         stat->nlink = inode->i_nlink;
2294         stat->uid = inode->i_uid;
2295         stat->gid = inode->i_gid;
2296         stat->rdev = kdev_t_to_nr(inode->i_rdev);
2297         stat->atime = inode->i_atime;
2298         stat->mtime = inode->i_mtime;
2299         stat->ctime = inode->i_ctime;
2300 #ifdef HAVE_INODE_BLKSIZE
2301         stat->blksize = inode->i_blksize;
2302 #else
2303         stat->blksize = 1 << inode->i_blkbits;
2304 #endif
2305
2306         stat->size = i_size_read(inode);
2307         stat->blocks = inode->i_blocks;
2308
2309         return 0;
2310 }
2311 int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat)
2312 {
2313         struct lookup_intent it = { .it_op = IT_GETATTR };
2314
2315         return ll_getattr_it(mnt, de, &it, stat);
2316 }
2317
2318 #ifdef HAVE_LINUX_FIEMAP_H
2319 int ll_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
2320                 __u64 start, __u64 len)
2321 {
2322         int rc;
2323         size_t num_bytes;
2324         struct ll_user_fiemap *fiemap;
2325         unsigned int extent_count = fieinfo->fi_extents_max;
2326
2327         num_bytes = sizeof(*fiemap) + (extent_count *
2328                                        sizeof(struct ll_fiemap_extent));
2329         OBD_VMALLOC(fiemap, num_bytes);
2330
2331         if (fiemap == NULL)
2332                 RETURN(-ENOMEM);
2333
2334         fiemap->fm_flags = fieinfo->fi_flags;
2335         fiemap->fm_extent_count = fieinfo->fi_extents_max;
2336         fiemap->fm_start = start;
2337         fiemap->fm_length = len;
2338         memcpy(&fiemap->fm_extents[0], fieinfo->fi_extents_start,
2339                sizeof(struct ll_fiemap_extent));
2340
2341         rc = ll_do_fiemap(inode, fiemap, num_bytes);
2342
2343         fieinfo->fi_flags = fiemap->fm_flags;
2344         fieinfo->fi_extents_mapped = fiemap->fm_mapped_extents;
2345         memcpy(fieinfo->fi_extents_start, &fiemap->fm_extents[0],
2346                fiemap->fm_mapped_extents * sizeof(struct ll_fiemap_extent));
2347
2348         OBD_VFREE(fiemap, num_bytes);
2349         return rc;
2350 }
2351 #endif
2352
2353
2354 static
2355 int lustre_check_acl(struct inode *inode, int mask)
2356 {
2357 #ifdef CONFIG_FS_POSIX_ACL
2358         struct ll_inode_info *lli = ll_i2info(inode);
2359         struct posix_acl *acl;
2360         int rc;
2361         ENTRY;
2362
2363         cfs_spin_lock(&lli->lli_lock);
2364         acl = posix_acl_dup(lli->lli_posix_acl);
2365         cfs_spin_unlock(&lli->lli_lock);
2366
2367         if (!acl)
2368                 RETURN(-EAGAIN);
2369
2370         rc = posix_acl_permission(inode, acl, mask);
2371         posix_acl_release(acl);
2372
2373         RETURN(rc);
2374 #else
2375         return -EAGAIN;
2376 #endif
2377 }
2378
2379 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
2380 #ifndef HAVE_INODE_PERMISION_2ARGS
2381 int ll_inode_permission(struct inode *inode, int mask, struct nameidata *nd)
2382 #else
2383 int ll_inode_permission(struct inode *inode, int mask)
2384 #endif
2385 {
2386         int rc = 0;
2387         ENTRY;
2388
2389        /* as root inode are NOT getting validated in lookup operation,
2390         * need to do it before permission check. */
2391
2392         if (inode == inode->i_sb->s_root->d_inode) {
2393                 struct lookup_intent it = { .it_op = IT_LOOKUP };
2394
2395                 rc = __ll_inode_revalidate_it(inode->i_sb->s_root, &it,
2396                                               MDS_INODELOCK_LOOKUP);
2397                 if (rc)
2398                         RETURN(rc);
2399         }
2400
2401         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), inode mode %x mask %o\n",
2402                inode->i_ino, inode->i_generation, inode, inode->i_mode, mask);
2403
2404         if (ll_i2sbi(inode)->ll_flags & LL_SBI_RMT_CLIENT)
2405                 return lustre_check_remote_perm(inode, mask);
2406
2407         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_INODE_PERM, 1);
2408         rc = generic_permission(inode, mask, lustre_check_acl);
2409
2410         RETURN(rc);
2411 }
2412 #else
2413 int ll_inode_permission(struct inode *inode, int mask, struct nameidata *nd)
2414 {
2415         int mode = inode->i_mode;
2416         int rc;
2417
2418         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), mask %o\n",
2419                inode->i_ino, inode->i_generation, inode, mask);
2420
2421         if (ll_i2sbi(inode)->ll_flags & LL_SBI_RMT_CLIENT)
2422                 return lustre_check_remote_perm(inode, mask);
2423
2424         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_INODE_PERM, 1);
2425
2426         if ((mask & MAY_WRITE) && IS_RDONLY(inode) &&
2427             (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
2428                 return -EROFS;
2429         if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
2430                 return -EACCES;
2431         if (cfs_curproc_fsuid() == inode->i_uid) {
2432                 mode >>= 6;
2433         } else if (1) {
2434                 if (((mode >> 3) & mask & S_IRWXO) != mask)
2435                         goto check_groups;
2436                 rc = lustre_check_acl(inode, mask);
2437                 if (rc == -EAGAIN)
2438                         goto check_groups;
2439                 if (rc == -EACCES)
2440                         goto check_capabilities;
2441                 return rc;
2442         } else {
2443 check_groups:
2444                 if (cfs_curproc_is_in_groups(inode->i_gid))
2445                         mode >>= 3;
2446         }
2447         if ((mode & mask & S_IRWXO) == mask)
2448                 return 0;
2449
2450 check_capabilities:
2451         if (!(mask & MAY_EXEC) ||
2452             (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode))
2453                 if (cfs_capable(CFS_CAP_DAC_OVERRIDE))
2454                         return 0;
2455
2456         if (cfs_capable(CFS_CAP_DAC_READ_SEARCH) && ((mask == MAY_READ) ||
2457             (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE))))
2458                 return 0;
2459
2460         return -EACCES;
2461 }
2462 #endif
2463
2464 #ifdef HAVE_FILE_READV
2465 #define READ_METHOD readv
2466 #define READ_FUNCTION ll_file_readv
2467 #define WRITE_METHOD writev
2468 #define WRITE_FUNCTION ll_file_writev
2469 #else
2470 #define READ_METHOD aio_read
2471 #define READ_FUNCTION ll_file_aio_read
2472 #define WRITE_METHOD aio_write
2473 #define WRITE_FUNCTION ll_file_aio_write
2474 #endif
2475
2476 /* -o localflock - only provides locally consistent flock locks */
2477 struct file_operations ll_file_operations = {
2478         .read           = ll_file_read,
2479         .READ_METHOD    = READ_FUNCTION,
2480         .write          = ll_file_write,
2481         .WRITE_METHOD   = WRITE_FUNCTION,
2482         .ioctl          = ll_file_ioctl,
2483         .open           = ll_file_open,
2484         .release        = ll_file_release,
2485         .mmap           = ll_file_mmap,
2486         .llseek         = ll_file_seek,
2487 #ifdef HAVE_KERNEL_SENDFILE
2488         .sendfile       = ll_file_sendfile,
2489 #endif
2490 #ifdef HAVE_KERNEL_SPLICE_READ
2491         .splice_read    = ll_file_splice_read,
2492 #endif
2493         .fsync          = ll_fsync,
2494         .flush          = ll_flush
2495 };
2496
2497 struct file_operations ll_file_operations_flock = {
2498         .read           = ll_file_read,
2499         .READ_METHOD    = READ_FUNCTION,
2500         .write          = ll_file_write,
2501         .WRITE_METHOD   = WRITE_FUNCTION,
2502         .ioctl          = ll_file_ioctl,
2503         .open           = ll_file_open,
2504         .release        = ll_file_release,
2505         .mmap           = ll_file_mmap,
2506         .llseek         = ll_file_seek,
2507 #ifdef HAVE_KERNEL_SENDFILE
2508         .sendfile       = ll_file_sendfile,
2509 #endif
2510 #ifdef HAVE_KERNEL_SPLICE_READ
2511         .splice_read    = ll_file_splice_read,
2512 #endif
2513         .fsync          = ll_fsync,
2514         .flush          = ll_flush,
2515 #ifdef HAVE_F_OP_FLOCK
2516         .flock          = ll_file_flock,
2517 #endif
2518         .lock           = ll_file_flock
2519 };
2520
2521 /* These are for -o noflock - to return ENOSYS on flock calls */
2522 struct file_operations ll_file_operations_noflock = {
2523         .read           = ll_file_read,
2524         .READ_METHOD    = READ_FUNCTION,
2525         .write          = ll_file_write,
2526         .WRITE_METHOD   = WRITE_FUNCTION,
2527         .ioctl          = ll_file_ioctl,
2528         .open           = ll_file_open,
2529         .release        = ll_file_release,
2530         .mmap           = ll_file_mmap,
2531         .llseek         = ll_file_seek,
2532 #ifdef HAVE_KERNEL_SENDFILE
2533         .sendfile       = ll_file_sendfile,
2534 #endif
2535 #ifdef HAVE_KERNEL_SPLICE_READ
2536         .splice_read    = ll_file_splice_read,
2537 #endif
2538         .fsync          = ll_fsync,
2539         .flush          = ll_flush,
2540 #ifdef HAVE_F_OP_FLOCK
2541         .flock          = ll_file_noflock,
2542 #endif
2543         .lock           = ll_file_noflock
2544 };
2545
2546 struct inode_operations ll_file_inode_operations = {
2547 #ifdef HAVE_VFS_INTENT_PATCHES
2548         .setattr_raw    = ll_setattr_raw,
2549 #endif
2550         .setattr        = ll_setattr,
2551         .truncate       = ll_truncate,
2552         .getattr        = ll_getattr,
2553         .permission     = ll_inode_permission,
2554         .setxattr       = ll_setxattr,
2555         .getxattr       = ll_getxattr,
2556         .listxattr      = ll_listxattr,
2557         .removexattr    = ll_removexattr,
2558 #ifdef  HAVE_LINUX_FIEMAP_H
2559         .fiemap         = ll_fiemap,
2560 #endif
2561 };
2562
2563 /* dynamic ioctl number support routins */
2564 static struct llioc_ctl_data {
2565         cfs_rw_semaphore_t      ioc_sem;
2566         cfs_list_t              ioc_head;
2567 } llioc = {
2568         __RWSEM_INITIALIZER(llioc.ioc_sem),
2569         CFS_LIST_HEAD_INIT(llioc.ioc_head)
2570 };
2571
2572
2573 struct llioc_data {
2574         cfs_list_t              iocd_list;
2575         unsigned int            iocd_size;
2576         llioc_callback_t        iocd_cb;
2577         unsigned int            iocd_count;
2578         unsigned int            iocd_cmd[0];
2579 };
2580
2581 void *ll_iocontrol_register(llioc_callback_t cb, int count, unsigned int *cmd)
2582 {
2583         unsigned int size;
2584         struct llioc_data *in_data = NULL;
2585         ENTRY;
2586
2587         if (cb == NULL || cmd == NULL ||
2588             count > LLIOC_MAX_CMD || count < 0)
2589                 RETURN(NULL);
2590
2591         size = sizeof(*in_data) + count * sizeof(unsigned int);
2592         OBD_ALLOC(in_data, size);
2593         if (in_data == NULL)
2594                 RETURN(NULL);
2595
2596         memset(in_data, 0, sizeof(*in_data));
2597         in_data->iocd_size = size;
2598         in_data->iocd_cb = cb;
2599         in_data->iocd_count = count;
2600         memcpy(in_data->iocd_cmd, cmd, sizeof(unsigned int) * count);
2601
2602         cfs_down_write(&llioc.ioc_sem);
2603         cfs_list_add_tail(&in_data->iocd_list, &llioc.ioc_head);
2604         cfs_up_write(&llioc.ioc_sem);
2605
2606         RETURN(in_data);
2607 }
2608
2609 void ll_iocontrol_unregister(void *magic)
2610 {
2611         struct llioc_data *tmp;
2612
2613         if (magic == NULL)
2614                 return;
2615
2616         cfs_down_write(&llioc.ioc_sem);
2617         cfs_list_for_each_entry(tmp, &llioc.ioc_head, iocd_list) {
2618                 if (tmp == magic) {
2619                         unsigned int size = tmp->iocd_size;
2620
2621                         cfs_list_del(&tmp->iocd_list);
2622                         cfs_up_write(&llioc.ioc_sem);
2623
2624                         OBD_FREE(tmp, size);
2625                         return;
2626                 }
2627         }
2628         cfs_up_write(&llioc.ioc_sem);
2629
2630         CWARN("didn't find iocontrol register block with magic: %p\n", magic);
2631 }
2632
2633 EXPORT_SYMBOL(ll_iocontrol_register);
2634 EXPORT_SYMBOL(ll_iocontrol_unregister);
2635
2636 enum llioc_iter ll_iocontrol_call(struct inode *inode, struct file *file,
2637                         unsigned int cmd, unsigned long arg, int *rcp)
2638 {
2639         enum llioc_iter ret = LLIOC_CONT;
2640         struct llioc_data *data;
2641         int rc = -EINVAL, i;
2642
2643         cfs_down_read(&llioc.ioc_sem);
2644         cfs_list_for_each_entry(data, &llioc.ioc_head, iocd_list) {
2645                 for (i = 0; i < data->iocd_count; i++) {
2646                         if (cmd != data->iocd_cmd[i])
2647                                 continue;
2648
2649                         ret = data->iocd_cb(inode, file, cmd, arg, data, &rc);
2650                         break;
2651                 }
2652
2653                 if (ret == LLIOC_STOP)
2654                         break;
2655         }
2656         cfs_up_read(&llioc.ioc_sem);
2657
2658         if (rcp)
2659                 *rcp = rc;
2660         return ret;
2661 }